1. 程式人生 > >go Test的實現 以及 壓力測試

go Test的實現 以及 壓力測試

import ror 用例 package 格式 們的 必須 開始時間 一點

引用

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

參見

一個不錯的教程

go Test的實現 以及 壓力測試