學習記錄—go—go test

cooodeer發表於2019-01-23

Golang的單元測試和效能測試

在開發程式中測試很重要,保證程式碼的質量、每個函式是可執行、執行結果是正確的、程式碼效能是好的,單元測試的重點在於發現程式設計或實現的邏輯錯誤,使問題及早暴露,便於問題的定位解決,而效能測試的重點在於發現程式設計上的一些問題,讓線上的程式能夠在高併發的情況下還能保持穩定。本小節將帶著這一連串的問題來講解Go語言中如何來實現單元測試和效能測試。

go語言中自帶有一個輕量級的測試框架testing和自帶的go test命令來實現單元測試效能測試testing框架 和其他語言中的測試框架類似,你可以基於這個框架寫針對相應函式的測試用例,也可以基於該框架寫相應的壓力測試用例,那麼接下來讓我們一一來看一下怎麼寫。

如何編寫測試用例

由於go test命令只能在一個相應的目錄下執行所有檔案,所以我們接下來新建一個專案目錄gotest,這樣我們所有的程式碼和測試程式碼都在這個目錄下。
接下來我們在該目錄下面建立兩個檔案:gotest.go和gotest_test.go

  1. gotest.go:這個檔案裡面我們是建立了一個包,裡面有一個函式實現了除法運算:
package gotest

import (
   "errors"
)

func Division(a, b float64) (float64, error) {
   if b == 0 {
       return 0, errors.New("除數不能為0")
   }

   return a / b, nil
}
  1. gotest_test.go:這是我們的單元測試檔案,但是記住下面的這些原則:

    1. 檔名必須是_test.go結尾的,這樣在執行go test的時候會執行到相應的程式碼
    2. 你必須import testing這個
    3. 所有的測試用例函式必須是Test開頭
    4. 測試用例會按照原始碼中寫的順序依次執行測試用例會按照原始碼中寫的順序依次執行
    5. 測試函式 TestXxx()的引數是testing.T,我們可以使用該型別來記錄錯誤或者是測試狀態
    6. 測試格式func TestXxx (t *testing.T),Xxx部分可以為任意的字母數字的組合,但是首字母不能是小寫字母[a-z],例如Testintdiv錯誤的函式名。
    7. 函式中通過呼叫testing.TError, Errorf, FailNow, Fatal, FatalIf方法,說明測試不通過,呼叫Log方法用來記錄測試的資訊。
      下面是我們的測試用例的程式碼:
package gotest

import (
   "testing"
)

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("除法函式測試沒通過") // 如果不是如預期的那麼就報錯
   } else {
       t.Log("第一個測試通過了") //記錄一些你期望記錄的資訊
   }
}

func Test_Division_2(t *testing.T) {
   t.Error("就是不通過")
}

我們在專案目錄下面 執行:go test ,就會顯示如下資訊:

--- FAIL: Test_Division_2 (0.00 seconds)
    gotest_test.go:16: 就是不通過
FAIL
exit status 1
FAIL    gotest  0.013s

從這個結果顯示測試沒有通過,因為在第二個測試函式中我們寫死了測試不通過的程式碼t.Error,那麼我們的第一個函式執行的情況怎麼樣呢?預設情況下執行go test是不會顯示測試通過的資訊的,我們需要帶上引數go test -v,這樣就會顯示如下資訊:

=== RUN Test_Division_1
--- PASS: Test_Division_1 (0.00 seconds)
    gotest_test.go:11: 第一個測試通過了
=== RUN Test_Division_2
--- FAIL: Test_Division_2 (0.00 seconds)
    gotest_test.go:16: 就是不通過
FAIL
exit status 1
FAIL    gotest  0.012s

上面的輸出詳細的展示了這個測試的過程,我們看到測試函式1Test_Division_1測試通過,而測試函式2Test_Division_2測試失敗了,最後得出結論測試不通過。接下來我們把測試函式2修改成如下程式碼:

func Test_Division_2(t *testing.T) {
    if _, e := Division(6, 0); e == nil { //try a unit test on function
        t.Error("Division did not work as expected.") // 如果不是如預期的那麼就報錯
    } else {
        t.Log("one test passed.", e) //記錄一些你期望記錄的資訊
    }
}   

總結

舉例說明:
fabric目錄下有兩個檔案fabric.gofabric_test.go

  • fabric_test.go: 用來測試fabric.go中的函式(通過呼叫fabric.go中函式的方式,以驗證結果與預期對比的手段)

參考連結

相關文章