首先所有的包都應(yīng)該有一定的必要文檔,然后同樣重要的是對(duì)包的測(cè)試。
在第 3 章中提到了 Go 的測(cè)試工具 gotest, 我們已經(jīng)在 9.8 節(jié)中使用過(guò)了。這里我們會(huì)用更多的例子進(jìn)行詳細(xì)說(shuō)明。
名為 testing 的包被專(zhuān)門(mén)用來(lái)進(jìn)行自動(dòng)化測(cè)試,日志和錯(cuò)誤報(bào)告。并且還包含一些基準(zhǔn)測(cè)試函數(shù)的功能。
備注:gotest 是 Unix bash 腳本,所以在 Windows 下你需要配置 MINGW 環(huán)境(參見(jiàn) 2.5 節(jié));在 Windows 環(huán)境下把所有的 pkg/linux_amd64 替換成 pkg/windows。
對(duì)一個(gè)包做(單元)測(cè)試,需要寫(xiě)一些可以頻繁(每次更新后)執(zhí)行的小塊測(cè)試單元來(lái)檢查代碼的正確性。于是我們必須寫(xiě)一些 Go 源文件來(lái)測(cè)試代碼。測(cè)試程序必須屬于被測(cè)試的包,并且文件名滿足這種形式 *_test.go
,所以測(cè)試代碼和包中的業(yè)務(wù)代碼是分開(kāi)的。
_test
程序不會(huì)被普通的 Go 編譯器編譯,所以當(dāng)放應(yīng)用部署到生產(chǎn)環(huán)境時(shí)它們不會(huì)被部署;只有 gotest 會(huì)編譯所有的程序:普通程序和測(cè)試程序。
測(cè)試文件中必須導(dǎo)入 "testing" 包,并寫(xiě)一些名字以 TestZzz
打頭的全局函數(shù),這里的 Zzz
是被測(cè)試函數(shù)的字母描述,如 TestFmtInterface,TestPayEmployees 等。
測(cè)試函數(shù)必須有這種形式的頭部:
func TestAbcde(t *testing.T)
T 是傳給測(cè)試函數(shù)的結(jié)構(gòu)類(lèi)型,用來(lái)管理測(cè)試狀態(tài),支持格式化測(cè)試日志,如 t.Log,t.Error,t.ErrorF 等。在函數(shù)的結(jié)尾把輸出跟想要的結(jié)果對(duì)比,如果不等就打印一個(gè)錯(cuò)誤。成功的測(cè)試則直接返回。
用下面這些函數(shù)來(lái)通知測(cè)試失?。?/p>
1)func (t *T) Fail()
標(biāo)記測(cè)試函數(shù)為失敗,然后繼續(xù)執(zhí)行(剩下的測(cè)試)。
2)func (t *T) FailNow()
標(biāo)記測(cè)試函數(shù)為失敗并中止執(zhí)行;文件中別的測(cè)試也被略過(guò),繼續(xù)執(zhí)行下一個(gè)文件。
3)func (t *T) Log(args ...interface{})
args 被用默認(rèn)的格式格式化并打印到錯(cuò)誤日志中。
4)func (t *T) Fatal(args ...interface{})
結(jié)合 先執(zhí)行 3),然后執(zhí)行 2)的效果。
運(yùn)行 go test 來(lái)編譯測(cè)試程序,并執(zhí)行程序中所有的 TestZZZ 函數(shù)。如果所有的測(cè)試都通過(guò)會(huì)打印出 PASS。
gotest 可以接收一個(gè)或多個(gè)函數(shù)程序作為參數(shù),并指定一些選項(xiàng)。
結(jié)合 --chatty 或 -v 選項(xiàng),每個(gè)執(zhí)行的測(cè)試函數(shù)以及測(cè)試狀態(tài)會(huì)被打印。
例如:
go test fmt_test.go --chatty
=== RUN fmt.TestFlagParser
--- PASS: fmt.TestFlagParser
=== RUN fmt.TestArrayPrinter
--- PASS: fmt.TestArrayPrinter
...
testing 包中有一些類(lèi)型和函數(shù)可以用來(lái)做簡(jiǎn)單的基準(zhǔn)測(cè)試;測(cè)試代碼中必須包含以 BenchmarkZzz
打頭的函數(shù)并接收一個(gè) *testing.B
類(lèi)型的參數(shù),比如:
func BenchmarkReverse(b *testing.B) {
...
}
命令 go test –test.bench=.*
會(huì)運(yùn)行所有的基準(zhǔn)測(cè)試函數(shù);代碼中的函數(shù)會(huì)被調(diào)用 N 次(N是非常大的數(shù),如 N = 1000000),并展示 N 的值和函數(shù)執(zhí)行的平均時(shí)間,單位為 ns(納秒,ns/op)。如果是用 testing.Benchmark 調(diào)用這些函數(shù),直接運(yùn)行程序即可。
具體可以參見(jiàn) 14.16 節(jié)中用 goroutines 運(yùn)行基準(zhǔn)測(cè)試的例子以及練習(xí) 13.4:string_reverse_test.go