這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
一般為了保證整個系統的穩定性,通常都需要編寫大量的單元測試,諸如像java的junit,php的phpunit等都提供了類似的功能。golang中的testing包提供了這個測試的功能,結合go test工具搞起來就很方便了。
golang中的單元測試不單有功能測試,也還提供了效能測試,非常給力。
功能測試
在golang的src目錄下建立目錄math,測試目錄結構如下:
golang單元測試目錄
fibonacci.go代碼如下,主要有一個Fibonacci函數
package lib //斐波那契數列//求出第n個數的值func Fibonacci(n int64) int64 { if n < 2 { return n } return Fibonacci(n-1) + Fibonacci(n-2)
fibonacci_test.go就是測試的檔案了,golang需要測試檔案一律用”_test”結尾,測試的函數都用Test開頭,代碼如下:
package lib import ( "testing") func TestFibonacci(t *testing.T) { r := Fibonacci(10) if r != 55 { t.Errorf("Fibonacci(10) failed. Got %d, expected 55.", r) }}
使用go test測試這個程式
$ go test lib ok lib 0.008s
如果提示找不到包,則將該代碼路徑加入環境變數GOPATH就可以了。
can't load package: package lib: cannot find package "lib" in any of:
效能測試
結合上面的方法,這裡測試一下函數的效能,如果需要進行效能測試,則函數開頭使用Benchmark就可以了。
//效能測試func BenchmarkFibonacci(b *testing.B) { for i := 0; i < b.N; i++ { Fibonacci(10) }}
接下來執行這個效能測試:
$ go test -bench=. lib PASS BenchmarkFibonacci 5000000 436 ns/op ok lib 2.608s
其中第二行輸出表示這個函數運行了5000000次,平均運行一次的時間是436ns。
這個效能測試只測試參數為10的情況。如果有需要可以測試多個參數:
//測試參數為5的效能func BenchmarkFibonacci5(b *testing.B) { for i := 0; i < b.N; i++ { Fibonacci(5) }} //測試參數為20的效能func BenchmarkFibonacci20(b *testing.B) { for i := 0; i < b.N; i++ { Fibonacci(20) }}
運行一下:
$ go test -bench=. lib PASS BenchmarkFibonacci 5000000 357 ns/op BenchmarkFibonacci5 100000000 29.5 ns/op BenchmarkFibonacci20 50000 44688 ns/op ok lib 7.824s
如果效能測試的方法非常多,那需要的時間就會比較久。可以通過-bench=參數設定需要啟動並執行效能測試行數:
$ go test -bench=Fibonacci20 lib PASS BenchmarkFibonacci20 50000 44367 ns/op ok lib 2.677s