這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
之前看過一本書,說:“凡大神都是先寫好單元測試用例,才去寫代碼的”。我一直都記在心裡。今天終於有空,就看了看Golang的測試包testing
。
謝大的書和Golang官方的文檔講的差不多,Golang提供了兩個測試方式:用例測試和壓力測試。
###1. 用例測試
用例測試的規則我是複製謝大的:
- 檔案名稱必須是
_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
方法用來記錄測試的資訊。
以我之前寫好的堆排序為例進行測試,測試需要以包為單位。對於Golang,就是以檔案夾為單位。需要將堆排序檔案quicksort.go
和測試檔案quicksort_test.go
放到一起。
驗證堆排序測試案例:
func TestHeapSort(t *testing.T) {test0 := []int{49, 38, 65, 97, 76, 13, 27, 49}test1 := []int{13, 27, 38, 49, 49, 65, 76, 97}heapSort(BySortIndex(test0), 0, len(test0))for i := 0; i < len(test0); i++ {if test0[i] != test1[i] {t.Fatal("error")}}}$ go test -v
###2. 壓力測試
用例測試要用到的是testing.T
,而壓力測試需要testing.B
。它的原型如下:
type B struct {commonN intpreviousN int // number of iterations in the previous runpreviousDuration time.Duration // total duration of the previous runbenchmark InternalBenchmarkbytes int64timerOn boolshowAllocResult boolresult BenchmarkResultparallelism int // RunParallel creates parallelism*GOMAXPROCS goroutines// The initial states of memStats.Mallocs and memStats.TotalAlloc.startAllocs uint64startBytes uint64// The net total of this test after being run.netAllocs uint64netBytes uint64}
此結構裡面有一個屬性N
,它表示的是進行壓力測試的次數。可以通過b.N = 1234
來設定壓力次數。
func BenchmarkHeapSort(b *testing.B) {b.StopTimer() //調用該函數停止壓力測試的時間計數b.StartTimer() //重新開始時間b.N = 1234for i := 0; i < b.N; i++ {test0 := []int{49, 38, 65, 97, 76, 13, 27, 49}test1 := []int{13, 27, 38, 49, 49, 65, 76, 97}heapSort(BySortIndex(test0), 0, len(test0))for i := 0; i < len(test0); i++ {if test0[i] != test1[i] {b.Fatal("error")}}}}$ go test -v -test.bench=".*"=== RUN TestHeapSort--- PASS: TestHeapSort (0.00 seconds)PASSBenchmarkHeapSort 1234 1620 ns/opok go_code/test 0.051s
這裡我只是拋磚引玉,簡單寫了一點。今後寫代碼,我也得像大神一下寫用例了。大家共勉,哈哈哈。
本文所涉及到的完整源碼請參考。
######參考文獻+ 【1】Go怎麼寫測試案例 - astaxie
原文連結:Go語言的測試,轉載請註明來源!