go Test的實現 以及 壓力測試


引用

import "testing"

一些原則

  • 文件名必須是 _test.go 結尾的,這樣在執行 go test 的時候才會執行到相應的代碼
  • 必須 import testing 這個包
  • 所有的測試用例函數必須是 Test 開頭
  • 測試用例會按照源代碼中寫的順序依次執行
  • 測試函數 TestXxx() 的參數是 testing.T ,我們可以使用該類型來記錄錯誤或者是測試狀態
  • 測試格式: func TestXxx (t *testing.T) , Xxx 部分可以為任意的字母數字的組合,但是首字母不能是小寫字母[a-z],例如 Testintdiv 是錯誤的函數名
  • 函數中通過調用 testing.TError, 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

參見

一個不錯的教程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM