1、單元測試用例
go test命令是一個按照一定約定和組織的測試程式碼驅動程式
在包目錄中,所有以_test.go結尾的原始碼檔案都會被go test執行到
我們寫的 _test.go原始碼檔案不用擔心內容過多,因為go test命令不會將這些測試檔案打包到最後的可執行檔案
在實際應用中,test檔案有四類:
1、Test開頭的:功能測試
2、Benchmark開頭的:效能測試
3、Example開頭的:模糊測試
4、TestMain開頭的:單元測試
1.1、單元測試用例編寫
下面舉一個單元測試的例子:
在包目錄中有三個go檔案,分別是:
1、add.go
2、add_test.go
3、main.go

在add.go中定義了一個Add函式,用來實現兩個整數的相加:
在add_test.go中首先匯入”testing”包,然後定義了一個TestAdd函式,用來測試Add函式的正確性,並作出相應的出錯處理:
import "testing"
func TestAdd(t *testing.T){
re := add(1,2)
if re!= 3{
t.Errorf("add(1,2) = %d; want 3", re)
}
}
之後對add_test.go檔案執行go test命令,即可進行單元測試,檢視測試結果
1.2、跳過耗時的單元測試用例
在實際應用中,我們可能會遇到一些耗時的單元測試用例,我們可以使用t.Skip()函式來跳過這些耗時的單元測試用例
在執行測試檔案的過程中,使用 go test -short命令可以檢視測試結果,其中 -short命令會跳過所有耗時的單元測試用例
耗時的單元測試用例是有自己定義的
下面是一個使用跳過單元測試的例子:
func TestAdd(t *testing.T){
if testing.Short(){
t.Skip("skip this test")
}
// 下面是执行不到的
re := add(1,2)
if re!= 3{
t.Errorf("add(1,2) = %d; want 3", re)
}
}
testing中的short相當於採用了兩種模式,供使用者選擇。
2、基於表格驅動測試
在實際測試的的時候,測試用例可能不止一組,一個一個測試非常耗時,go中提供了一種基於表格驅動測試的方式,它可以一次性測試多組資料,提高測試效率
下面是一個基於表格驅動測試的例子:
import "testing"
func TestAdd(t *testing.T){
var tests = []struct{
a int
b int
want int
}{
{1,2,3},
{2,3,5},
{3,4,7},
}
for _, tt := range tests{
re := add(tt.a, tt.b)
if re!= tt.want{
t.Errorf("add(%d, %d) = %d; want %d", tt.a, tt.b, re, tt.want)
}
}
}
3、benchmark效能測試
在一些核心函式中對效能有要求,我們可以使用benchmark效能測試來測試函式的效能
同樣,效能測試函式也在”testing”包中
在應用過程中,效能測試函式的命名必須以Benchmark開頭,後面跟上要測試的函式名
效能測試函式的引數必須是*testing.B型別的指標
在執行測試檔案的過程中,使用 go test -bench命令可以檢視測試結果,其中 -bench命令會執行所有的效能測試用例
下面是一個關於單元效能測試的例子:
import "testing"
func BenchmarkAdd(b *testing.B){
a := 123
b := 456
c := 579
for i:=0; i<b.N; i++{
if actual := add(a,b); actual!= c{
fmt.Printf("add(%d, %d) = %d; want %d", a, b, actual, c)
}
}
在進行效能測試過沉重還有一個常用的函式:b.ResetTimer(),它可以重置計時器,使得測試結果更加準確