最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2024年05月13日 11:55:33   作者:動態(tài)一時爽,重構(gòu)火葬場  
golang自帶了testing測試包,使用該包可以進行自動化的單元測試,輸出結(jié)果驗證,并且可以測試性能,下面通過示例代碼給大家講解golang testing使用示例小結(jié),感興趣的朋友一起看看吧

testing包服務于自動化測試

基本測試

Table Drvien Test

基于表的測試通過表形式進行測試每種情況的輸入和期望輸出,從而測試程序的正確性

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)
        }
    }
}
  • 跳過測試
    • SkipNow(): 跳過測試
    • Skip(): 跳過測試并輸出log
    • Skipf(): 跳過測試并格式化輸出log
  • 失敗但繼續(xù)
    • Fail(): 標記測試失敗,但繼續(xù)執(zhí)行
    • FailNow(): 標記測試失敗,不繼續(xù)執(zhí)行
    • Error(): 標記測試失敗,并輸出
    • Errorf(): 標記測試失敗,并格式化輸出
  • 輸出
    • Log(): 輸出
    • Logf(): 格式化輸出
  • 失敗且中斷
    • Fatal(): 相當于FailNow() + Log()
    • Fatalf(): 相當于FailNow() + Logf()

Parallel()

Parallel方法表示會和其他帶有Parallel方法的測試并行執(zhí)行

ExampleXXX()

ExampleXXX方法中如果含有Output: 開頭的行注釋,則會在運行測試期間,將輸出和注釋中的值相比較

如果是不確定的順序,則可以以Unordered output: 作為開頭

但如果沒有這樣的注釋,這就是一個普通函數(shù),不能被直接運行

壓力測試

壓力測試方法以func BenchmarkXXX(*testing.B)函數(shù)名展現(xiàn)。

函數(shù)體格式如下

func BenchmarkHello(b *testing.B) {
    for i := 0; i < b.N; i++ {
        // do sth
    }
}

壓力測試會自動調(diào)整b.N使得持續(xù)足夠長時間

重置計時器

如果想要跳過不需要計時的耗時工作,那么可以通過b.ResetTimer()重置計時器

并行測試

如果想并行壓力測試,那么可以通過RunParallel實現(xiàn)

func BenchmarkHelloParallel(b *testing.B) {
  b.RunParallel(func(pb *testing.PB) {
    // do sth
  })
}

內(nèi)存統(tǒng)計

ReportAllocs方法用于打開內(nèi)存統(tǒng)計功能

輸出結(jié)果就會變成如下形式

// 方法名        迭代總次數(shù)        平均每次迭代時間        平均每次迭代分配字節(jié)數(shù)        平均每次迭代的內(nèi)存分配次數(shù)
BenchmarkHello        2000000           898 ns/op         368 B/op           9 allocs/op

自定義度量值

ReportMetric(n float64, unit string)匯報自定義度量值

  • 如果度量值是每次迭代的,你應該將其除以 b.N。
  • 按照慣例,單位應該以 “/op” 結(jié)尾。
  • ReportMetric 會覆蓋同一單位的任何先前報告的值。如果單位是空字符串,或者單位包含任何空格,ReportMetric 會引發(fā) panic。
  • 如果單位是基準測試框架本身通常報告的單位(如 “allocs/op”),ReportMetric 會覆蓋該度量值。
  • 將 “ns/op” 設置為 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")
	})

子測試

子測試也就是可以在測試中測試,子測試可以共用初始化等公共操作,并可以做父測試執(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")
	})
}

模糊測試

模糊測試方法名為func FuzzXXX(f *testing.F)

func FuzzReverse(f *testing.F) {
  	// 為模糊測試添加用例到種子語料庫
    testcases := []string{"Hello, world", " ", "!12345"}
    for _, tc := range testcases {
        f.Add(tc)  // Use f.Add to provide a seed corpus
    }
  	// 進行模糊測試。對于string類型的參數(shù),將生成隨機字符串
  	// 對于本測試中的Reverse方法是可逆的,因此可以通過兩次逆行操作來驗證其正確性
    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)
        }
    })
}

運行模糊測試有go testgo test -fuzz兩種方式,前者僅會運行手動添加的用例,而后者則會隨機生成數(shù)據(jù)

值得注意的是如果go test -fuzz執(zhí)行之后存在運行錯誤的用例會添加到語料庫文件中,那么即使下次執(zhí)行的是go test也依然會執(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Goland編輯器設置選擇范圍背景色的操作

    Goland編輯器設置選擇范圍背景色的操作

    這篇文章主要介紹了Goland編輯器設置選擇范圍背景色的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang使用DockerFile正確用法指南

    golang使用DockerFile正確用法指南

    docker在開發(fā)和運維中使用的場景越來越多,作為開發(fā)人員非常有必要了解一些docker的基本知識,而離我們工作中最近的也就是對應用的docker部署編排了,這篇文章主要給大家介紹了關(guān)于golang使用DockerFile的正確用法指南,需要的朋友可以參考下
    2024-03-03
  • go:gin輸出日志文件方式

    go:gin輸出日志文件方式

    這篇文章主要介紹了go:gin輸出日志文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • golang jsoniter extension 處理動態(tài)字段的實現(xiàn)方法

    golang jsoniter extension 處理動態(tài)字段的實現(xiàn)方法

    這篇文章主要介紹了golang jsoniter extension 處理動態(tài)字段的實現(xiàn)方法,我們使用實例級別的 extension, 而非全局,可以針對不同業(yè)務邏輯有所區(qū)分,jsoniter 包提供了比較完善的定制能力,通過例子可以感受一下擴展性,需要的朋友可以參考下
    2023-04-04
  • Go從defer關(guān)鍵字到鎖用法實例demo

    Go從defer關(guān)鍵字到鎖用法實例demo

    在Go語言中,defer語句用于延遲執(zhí)行一個函數(shù)或方法,直到包含它的函數(shù)執(zhí)行完畢時才執(zhí)行,這篇文章主要介紹了Go從defer關(guān)鍵字到鎖用法的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-06-06
  • Golang定時器Timer與Ticker的使用詳解

    Golang定時器Timer與Ticker的使用詳解

    在 Go 里有很多種定時器的使用方法,像常規(guī)的 Timer、Ticker 對象,本文主要為大家介紹了Timer與Ticker的使用,感興趣的小伙伴可以了解一下
    2023-05-05
  • Go語言實現(xiàn)23種設計模式的使用

    Go語言實現(xiàn)23種設計模式的使用

    設計模式是軟件工程中各種常見問題的經(jīng)典解決方案,,本文主要介紹了Go語言實現(xiàn)23種設計模式的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • 夯實Golang基礎(chǔ)之數(shù)據(jù)類型梳理匯總

    夯實Golang基礎(chǔ)之數(shù)據(jù)類型梳理匯總

    這篇文章主要8為大家介紹了夯實Golang基礎(chǔ)之數(shù)據(jù)類型梳理匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-10-10
  • Go語言中你所不知道的位操作用法

    Go語言中你所不知道的位操作用法

    位運算可能在平常的編程中使用的并不多,但涉及到底層優(yōu)化,一些算法及源碼可能會經(jīng)常遇見。下面這篇文章主要給大家介紹了關(guān)于Go語言中你所不知道的位操作用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12
  • Go語言中的HTTP客戶端從標準庫到第三方庫

    Go語言中的HTTP客戶端從標準庫到第三方庫

    本文介紹了Go語言中的HTTP客戶端開發(fā),涵蓋標準庫和第三方庫使用、最佳實踐、高級功能、HTTP/2支持、安全考慮、性能優(yōu)化等內(nèi)容,通過本文,讀者可以構(gòu)建高效、可靠的HTTP客戶端應用
    2026-05-05

最新評論

平遥县| 安溪县| 永宁县| 濮阳市| 襄垣县| 崇文区| 玉山县| 镇安县| 长乐市| 隆林| 禄丰县| 漳平市| 涪陵区| 瓮安县| 台湾省| 西丰县| 南安市| 磴口县| 东城区| 江川县| 南溪县| 郸城县| 安阳县| 大丰市| 定兴县| 马尔康县| 荃湾区| 通海县| 汕尾市| 乐清市| 宝鸡市| 莱州市| 吉木萨尔县| 阳西县| 陵水| 监利县| 玛纳斯县| 如东县| 灵宝市| 西和县| 灌南县|