Go - 第十章 | 添加測試
簡要
在開發過程中測試程式碼可能會暴露出在進行更改時會發現問題的bug
。在本主題中,你將為該Hello
功能添加一個測試 。
開始
Go
對單元測試的內置支持使你在進行過程中的測試更加輕鬆。具體來說,使用命名約定,Go
的testing
程序包和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
26package 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