golang testing使用示例小結(jié)
testing包服務(wù)于自動(dòng)化測(cè)試
基本測(cè)試
Table Drvien Test
基于表的測(cè)試通過表形式進(jìn)行測(cè)試每種情況的輸入和期望輸出,從而測(cè)試程序的正確性
func TestFib(t *testing.T) { var fibTests = []struct { in int // input expected int // expected result }{ {1, 1}, {2, 1}, {3, 2}, {4, 3}, {5, 5}, {6, 8}, {7, 13}, } for _, tt := range fibTests { actual := Fib(tt.in) if actual != tt.expected { t.Errorf("Fib(%d) = %d; expected %d", tt.in, actual, tt.expected) } } }
- 跳過測(cè)試
- SkipNow(): 跳過測(cè)試
- Skip(): 跳過測(cè)試并輸出log
- Skipf(): 跳過測(cè)試并格式化輸出log
- 失敗但繼續(xù)
- Fail(): 標(biāo)記測(cè)試失敗,但繼續(xù)執(zhí)行
- FailNow(): 標(biāo)記測(cè)試失敗,不繼續(xù)執(zhí)行
- Error(): 標(biāo)記測(cè)試失敗,并輸出
- Errorf(): 標(biāo)記測(cè)試失敗,并格式化輸出
- 輸出
- Log(): 輸出
- Logf(): 格式化輸出
- 失敗且中斷
- Fatal(): 相當(dāng)于FailNow() + Log()
- Fatalf(): 相當(dāng)于FailNow() + Logf()
Parallel()
Parallel方法表示會(huì)和其他帶有Parallel方法的測(cè)試并行執(zhí)行
ExampleXXX()
ExampleXXX方法中如果含有Output:
開頭的行注釋,則會(huì)在運(yùn)行測(cè)試期間,將輸出和注釋中的值相比較
如果是不確定的順序,則可以以
Unordered output:
作為開頭
但如果沒有這樣的注釋,這就是一個(gè)普通函數(shù),不能被直接運(yùn)行
壓力測(cè)試
壓力測(cè)試方法以func BenchmarkXXX(*testing.B)
函數(shù)名展現(xiàn)。
函數(shù)體格式如下
func BenchmarkHello(b *testing.B) { for i := 0; i < b.N; i++ { // do sth } }
壓力測(cè)試會(huì)自動(dòng)調(diào)整b.N使得持續(xù)足夠長(zhǎng)時(shí)間
重置計(jì)時(shí)器
如果想要跳過不需要計(jì)時(shí)的耗時(shí)工作,那么可以通過b.ResetTimer()
重置計(jì)時(shí)器
并行測(cè)試
如果想并行壓力測(cè)試,那么可以通過RunParallel
實(shí)現(xiàn)
func BenchmarkHelloParallel(b *testing.B) { b.RunParallel(func(pb *testing.PB) { // do sth }) }
內(nèi)存統(tǒng)計(jì)
ReportAllocs
方法用于打開內(nèi)存統(tǒng)計(jì)功能
輸出結(jié)果就會(huì)變成如下形式
// 方法名 迭代總次數(shù) 平均每次迭代時(shí)間 平均每次迭代分配字節(jié)數(shù) 平均每次迭代的內(nèi)存分配次數(shù)
BenchmarkHello 2000000 898 ns/op 368 B/op 9 allocs/op
自定義度量值
ReportMetric(n float64, unit string)
匯報(bào)自定義度量值
- 如果度量值是每次迭代的,你應(yīng)該將其除以
b.N
。 - 按照慣例,單位應(yīng)該以 “/op” 結(jié)尾。
ReportMetric
會(huì)覆蓋同一單位的任何先前報(bào)告的值。如果單位是空字符串,或者單位包含任何空格,ReportMetric
會(huì)引發(fā) panic。- 如果單位是基準(zhǔn)測(cè)試框架本身通常報(bào)告的單位(如 “allocs/op”),
ReportMetric
會(huì)覆蓋該度量值。 - 將 “ns/op” 設(shè)置為 0 將禁止該內(nèi)置度量值。
testing.Benchmark(func(b *testing.B) { var compares int64 for i := 0; i < b.N; i++ { s := []int{5, 4, 3, 2, 1} sort.Slice(s, func(i, j int) bool { compares++ return s[i] < s[j] }) } // This metric is per-operation, so divide by b.N and // report it as a "/op" unit. b.ReportMetric(float64(compares)/float64(b.N), "compares/op") // This metric is per-time, so divide by b.Elapsed and // report it as a "/ns" unit. b.ReportMetric(float64(compares)/float64(b.Elapsed().Nanoseconds()), "compares/ns") })
子測(cè)試
子測(cè)試也就是可以在測(cè)試中測(cè)試,子測(cè)試可以共用初始化等公共操作,并可以做父測(cè)試執(zhí)行前的必要操作
func TestSubTest(t *testing.T) { t.Run("sub1", func(t *testing.T) { t.Log("sub1") }) t.Run("sub2", func(t *testing.T) { t.Log("sub2") }) t.Run("sub3", func(t *testing.T) { t.Log("sub3") }) }
模糊測(cè)試
模糊測(cè)試方法名為func FuzzXXX(f *testing.F)
func FuzzReverse(f *testing.F) { // 為模糊測(cè)試添加用例到種子語料庫 testcases := []string{"Hello, world", " ", "!12345"} for _, tc := range testcases { f.Add(tc) // Use f.Add to provide a seed corpus } // 進(jìn)行模糊測(cè)試。對(duì)于string類型的參數(shù),將生成隨機(jī)字符串 // 對(duì)于本測(cè)試中的Reverse方法是可逆的,因此可以通過兩次逆行操作來驗(yàn)證其正確性 f.Fuzz(func(t *testing.T, orig string) { rev := Reverse(orig) doubleRev := Reverse(rev) if orig != doubleRev { t.Errorf("Before: %q, after: %q", orig, doubleRev) } if utf8.ValidString(orig) && !utf8.ValidString(rev) { t.Errorf("Reverse produced invalid UTF-8 string %q", rev) } }) }
運(yùn)行模糊測(cè)試有go test
和go test -fuzz
兩種方式,前者僅會(huì)運(yùn)行手動(dòng)添加的用例,而后者則會(huì)隨機(jī)生成數(shù)據(jù)
值得注意的是如果go test -fuzz執(zhí)行之后存在運(yùn)行錯(cuò)誤的用例會(huì)添加到語料庫文件中,那么即使下次執(zhí)行的是go test也依然會(huì)執(zhí)行語料庫文件中的用例
Ref
https://go.dev/doc/tutorial/fuzz
https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter09/09.0.html
到此這篇關(guān)于golang testing使用的文章就介紹到這了,更多相關(guān)golang testing使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
viper配置框架的介紹支持zookeeper的讀取和監(jiān)聽
這篇文章主要介紹了viper配置框架的介紹支持zookeeper的讀取和監(jiān)聽,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05