您好,登錄后才能下訂單哦!
這篇文章主要講解了“Golang單元測試中的技巧是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Golang單元測試中的技巧是什么”吧!
當我們在編寫單元測試的時候,有時我們非常想 mock 掉其中一個方法,但是這個方法又沒有接口去定義和實現(無法用 github.com/golang/mock
來實現),這時就可以嘗試看看我們的打樁黑科技。
這里我們使用 github.com/agiledragon/gomonkey 來實現。
實際中,經常在代碼中會遇到一些隨機值的情況,比如驗證碼。為了方便測試,我們會想要 mock 掉隨機值方法,讓每次產生的值固定方便后續的測試。
package main import ( "fmt" "testing" "github.com/agiledragon/gomonkey/v2" "go-demo/m/unit-test/other/rand" ) func init() { gomonkey.ApplyFunc(rand.Number, func() int { return 666 }) } func TestRand(t *testing.T) { fmt.Println(rand.Number()) }
其中 rand.Number()
是我們在另一個包中實現的方法。我們使用 gomonkey.ApplyFunc
相當于直接替換了原有方法的實現,強制返回了 mock 的數據 666。
使用 gomonkey
時,注意一定要使用 -gcflags=all=-l
來禁止內聯優化,否則容易導致打樁不生效。如:go test -gcflags=all=-l -v
在 Mac 的 M1 下打樁不生效,可以使用環境變量 GOARCH=amd64
來進行測試,只不過這樣就無法進行斷點調試。https://github.com/agiledragon/gomonkey/issues/77
畢竟是黑科技,實際使用環境對于測試還是有影響的。
這里的壓測通常不是對接口的壓測,而是對于某些方法的壓測。Golang 提供 非常好用的 b *testing.B
來專門進行壓測。
非常容易上手,讓我們直接來看代碼
var numbers = []int{ 100, 1000, 77777, 666666, } func BenchmarkPrimeNumbers(b *testing.B) { for _, v := range numbers { b.Run(fmt.Sprintf("calc_num_%d", v), func(b *testing.B) { for i := 0; i < b.N; i++ { primeNumbers(v) } }) } }
使用 -bench=.
即可
? go test -bench=. b_test.go
goos: darwin
goarch: arm64
BenchmarkPrimeNumbers/calc_num_100-8 3391329 348.9 ns/op
BenchmarkPrimeNumbers/calc_num_1000-8 293733 3979 ns/op
BenchmarkPrimeNumbers/calc_num_77777-8 730 1619089 ns/op
BenchmarkPrimeNumbers/calc_num_666666-8 42 28509805 ns/op
PASS
ok command-line-arguments 5.846s
可以看到次數和耗時,這樣的數據經常會被貼在開源項目README的性能比較板塊中。
單元測試當然少不了覆蓋率咯,看著高高的覆蓋率才有成就感對不對?
我們可以使用 -cover
參數來統計單元測試的代碼覆蓋率
? go test -cover .
ok go-demo/m/unit-test/service 0.879s coverage: 70.0% of statements
還可以生成 profile 然后通過可視化網頁查看分析
? go test ./... -coverprofile=cover.out
ok go-demo/m/unit-test/service 0.108s coverage: 70.0% of statements
? go tool cover -html=cover.out
當然,如果你和我一樣使用 goland 進行開發,可以直接在界面上點擊單元測試,就可以快速進行覆蓋率測試,并且展示也很方便,很快能看到有哪些代碼沒有被測試覆蓋。
TDT 的提出也算是給單元測試提供了一條不錯的思路。主要的形式就是將測試的數據做成類似表格,然后測試的時候遍歷所有的數據來進行測試,測試代碼不動,只需要增加測試數據就可以了。go 很多官方庫用了這樣的寫法來做測試。
package main import ( "testing" ) func TestAdd(t *testing.T) { tests := []struct { a, b, expected int }{ {1, 2, 3}, {0, 0, 0}, {-1, 1, 0}, {-1, -1, -2}, } for _, test := range tests { result := Add(test.a, test.b) if result != test.expected { t.Errorf("Add(%d, %d) = %d; expected %d", test.a, test.b, result, test.expected) } } } func Add(a, b int) int { return a + b }
我們可以通過 github.com/cweill/gotests 來幫助我們快速生成想要的表格驅動測試代碼
感謝各位的閱讀,以上就是“Golang單元測試中的技巧是什么”的內容了,經過本文的學習后,相信大家對Golang單元測試中的技巧是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。