引用
import "testing"
一些原則
- 文件名必須是 _test.go 結尾的,這樣在執行 go test 的時候才會執行到相應的代碼
- 必須 import testing 這個包
- 所有的測試用例函數必須是 Test 開頭
- 測試用例會按照源代碼中寫的順序依次執行
- 測試函數 TestXxx() 的參數是 testing.T ,我們可以使用該類型來記錄錯誤或者是測試狀態
- 測試格式: func TestXxx (t *testing.T) , Xxx 部分可以為任意的字母數字的組合,但是首字母不能是小寫字母[a-z],例如 Testintdiv 是錯誤的函數名
- 函數中通過調用 testing.T 的 Error, Errorf, FailNow, Fatal, FatalIf 方法,說明測試不通過,調用 Log 方法用來記錄測試的信息。
另外說明一點,測試函數 func TestXxxx(t *testing.T) 中,除了Xxxx可以不一樣外,別的格式都不能改
test 測試用例
比如此處,我們的測試文件 demo_test.go 格式如下:
func Test_Division_1(t *testing.T) {
if i, e := Division(6, 2); i!=3 || e!=nil { //try a unit test on function
t.Error("Devision error") // 如果不是如預期的那么就報錯
} else {
t.Log("Pass test1") //記錄一些你期望記錄的信息
}
}
func Test_Division_2(t *testing.T) {
t.Error("NO ONE CAN PASS")
}
上述的 func Division(float64, float64) (float, error) 函數在 demo.go 文件中如下:
func Division(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("除數不能為0")
}
return a / b, nil
}
test 的運行
此時,執行命令,默認運行所有文件
go test
此時我們即可看到結果:
--- FAIL: Test_Division_2 (0.00s)
demo_test.go:16: 就是不通過
FAIL
exit status 1
FAIL _/dir/??? 0.001s
另外可以使用其他命令,查看能加詳細的結果:
go test ???_test.go // 執行指定腳本
go test -v ???_test.go ???.go // 查看詳細結果
go test -v -run="Test_Division_2" // 正則匹配函數名稱,執行對應的函數
go test -c // 生成test的2進制可執行文件
go test -i // 安裝/重新安裝運行測試所需的依賴包,但不編譯和運行測試代碼
go test -o aaa.test// 運行可執行文件
壓力測試
作用主要為檢測函數(方法)的性能
壓力測試用例必須遵循如下格式,其中XXX可以是任意字母數字的組合,但是首字母不能是小寫字母,例如 func BenchmarkXxx(b *testing.B) { ... }
go test 不會默認執行壓力測試的函數,如果要執行壓力測試需要帶上參數 -test.bench ,語法: -test.bench="test_name_regex" ,例如 go test -test.bench=".*" 表示測試全部的壓力測試函數
在壓力測試用例中,請記得在循環體內使用
testing.B.N
,以使測試可以正常的運行文件名也必須以
_test.go
結尾
以下為一個名為 webbench_test.go 的Demo:
package gotest
import (
"testing"
)
func Benchmark_Division(b *testing.B) {
for i := 0; i < b.N; i++ { //use b.N for looping
Division(4, 5)
}
}
func Benchmark_TimeConsumingFunction(b *testing.B) {
b.StopTimer() //調用該函數停止壓力測試的時間計數
//此處做一些不會影響測試函數本身的性能的工作
b.StartTimer() //重新開始時間
for i := 0; i < b.N; i++ {
Division(4, 5)
}
}
執行命令:
go test webbench_test.go -test.bench=".*"
可以得到如下的結果:
goos: linux
goarch: amd64
Benchmark_Division-4 2000000000 0.56 ns/op
Benchmark_TimeConsumingFunction-4 2000000000 0.47 ns/op
PASS
ok command-line-arguments 2.153s