یکی از اجزای مهم یک نرمافزار آزمایش کردن (Testing) آن است. دو روش معمول برای Testing برنامههای نوشته شده تحت وب به زبان Go وجود دارد. اولین روش با حس و حال unit-test میباشد. دیگری بنام روش end-to-end معروف است. در این پست ما هر دو روش را بررسی میکنیم.
Unit Testing
آزمایش واحد به ما این اجازه را میدهد که در وب یک http.HandlerFunc را بطور مستقیم و بدون واسط (middleware) مورد آزمون قرار بدهیم. حال که برنامه ما در فایل main.go بصورت فوق میباشد:
یک فایل Test بصورت زیر میباشد و اینطور میباشد که نام آن باید همانند نام فایل مورد آزمون قرار گرفته باشد و در آخر آن test_ اضافه شده باشد. همچنین هر دو فایل ( فایل اصلی و Test) باید در یک پوشه باشند. در این مثال فایل Test ما با نام main_test.go با محتوای فوق ذخیره میشود:
این نوع آزمایش به ما امکان میدهد که یک چرخه کامل را درون نرمافزار آزمایش کنیم. در حالی که Unit-Testing یک تابع خاص را چک خواهد کرد. همچنین این روش Test واسط های نرمافزار، Routerها و سایر قسمتهایی که در طول یک درخواست درگیر خواهند بود آزمایش میکند. اگر برنامه اصلی ما به این صورت باشد:
package main
import (
"fmt"
"net/http"
"github.com/codegangsta/negroni"
"github.com/julienschmidt/httprouter"
)
func HelloWorld(res http.ResponseWriter, req *http.Request, p httprouter.Params) {
fmt.Fprint(res, "Hello World")
}
func App() http.Handler {
n := negroni.Classic()
m := func(res http.ResponseWriter, req *http.Request, next http.HandlerFunc) {
fmt.Fprint(res, "Before...")
next(res, req)
fmt.Fprint(res, "...After")
}
n.Use(negroni.HandlerFunc(m))
r := httprouter.New()
r.GET("/", HelloWorld)
n.UseHandler(r)
return n
}
func main() {
http.ListenAndServe(":3000", App())
}
فایل حاوی محتوای Test به صورت فوق خواهد بود. توجه داشته باشید که فایل main_test.go در کنار فایل main.go در پوشهای مشترک قرار میگیرند.