一、簡介
日常開發中, 測試是不能缺少的,每次手動測試非常費時費力,通過單元測試可以達到一次實作多次利用;
單元測試主要是通過模拟業務中的參數,調用我們的函數,然後擷取執行結果,再判斷結果是否符合規則;同時還可以對某一個方法進行性能分析
在Go 标準庫中有一個叫做
testing
的測試架構, 可以用于單元測試和性能測試. 它是和指令
go test
內建使用的,測試檔案是以字尾
_test.go
命名的, 通常和被測試的檔案放在同一個包中.
規則:
- 單元測試代碼的go檔案必須以_test.go結尾,Go語言測試工具隻認符合這個規則的檔案
- 單元測試的函數名必須以Test開頭,是可導出公開的函數。備注:函數名最好是Test+要測試的方法函數名
- 測試函數的簽名必須接收一個指向testing.T類型的指針作為參數,并且該測試函數不能傳回任何值
二、實驗環境
單元測試我們大部分情況下無需增加或修改業務代碼,隻需增加單元測試代碼即可,在這個實驗過程中,我們簡單編寫一個簡單的業務代碼,用來模拟項目中的業務代碼;然後再添加單元測試代碼進行測試。
2.1 編寫被測試的代碼
我們找一個空檔案夾,建立一個main.go檔案,在檔案中将一下代碼複制進去并儲存
package main
func Sum(count int) int {
count--
return count
}
2.2 編寫單元測試代碼
接着我們繼續在目前檔案夾下建立單元測試代碼,按照簡介中的規則,我們需要建立一個名為
main_test.go
的檔案,然後在檔案中編寫測試代碼,示例代碼如下
package main
import (
"testing"
)
//單元測試
func TestSum(t *testing.T) {
//準備參數
param := 10
//執行函數
ret := Sum(param)
//判斷結果是否符合預期
if ret != 9 {
t.Error("Sum result failed")
}
}
//性能測試
func BenchmarkSum(b *testing.B) {
//準備參數
param := 10
//執行函數
for i := 0; i < b.N; i++ {
Sum(param)
}
}
三、單元測試使用
3.1 普通測試
普通測試主要是驗證傳回的結果是否符合預期,執行的指令如下所示
go test -v main_test.go main.go
指令執行後,傳回的結果如下所示
從上圖中可以看到,單元測試提示測試通過,說明我們程式符合預期
3.2 性能測試
性能測試主要是通過多次調用程式,總耗時來分析程式的性能,類似于AB壓力測試,執行指令如下所示
go test -v -bench="BenchmarkSum$" --run=none main_test.go main.go
指令中的
-bench="BenchmarkSum$"
參數代表要窒息哪一個方法,執行結果如下所示
在上圖中可以看到程式被調用了1000000000次,平均耗時
0.254ns
3.3 性能分析
性能分析主要是檢視方法中具體的瓶頸,比如A方法調用了C、B、D多個方法,具體耗時在什麼位置,我們可以在上一條性能測試的指令中加入
-cpuprofile cpu.out
參數(文章附錄有多種分析名額類型)加入到性能測試中的具體資訊儲存
go test -v -bench="BenchmarkSum$" --run=none -cpuprofile cpu.out main_test.go main.go
通過go 自帶工具分析儲存的檔案
go tool pprof cpu.out
指令執行之後傳回資訊如下圖所示
通過第三方工具視圖分析
apt install graphviz && go tool pprof -http=":" cpu.out
指令執行之後,會傳回一個localhost域名加随機端口的網址,打開網址之後,能看到如下資訊,因為我測試的方法比較簡單
四、附錄
各參數含義翻譯
-blockprofile block.out
将goroutine阻塞配置檔案寫入指定檔案
當所有測試完成時。
按照-c的方式編寫測試二進制檔案。
-blockprofilerate n
控制細節提供的goroutine阻塞配置檔案
調用運作時。SetBlockProfileRate與n。
參見" go doc run . setblockprofilerate "
剖析器的目标是平均每個阻塞事件采樣一次
n納秒的程式花費被阻塞。預設情況下,
如果以及。塊配置檔案沒有設定這個标志,所有的阻塞事件
,相當于-test.blockprofilerate=1。
-coverprofile cover.out
在所有測試通過後,向檔案寫入覆寫率配置檔案。
設定覆寫。
-cpuprofile cpu.out
退出前将CPU配置檔案寫入指定檔案。
按照-c的方式編寫測試二進制檔案。
-memprofile mem.out
通過所有測試後,将配置設定配置檔案寫入該檔案。
按照-c的方式編寫測試二進制檔案。
-memprofilerate n
啟用更精确(和昂貴)的記憶體配置設定配置檔案
設定runtime.MemProfileRate。參見" go doc run . memprofilerate "。
要配置所有記憶體配置設定,使用-test.memprofilerate=1。
-mutexprofile mutex.out
将互斥鎖争用配置檔案寫入指定檔案
當所有測試完成時。
按照-c的方式編寫測試二進制檔案。
-mutexprofilefraction n
樣本1在n堆棧的蹤迹goroutines持有a
争用互斥鎖。
作者:湯青松
日期:2020-08-11