Golang單元測(cè)試中的技巧分享
打樁測(cè)試
當(dāng)我們?cè)诰帉憜卧獪y(cè)試的時(shí)候,有時(shí)我們非常想 mock 掉其中一個(gè)方法,但是這個(gè)方法又沒(méi)有接口去定義和實(shí)現(xiàn)(無(wú)法用 github.com/golang/mock 來(lái)實(shí)現(xiàn)),這時(shí)就可以嘗試看看我們的打樁黑科技。
代碼
這里我們使用 github.com/agiledragon/gomonkey 來(lái)實(shí)現(xiàn)。
實(shí)際中,經(jīng)常在代碼中會(huì)遇到一些隨機(jī)值的情況,比如驗(yàn)證碼。為了方便測(cè)試,我們會(huì)想要 mock 掉隨機(jī)值方法,讓每次產(chǎn)生的值固定方便后續(xù)的測(cè)試。
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() 是我們?cè)诹硪粋€(gè)包中實(shí)現(xiàn)的方法。我們使用 gomonkey.ApplyFunc 相當(dāng)于直接替換了原有方法的實(shí)現(xiàn),強(qiáng)制返回了 mock 的數(shù)據(jù) 666。
注意事項(xiàng)
- 使用
gomonkey時(shí),注意一定要使用-gcflags=all=-l來(lái)禁止內(nèi)聯(lián)優(yōu)化,否則容易導(dǎo)致打樁不生效。如:go test -gcflags=all=-l -v - 在 Mac 的 M1 下打樁不生效,可以使用環(huán)境變量
GOARCH=amd64來(lái)進(jìn)行測(cè)試,只不過(guò)這樣就無(wú)法進(jìn)行斷點(diǎn)調(diào)試。https://github.com/agiledragon/gomonkey/issues/77 - 畢竟是黑科技,實(shí)際使用環(huán)境對(duì)于測(cè)試還是有影響的。
壓測(cè)
這里的壓測(cè)通常不是對(duì)接口的壓測(cè),而是對(duì)于某些方法的壓測(cè)。Golang 提供 非常好用的 b *testing.B 來(lái)專門進(jìn)行壓測(cè)。
代碼
非常容易上手,讓我們直接來(lái)看代碼
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
可以看到次數(shù)和耗時(shí),這樣的數(shù)據(jù)經(jīng)常會(huì)被貼在開源項(xiàng)目README的性能比較板塊中。
測(cè)試覆蓋率
單元測(cè)試當(dāng)然少不了覆蓋率咯,看著高高的覆蓋率才有成就感對(duì)不對(duì)?
我們可以使用 -cover 參數(shù)來(lái)統(tǒng)計(jì)單元測(cè)試的代碼覆蓋率
? go test -cover .
ok go-demo/m/unit-test/service 0.879s coverage: 70.0% of statements
還可以生成 profile 然后通過(guò)可視化網(wǎng)頁(yè)查看分析
? 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
當(dāng)然,如果你和我一樣使用 goland 進(jìn)行開發(fā),可以直接在界面上點(diǎn)擊單元測(cè)試,就可以快速進(jìn)行覆蓋率測(cè)試,并且展示也很方便,很快能看到有哪些代碼沒(méi)有被測(cè)試覆蓋。


表格驅(qū)動(dòng)測(cè)試
TDT 的提出也算是給單元測(cè)試提供了一條不錯(cuò)的思路。主要的形式就是將測(cè)試的數(shù)據(jù)做成類似表格,然后測(cè)試的時(shí)候遍歷所有的數(shù)據(jù)來(lái)進(jìn)行測(cè)試,測(cè)試代碼不動(dòng),只需要增加測(cè)試數(shù)據(jù)就可以了。go 很多官方庫(kù)用了這樣的寫法來(lái)做測(cè)試。
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
}我們可以通過(guò) github.com/cweill/gotests 來(lái)幫助我們快速生成想要的表格驅(qū)動(dòng)測(cè)試代碼
到此這篇關(guān)于Golang單元測(cè)試中的技巧分享的文章就介紹到這了,更多相關(guān)Golang單元測(cè)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 深入理解Golang的單元測(cè)試和性能測(cè)試
- Golang單元測(cè)試與覆蓋率的實(shí)例講解
- golang 對(duì)私有函數(shù)進(jìn)行單元測(cè)試的實(shí)例
- GOLang單元測(cè)試用法詳解
- Golang使用ChatGPT生成單元測(cè)試實(shí)踐
- Golang?單元測(cè)試和基準(zhǔn)測(cè)試實(shí)例詳解
- Golang測(cè)試框架goconvey進(jìn)行單元測(cè)試流程介紹
- Golang實(shí)現(xiàn)單元測(cè)試中的接口層
- 詳解Golang中單元測(cè)試的使用
- Go語(yǔ)言:打造優(yōu)雅數(shù)據(jù)庫(kù)單元測(cè)試的實(shí)戰(zhàn)指南
相關(guān)文章
Go語(yǔ)言實(shí)現(xiàn)并發(fā)控制的常見方式詳解
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)并發(fā)控制的幾種常見方式,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2024-03-03
golang如何實(shí)現(xiàn)mapreduce單進(jìn)程版本詳解
這篇文章主要給大家介紹了關(guān)于golang如何實(shí)現(xiàn)mapreduce單進(jìn)程版本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
Golang連接并操作PostgreSQL數(shù)據(jù)庫(kù)基本操作
PostgreSQL是常見的免費(fèi)的大型關(guān)系型數(shù)據(jù)庫(kù),具有豐富的數(shù)據(jù)類型,也是軟件項(xiàng)目常用的數(shù)據(jù)庫(kù)之一,下面這篇文章主要給大家介紹了關(guān)于Golang連接并操作PostgreSQL數(shù)據(jù)庫(kù)基本操作的相關(guān)資料,需要的朋友可以參考下2022-09-09
go語(yǔ)言實(shí)現(xiàn)短信發(fā)送實(shí)例探究
這篇文章主要為大家介紹了go語(yǔ)言實(shí)現(xiàn)短信發(fā)送實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

