مرا اسکن کن!

unit testing در زبان golang

unit testing در زبان golang



یکی از اجزای مهم یک نرم‌افزار آزمایش کردن (Testing) آن است. دو روش معمول برای Testing برنامه‌های نوشته شده تحت وب به زبان Go وجود دارد. اولین روش با حس و حال unit-test می‌باشد. دیگری بنام روش end-to-end معروف است. در این پست ما هر دو روش را بررسی می‌کنیم.

Unit Testing

آزمایش واحد به ما این اجازه را می‌دهد که در وب یک http.HandlerFunc را بطور مستقیم و بدون واسط (middleware) مورد آزمون قرار بدهیم. حال که برنامه ما در فایل main.go بصورت فوق می‌باشد:

package main

import (
    "fmt"
    "net/http"
)

func HelloWorld(res http.ResponseWriter, req *http.Request) {
    fmt.Fprint(res, "Hello World")
}

func main() {
    http.HandleFunc("/", HelloWorld)
    http.ListenAndServe(":3000", nil)
}

 

یک فایل Test بصورت زیر می‌باشد و اینطور می‌باشد که نام آن باید همانند نام فایل مورد آزمون قرار گرفته باشد و در آخر آن test_ اضافه شده باشد. همچنین هر دو فایل ( فایل اصلی و Test) باید در یک پوشه باشند. در این مثال فایل Test ما با نام main_test.go با محتوای فوق ذخیره می‌شود:

package main

import (
    "net/http"
    "net/http/httptest"
    "testing"
)

func Test_HelloWorld(t *testing.T) {
    req, err := http.NewRequest("GET", "http://example.com/foo", nil)
    if err != nil {
        t.Fatal(err)
    }

    res := httptest.NewRecorder()
    HelloWorld(res, req)

    exp := "Hello World"
    act := res.Body.String()
    if exp != act {
        t.Fatalf("Expected %s gog %s", exp, act)
    }
}

 

حال دستور اجرای Test را بصورت زیر اعمال کنید:

$ go test

 

نتیجه به این صورت خواهد بود:

PASS
ok  	project	0.009s

 

End To End Testing

این نوع آزمایش به ما امکان میدهد که یک چرخه کامل را درون نرم‌افزار آزمایش کنیم. در حالی که 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 در پوشه‌ای مشترک قرار می‌گیرند.

حال دستور اجرای Test را بصورت زیر اعمال کنید:

$ go test

 


نوشته شده توسط :

وحید صمدیان وحید صمدیان



دوشنبه, 2 مهر 1397

تعداد بازديد : 639

برچسب ها : GOLANG

3.0 ستاره