golang 之單元測試

2022-03-19 14:00:59 字數 2944 閱讀 4498

測試是自動化測試的簡稱,即編寫簡單的程式來確保程式(產品**)在測試中針對特定輸入產生預期的輸出。go的測試方法看上去相對比較低階,它依賴於命令go test和一些能用go test執行的測試函式的編寫約定

go test 子命令是go語言包的測試驅動程式,這些包根據某些約定組織在一起。在乙個包目錄中,以_test.go結尾的檔案不是go build命令編譯的目標,而是go test編譯的目標。

在*_test.go檔案中,三種函式需要特殊對待,即

功能測試函式

基準測試函式 :名稱以benchmark開頭,用來檢測某些操作的效能。

示例執行測試函式 :以example來測試某些操作的效能。用來提供機器檢查過的文件。

每乙個測試檔案必須匯入testing包,簽名如下

import "testing"

func testname(t *testing.t)

功能測試函式必須以test開頭,可選的字尾名稱必須以大寫字母開頭:

import "testing"

func testsin(t *testing.t)

func testcos(t *testing.t)

如下編譯乙個測試連線mysql的單元測試,必須保證同目錄的情況下,否則找不到,建立乙個mysql.go用來編寫連線的**

在同目錄下建立乙個mysql_test.go用來編寫測試**

package mysql

import (

"testing"

)func test_findbypk(t *testing.t)

執行乙個測試套件覆蓋待測試包的比例稱為測試的覆蓋率。覆蓋率無法直接通過數量來衡量。任何事情都是動態的。即使最微小的程式都無法精準的測量。語句覆蓋率是指部分語句在一次執行中至少執行一次。go語言中提供cover工具

# go test -cover

pass

coverage: 100.0% of statements

ok jdgobackend/library/sdk/jd 0.017s

go還提供了將輸出列印報告的方法。

# go test -cover -coverprofile=c.out

然後可以通過html方法顯示,使用cover工具來處理生成的記錄資訊,該命令會開啟本地的瀏覽器視窗生成乙個html報告。

# go tool cover -html=c.out

基準測試是在一定的工作負載之下檢測程式效能的一種方法,在go裡面,基準測試函式看上去像乙個測試函式。但字首是benchmark並且擁有乙個*testing.b引數用來提供大多數和*testing.t相同的方法。額外增加一些與效能檢測相關的方法。還提供了乙個整數檢測成員n,用來檢測執行的次數。

基本格式

func benchmarkname(b *testing.b)

下面的基準測試在乙個迴圈中呼叫了ispaling共 n次

import "testing"

func benchmarkispaling(b *testing.b)

}

和測試不同的是,預設情況下不會執行任何基準測試,需要標記-bench的引數指定要執行的基準引數。

#  go test -bench=ispaling

benchmarkispaling-8 10000000 203 ns/op

pass

ok jdgobackend/library/sdk/jd 2.255s

就上面的執行結果,基礎名稱benchmarkispaling-8字尾8表示gomaxprocs的值。這個數字對併發基準測試很重要。

報告告訴我們每次ispaling呼叫耗費0.23ms。這個是1 000 000 0次呼叫的平均值

我們可以通過-benchmen再報告中包含了記憶體分配統計資料。這裡和優化之前的記憶體分配進行比較。

# go test -bench=. -benchmen  // . 萬用字元匹配所有

pass

benchmarkispaling 1000000 1026 ns/op 304 b/op 4 allocs/op

最後,效能比較函式知識普通的**,它們的表現形式通常是帶有乙個引數的函式,被多個不同benchmark函式傳入不同的值來呼叫。如下

func benchmark(b *testing.b, size int)

func benchmark10(b *testing.b)

func benchmark100(b *testing.b)

func benchmark1000(b *testing.b)

引數size指定了輸入的大小,每個benchmark函式傳入的值都不同但是在每個函式內部是乙個常量,不要使用b.n作為輸入的大小。除非把它當作固定大小輸入的迴圈次數。否則該基準測試的結果毫無意義。

最後測試牽扯到效能,將會在效能模組詳細介紹。

golang 單元測試

單元測試是質量保證十分重要的一環,好的單元測試不僅能及時地發現問題,更能夠方便地除錯,提高生產效率,所以很多人認為寫單元測試是需要額外的時間,會降低生產效率,是對單元測試最大的偏見和誤解 go 語言原生支援了單元測試,使用上非常簡單,測試 只需要放到以 test.go結尾的檔案中即可。golang的...

golang單元測試之mock

搞單元測試,如果碰到這些情況 1,乙個函式,內部包含了很多並且很深的呼叫,但是如果單單測這個函式,其實實現的功能很簡單。2,乙個函式,包含了其他還未實現的呼叫。3,函式內部對資料的要求極為苛刻。那麼這時候就可以考慮使用mock來處理。mock,簡而言之就是可以通過注入我們所期望返回的資料,或者我們所...

Golang測試 單元測試

1 測試檔案必須以 test.go結尾 2 測試函式名必須以test xx開始 x為對應的需要測試的函式 3 使用go test命令開啟測試 檔名以 test結尾,函式以test開頭,在執行 go test 命令時會自動匹配測試檔案很執行測試函式 1 有時候我們將測試檔案 以 test.go 結尾的...