亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang單元測試和基準測試怎么實現

發布時間:2022-08-24 14:04:42 來源:億速云 閱讀:156 作者:iii 欄目:開發技術

這篇文章主要講解了“Golang單元測試和基準測試怎么實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Golang單元測試和基準測試怎么實現”吧!

Go 單元測試

Go 語言提供了單元測試的框架,只要遵循其規則即可:

測試文件命名:

  • 單元測試的代碼文件都必須以 _test.go 結尾,這樣才能被 Go 語言測試工具識別

  • 單元測試的文件命名都與被測試函數所在的 go 文件的文件名一樣,然后再加 _test.go。比如 main.go 的測試文件 main_test.go

測試函數命名:

  • 單元測試的函數名必須以 Test 開頭,再加上要測試函數名,且必須是公有的。比如main.go中有函數 func add(){},   其函數名應為 TestAdd

  • 測試函數的簽名必須接收一個指向 testing.T 類型的指針,并且不能返回任何值

# main.go
func Add(){
    // to do something
}
# main_test.go
func TestAdd(t *testing.T) {
    result := Add()
    if result == 3 {
        println("success")
    } else {
        println("error")
    }
}

根據以上規則,就可以進行對某測試文件執行命令,進行單元測試:

go test -v ./main_test.go

如果顯示的測試結果有 PASS 標記,說明單元測試通過。

單元測試覆蓋率

函數是否被全面測試,還需要覆蓋率進行檢測。單元測試命令增加 --coverprofile 標記,就可以得到一個單元測試覆蓋文件,且會在控制臺打印出代碼覆蓋率是多少。

go test -v --coverprofile=main.cover ./main_test.go

Go 框架還可以生成 html 文件的覆蓋率報告,這樣就可以對單元測試覆蓋率的結果更清晰,更明白。

go tool cover -html=main.cover -o=main.html

打開 html 文件就可以看到紅色標記是沒有被覆蓋到,綠色是被測試到的。

以上是簡單的功能的單元測試,驗證功能邏輯的正確。但有時候還有性能的要求,這時就可以使用基準測試來評估代碼的性能。

基準測試

基準測試是一項用于測試和評估軟件性能指標的方法,主要測試代碼的性能。基準測試的規則和單元測試的規則是不一樣的:

  • 基準測試函數必須以 Benchmark 開頭,且必須是可導出的

  • 函數的簽名必須接收一個指向 testing.B 類型的指針,并且不能返回任何值;

  • 最后的 for 循環很重要,被測試的代碼要放到循環里;

  • b.N 是基準測試框架提供的,表示循環的次數,因為需要反復調用測試的代碼,才可以評估性能。

Golang單元測試和基準測試怎么實現

func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add()
    }
}

寫完基準測試,就可以執行命令進行測試:

go test -bench=. ./

使用 go test 命令,再加上 -bench 這個 Flag,它接受一個表達式作為參數,以匹配基準測試的函數,"."表示運行所有基準測試。

Golang單元測試和基準測試怎么實現

BenchmarkAdd-10, 其中的 -10 是運行基準測試時對應的 GOMAXPROCS 的值。基準測試的時間默認是 1 秒,也就是 1 秒調用 1000000000 次、每次調用花費 311 納秒。如果想讓測試運行的時間更長,可以通過 -benchtime 指定,比如 3 秒。

go test -bench=. -benchtime=3s ./
  • 重置計時方法

進行基準測試之前,需要進行一些數據準備,如構建測試數據,而這部分準備工作不屬于性能測試計算范圍內所以需要排除在外。通過使用充值計數器 ResetTimer重新計算。也支持使用 StartTimer 和 StopTimer 方法,控制何時開始計時何時結束。

  • 內存統計

內存統計主要是統計每次操作分配內存的次數和分配的字節數。使用 ReportAllocs() 方法

func BenchmarkAdd(b *testing.B) {
    b.ResetTimer() // 重置計時時間
    b.ReportAllocs() // 內存統計
    for i := 0; i < b.N; i++ {
        Add()
    }
}

對以上命令執行后可在控制臺上得到結果。多了兩個指標。

  • 第一個表示:每次操作分配多少字節內存

  • 第二個表示:每次操作分配內存的次數

Golang單元測試和基準測試怎么實現

兩個指標沒有統一標準區說明越小越好還是越大越好,主要還是需要根據業務場景來判斷的。

  • 并發基準測試

在并發的情況下,Go 也支持基準測試。Go 語言通過 RunParallel 方法運行并發基準測試。創建多個 goroutine 然后將 b.N 分配給這些 goroutine 執行。

func BenchmarkAdd(b *testing.B) {
    b.RunParallel(func(pb *testing.PB) {
        for pb.Next() {
            Add()
        }
    })
}

單元測試可以保證代碼質量,但其也不是萬能的,還需要 code Review 和人工測試才能更好的保證代碼的質量。

感謝各位的閱讀,以上就是“Golang單元測試和基準測試怎么實現”的內容了,經過本文的學習后,相信大家對Golang單元測試和基準測試怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

彰化县| 都昌县| 绍兴县| 永昌县| 鄂伦春自治旗| 山西省| 高碑店市| 宜州市| 临颍县| 清流县| 容城县| 桃江县| 庆元县| 射洪县| 阜城县| 鄄城县| 丰镇市| 重庆市| 搜索| 和龙市| 丘北县| 喀喇| 大安市| 自治县| 民丰县| 合水县| 阿克苏市| 盐山县| 巨鹿县| 青河县| 裕民县| 渭源县| 布拖县| 永顺县| 吉首市| 福清市| 离岛区| 曲松县| 普格县| 建德市| 新丰县|