Like Share Discussion Bookmark Smile

J.J. Huang   2020-11-09   Golang   瀏覽次數:次   DMCA.com Protection Status

Go - 第十章 | 添加測試

簡要

在開發過程中測試程式碼可能會暴露出在進行更改時會發現問題的bug。在本主題中,你將為該Hello功能添加一個測試 。

開始

Go對單元測試的內置支持使你在進行過程中的測試更加輕鬆。具體來說,使用命名約定,Gotesting程序包和go test命令,你可以快速編寫和執行測試。

  • greetings目錄中,創建一個名為greetings_test.go的文件。
    • _test.go結尾的文件名告訴go test命令該文件包含測試功能。
  • greetings_test.go中,複製貼上以下程式碼並保存文件。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    package greetings

    import (
    "testing"
    "regexp"
    )

    // TestHelloName calls greetings.Hello with a name, checking
    // for a valid return value.
    func TestHelloName(t *testing.T) {
    name := "Gladys"
    want := regexp.MustCompile(`\b`+name+`\b`)
    msg, err := Hello("Gladys")
    if !want.MatchString(msg) || err != nil {
    t.Fatalf(`Hello("Gladys") = %q, %v, want match for %#q, nil`, msg, err, want)
    }
    }

    // TestHelloEmpty calls greetings.Hello with an empty string,
    // checking for an error.
    func TestHelloEmpty(t *testing.T) {
    msg, err := Hello("")
    if msg != "" || err == nil {
    t.Fatalf(`Hello("") = %q, %v, want "", error`, msg, err)
    }
    }
    • 如果此程式碼,你:
      • 在與要測試的程式碼相同的程序包中實現測試功能。
      • 創建兩個測試功能以測試該greetings.Hello功能。測試功能名稱的格式為,其中名稱特定於測試。同樣,測試函數將指向包的指針作為參數。你可以使用此參數的方法從測試報告和記錄日誌。
        TestNametesting testing.T
      • 實施兩個測試:
        • TestHelloName調用Hello函數,並傳遞一個name值,函數應使用該值返回有效的響應消息。如果調用返回錯誤或意外的響應消息(其中不包含你傳入的名稱),則可以使用t參數的Fatalf方法將消息打印到控制台並結束執行。
        • TestHelloEmptyHello用空字符串調用該函數。此測試旨在確認你的錯誤處理有效。如果調用返回非空字符串或沒有錯誤,則使用t參數的Fatalf方法 將消息打印到控制台並結束執行。
  • greetings目錄中的命令行中,運行go test命令以執行測試。
    • go test命令Test在測試文件(名稱以_test.go結尾)中執行測試功能(名稱以開頭)。你可以添加-v標誌以獲取列出所有測試及其結果的詳細輸出。
  • 測試應該通過。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ go test
    PASS
    ok greetings 0.065s
    $ go test -v
    === RUN TestHelloName
    --- PASS: TestHelloName (0.00s)
    === RUN TestHelloEmpty
    --- PASS: TestHelloEmpty (0.00s)
    PASS
    ok greetings 0.065s
  • 中斷該greetings.Hello功能以查看失敗的測試。
    • TestHelloName測試功能檢查你指定為名稱的返回值Hello函數的參數。要查看失敗的測試結果,請更改greetings.Hello功能,使其不再包含名稱。
    • greetings / greetings.go中,將以下程式碼替換為該Hello函數。請注意,突出顯示的行更改了該函數返回的值,就像該name參數已被意外刪除一樣。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      // Hello returns a greeting for the named person.
      func Hello(name string) (string, error) {
      // If no name was given, return an error with a message.
      if name == "" {
      return name, errors.New("empty name")
      }
      // Create a message using a random format.
      // message := fmt.Sprintf(randomFormat(), name)
      message := fmt.Sprint(randomFormat())
      return message, nil
      }
  • greetings目錄中的命令行上,運行go test以執行測試。
    • 這次,go test不帶-v標誌運行。輸出將僅包含失敗測試的結果,這在你進行大量測試時很有用。該TestHelloName測試將失敗-TestHelloEmpty還通過。
      1
      2
      3
      4
      5
      6
      $ go test
      --- FAIL: TestHelloName (0.00s)
      greetings_test.go:15: Hello("Gladys") = "Hi, %!v(MISSING). Welcome!", <nil>, want match for `\bGladys\b`, nil
      FAIL
      exit status 1
      FAIL greetings 0.283s

過程

單字/句子

單字/句子 翻譯
during
expose 暴露
built-in 內置的
conventions 約定
logging from your test 從測試中記錄
unexpected 意外

結語

可以發現在Go裡面很簡單的撰寫測試案例,而且只需要定義名稱結尾為_test即可。然後使用go test指令就可以執行測試案例。常常在看別人提供的Go模塊或是專案時,會不知道如何使用或是README.md並沒有非常詳細說明,這時候只需要去看測試案例,基本上就會有使用方式了。


註:以上參考了
Golang Documentation