Go test 的測試用例形式
測試用例有四種形式:
- TestXxxx(t *testing.T) // 基本測試用例
- BenchmarkXxxx(b *testing.B) // 壓力測試的測試用例
- Example_Xxx() // 測試控制臺輸出的例子
- TestMain(m *testing.M) // 測試Main函數(shù)
Go test 有兩種運(yùn)行模式:
1、本地目錄模式,在沒有包參數(shù)(例如 go test 或 go test -v)調(diào)用時發(fā)生。在此模式下,go test 編譯當(dāng)前目錄中找到的包和測試,然后運(yùn)行測試二進(jìn)制文件。在這種模式下,caching 是禁用的。在包測試完成后,go test 打印一個概要行,顯示測試狀態(tài)、包名和運(yùn)行時間。
2、包列表模式,在使用顯示包參數(shù)調(diào)用 go test 時發(fā)生(例如 go test math,go test ./... 甚至是 go test .)。在此模式下,go 測試編譯并測試在命令上列出的每個包。如果一個包測試通過,go test 只打印最終的 ok 總結(jié)行。如果一個包測試失敗,go test 將輸出完整的測試輸出。如果使用 -bench 或 -v 標(biāo)志,則 go test 會輸出完整的輸出,甚至是通過包測試,以顯示所請求的基準(zhǔn)測試結(jié)果或詳細(xì)日志記錄。
go test 的變量有哪些?
- test.short : 一個快速測試的標(biāo)記,在測試用例中可以使用 testing.Short() 來繞開一些測試
- test.outputdir : 輸出目錄
- test.coverprofile : 測試覆蓋率參數(shù),指定輸出文件
- test.run : 指定正則來運(yùn)行某個/某些測試用例
- test.memprofile : 內(nèi)存分析參數(shù),指定輸出文件
- test.memprofilerate : 內(nèi)存分析參數(shù),內(nèi)存分析的抽樣率
- test.cpuprofile : cpu分析輸出參數(shù),為空則不做cpu分析
- test.blockprofile : 阻塞事件的分析參數(shù),指定輸出文件
- test.blockprofilerate : 阻塞事件的分析參數(shù),指定抽樣頻率
- test.timeout : 超時時間
- test.cpu : 指定cpu數(shù)量
- test.parallel : 指定運(yùn)行測試用例的并行數(shù)
Go test flag
- -args
- -c
- -exec xprog
- -i
- -o file
- -bench regexp
- -benchtime t
- -count n
- -cover
- -covermode set,count,atomic
- -coverpkg pkg1,pkg2,pkg3
- -cpu 1,2,4
- -list regexp
- -parallel n
- -run regexp
- -short
- -timeout d
- -v
- -benchmem
- -blockprofile block.out
- -blockprofilerate n
- -coverprofile cover.out
- -cpuprofile cpu.out
- -memprofile mem.out
- -memprofilerate n
- -mutexprofile mutex.out
- -mutexprofilefraction n
- -outputdir directory
- -trace trace.out
更多中文文檔:
- Go testing 源碼中文文檔:http://cngolib.com/testing.html
- Godoc 中文文檔:https://studygolang.com/pkgdoc
什么是單元測試?
單元測試,是一種測試我們的代碼邏輯有沒有問題,有沒有按照我們所期望的來運(yùn)行,通過它來保證我們的代碼質(zhì)量。
顧名思義,單元測試,大多都是對某一個函數(shù)方法進(jìn)行的測試,以讓我們的測試粒度最細(xì)。
如何編寫單元測試?
go test
可以測試 func TestXxx(*testing.T)
子測試
- https://blog.golang.org/subtests
- http://blog.studygolang.com/2017/07/subtests/
- https://blog.golang.org/subtests
如何跳過一些測試
https://stackoverflow.com/questions/24030059/skip-some-tests-with-go-test
什么是基準(zhǔn)測試?
基準(zhǔn)測試,是一種測試代碼執(zhí)行性能的方式,你可以將多種代碼實(shí)現(xiàn)進(jìn)行比對。
基準(zhǔn)測試主要是通過測試 CPU (go test -bench . -test.cpuprofile) 和內(nèi)存 (go test -bench . --benchmem) 的分配,來展示被測試代碼的性能,進(jìn)而找到性能更優(yōu)的解決方案。
如何編寫基準(zhǔn)測試?
func BenchmarkXXX(b *testing.B) { }
什么是 HTTP 測試?
顧名思義,就是測試 web http 協(xié)議的測試。
如何編寫 HTTP 測試?
Go 標(biāo)準(zhǔn)庫為我們提供了一個 httptest 的庫,通過它就能夠輕松的完成 HTTP 的測試。
什么是測試覆蓋率?
由單元測試的代碼,觸發(fā)運(yùn)行到的被測試代碼的代碼行數(shù)占所有代碼行數(shù)的比例,被稱為測試覆蓋率,代碼覆蓋率不一定完全精準(zhǔn),但是可以作為參考,可以幫我們測量和我們預(yù)計的覆蓋率之間的差距。
go test 工具就為我們提供了一個度量測試覆蓋率的能力。
go test -v -coverprofile=c.out
再通過 go tool 來將 c.out 轉(zhuǎn)換成 html 格式的測試覆蓋率報告。
go tool cover -html=c.out -o=tag.html
其他更多,可以參考:測試
# 生成指定 package 的測試覆蓋率(fib.out 后面不帶參數(shù)的,默認(rèn)是命令所在目錄)
$ go test -v -covermode=count -coverprofile fib.out
# 查看匯總的 fib 測試覆蓋率
$ go tool cover -func=fib.out
# 生成 html
$ go tool cover -html=fib.out -o fib.html
VSCode Go Test Coverage 插件
Go Coverage Viewer is the simplest way to view your code coverage results right inside the editor
測試比較工具
- benchcmp
- benchviz