- Distributed Computing with Go
- V.N. Nikhil Anurag
- 374字
- 2021-06-24 18:36:09
nil_test.go
We can also create tests that are not specific to any particular source file; the only criteria is that the filename needs to have the <text>_test.go form. The tests in nil_test.go elucidate on some useful features of the language which the developer might find useful while writing tests. They are as follows:
- httptest.NewServer: Imagine the case where we have to test our code against a server that sends back some data. Starting and coordinating a full blown server to access some data is hard. The http.NewServer solves this issue for us.
- t.Helper: If we use the same logic to pass or fail a lot of testCases, it would make sense to segregate this logic into a separate function. However, this would skew the test run call stack. We can see this by commenting t.Helper() in the tests and rerunning go test.
We can also format our command-line output to print pretty results. We will show a simple example of adding a tick mark for passed cases and cross mark for failed cases.
In the test, we will run a test server, make GET requests on it, and then test the expected output versus actual output:
// nil_test.go package main import ( "fmt" "io/ioutil" "net/http" "net/http/httptest" "testing" ) const passMark = "\u2713" const failMark = "\u2717" func assertResponseEqual(t *testing.T, expected string, actual string) { t.Helper() // comment this line to see tests fail due to 'if expected != actual' if expected != actual { t.Errorf("%s != %s %s", expected, actual, failMark) } else { t.Logf("%s == %s %s", expected, actual, passMark) } } func TestServer(t *testing.T) { testServer := httptest.NewServer( http.HandlerFunc( func(w http.ResponseWriter, r *http.Request) { path := r.RequestURI if path == "/1" { w.Write([]byte("Got 1.")) } else { w.Write([]byte("Got None.")) } })) defer testServer.Close() for _, testCase := range []struct { Name string Path string Expected string }{ {"Request correct URL", "/1", "Got 1."}, {"Request incorrect URL", "/12345", "Got None."}, } { t.Run(testCase.Name, func(t *testing.T) { res, err := http.Get(testServer.URL + testCase.Path) if err != nil { t.Fatal(err) } actual, err := ioutil.ReadAll(res.Body) res.Body.Close() if err != nil { t.Fatal(err) } assertResponseEqual(t, testCase.Expected, fmt.Sprintf("%s", actual)) }) }
t.Run("Fail for no reason", func(t *testing.T) {
assertResponseEqual(t, "+", "-")
})
}
推薦閱讀
- pcDuino開(kāi)發(fā)實(shí)戰(zhàn)
- Modern Web Testing with TestCafe
- Windows Vista基礎(chǔ)與應(yīng)用精品教程
- 發(fā)布!設(shè)計(jì)與部署穩(wěn)定的分布式系統(tǒng)(第2版)
- 網(wǎng)絡(luò)操作系統(tǒng):Windows Server 2003管理與應(yīng)用
- UNIX操作系統(tǒng)設(shè)計(jì)
- 白話區(qū)塊鏈
- Instant Handlebars.js
- Mastering KVM Virtualization
- 嵌入式Linux驅(qū)動(dòng)程序和系統(tǒng)開(kāi)發(fā)實(shí)例精講
- 循序漸進(jìn)學(xué)Docker
- 8051軟核處理器設(shè)計(jì)實(shí)戰(zhàn)
- Windows 7使用詳解(修訂版)
- Linux從入門(mén)到精通(視頻教學(xué)版)
- Docker容器技術(shù)與應(yīng)用