欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang testing使用示例小結(jié)

 更新時(shí)間:2024年05月13日 11:55:33   作者:動(dòng)態(tài)一時(shí)爽,重構(gòu)火葬場(chǎng)  
golang自帶了testing測(cè)試包,使用該包可以進(jìn)行自動(dòng)化的單元測(cè)試,輸出結(jié)果驗(yàn)證,并且可以測(cè)試性能,下面通過示例代碼給大家講解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 testgo 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)文章

  • Gin框架之參數(shù)綁定的實(shí)現(xiàn)

    Gin框架之參數(shù)綁定的實(shí)現(xiàn)

    為了能夠更方便的獲取請(qǐng)求相關(guān)參數(shù),提高開發(fā)效率,本文主要介紹了Gin框架之參數(shù)綁定的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Golang為什么占用那么多的虛擬內(nèi)存原理解析

    Golang為什么占用那么多的虛擬內(nèi)存原理解析

    這篇文章主要介紹了Golang為什么占用那么多的虛擬內(nèi)存原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Golang中Interface接口的三個(gè)特性

    Golang中Interface接口的三個(gè)特性

    本文詳細(xì)講解了Golang中Interface接口的三個(gè)特性,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 重學(xué)Go語言之JSON操作詳解

    重學(xué)Go語言之JSON操作詳解

    JSON的全稱是Javascript?Object?Notation,是一種數(shù)據(jù)結(jié)構(gòu)化交互的標(biāo)準(zhǔn)協(xié)議,這篇文章主要是來和大家介紹一下Go語言中JSON的相關(guān)操作,需要的可以參考下
    2023-08-08
  • 超詳細(xì)Go語言中JSON處理技巧分享

    超詳細(xì)Go語言中JSON處理技巧分享

    這篇文章主要為大家總結(jié)了go語言中對(duì)JSON數(shù)據(jù)結(jié)構(gòu)和結(jié)構(gòu)體之間相互轉(zhuǎn)換問題及解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • viper配置框架的介紹支持zookeeper的讀取和監(jiān)聽

    viper配置框架的介紹支持zookeeper的讀取和監(jiān)聽

    這篇文章主要介紹了viper配置框架的介紹支持zookeeper的讀取和監(jiān)聽,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Go語言中嵌入式緩存庫的用法詳解

    Go語言中嵌入式緩存庫的用法詳解

    Go?語言中有一些非常高效的嵌入式緩存庫,groupcache?和?bigcache?是兩個(gè)非常流行且高性能的庫,本文將詳細(xì)介紹一下二者的用法,有需要的小伙伴可以參考下
    2025-01-01
  • 淺談go中cgo的幾種使用方式

    淺談go中cgo的幾種使用方式

    本文主要介紹了淺談go中cgo的幾種使用方式,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Golang易錯(cuò)知識(shí)點(diǎn)匯總

    Golang易錯(cuò)知識(shí)點(diǎn)匯總

    這篇文章匯總了在開發(fā)和刷面試題過程中遇到的Golang容易搞錯(cuò)的知識(shí)點(diǎn),關(guān)鍵部分也都為大家寫了代碼示例,感興趣的小伙伴可以了解一下
    2022-09-09
  • golang中validator包的使用教程

    golang中validator包的使用教程

    Validator 實(shí)際上是一個(gè)驗(yàn)證工具,屬于 golang 的第三方包,這個(gè)包中使用了各種反射技巧來提供了各種校驗(yàn)和約束數(shù)據(jù)的方式方法,下面就跟隨小編一起來學(xué)習(xí)一下validator包的使用吧
    2023-09-09

最新評(píng)論