Golang單元測試詳解:單元測試的基本使用方法
Golang 單元測試
Golang 中的單元測試是使用標(biāo)準(zhǔn)庫 testing 來實現(xiàn)的,編寫一個單元測試是很容易的:
- 創(chuàng)建測試文件:在 Go 項目的源代碼目錄下創(chuàng)建一個新的文件(和被測代碼文件在同一個包),以 _test.go 為后綴名。例如,要測試net包中 dial.go 中的方法,在 net 包中創(chuàng)建一個名字為 dial_test.go 文件。
- 導(dǎo)入 testing 包:在測試文件中導(dǎo)入testing包,以使用相關(guān)的的函數(shù)和工具。
- 編寫測試函數(shù):在測試文件中,編寫一個以 Test 為前綴的函數(shù),后面跟上一個或多個字符或字符組合來標(biāo)識測試用例的名稱(一般使用被測的函數(shù)名稱),參數(shù)必須是 t *testing.T。
- 編寫測試代碼:如果認(rèn)為測試不通過,當(dāng)被測程序功能與預(yù)期不符,調(diào)用 t.Error 或 t.Errorf 方法記錄錯誤;如果出現(xiàn)了使測試無法繼續(xù)進(jìn)行的錯誤,調(diào)用tFatal 和 t.Fatalf;如果測試函數(shù)體正常運行結(jié)束,沒有異常,則測試通過。
以 json 格式校驗工具
https://github.com/luduoxin/json-validator-go 為例,validator包中的 scanner.go 文件中的關(guān)鍵函數(shù) Valid 用于校驗給定字符串是否 json 格式,對應(yīng)的單元測試文件為 scanner_test.go,里面的測試函數(shù)為 TestValid。scanner_test.go 的源代碼如下:
package validator
import "testing"
var validTests = []struct {
data string
ok bool
}{
{`foo`, false},
{`}{`, false},
{`{]`, false},
{`123`, false},
{`123.5`, false},
{`0.5`, false},
{`true`, false},
{`false`, false},
{`null`, false},
{`[1,2,3]`, false},
{`["a","b","c"]`, false},
{`{"foo":bar}`, false},
{`[{"foo":"bar"},]`, false},
{`{}`, true},
{`[]`, true},
{`[{}]`, true},
{`{"foo":"bar"}`, true},
{`{"foo":"bar","bar":{"baz":["qux"]}}`, true},
{`[{"a":"[\"c\":\"d\"]"}]`, true},
{`[{"a":[]}]`, true},
{` {"a":"b"}`, true},
{` {"a":"b"} `, true},
{`{"a":"b"} `, true},
{`{"a": "b"} `, true},
}
func TestValid(t *testing.T) {
for _, tt := range validTests {
if ok := Valid([]byte(tt.data)); ok != tt.ok {
t.Errorf("Valid(%#q) = %v, want %v", tt.data, ok, tt.ok)
}
}
}
這個源代碼相關(guān)來說比較復(fù)雜,因為測試的數(shù)據(jù)種類比較多,如果是只想簡單測試一下,代碼如下:
package validator
import "testing"
func TestValid(t *testing.T) {
str := `{"a": "b"}`
if ok := Valid([]byte(str)); !ok {
t.Errorf("Valid(%#q) = %v, want %v", str, ok, true)
}
}
運行單元測試用例
使用 go test 命令可以運行單元測試用例,使用方法如下:
# 執(zhí)行當(dāng)前目錄下的全部測試用例,不遞歸子目錄中的測試用例
go test .
# 執(zhí)行當(dāng)前目錄下的全部測試用例,遞歸子目錄中的測試用例
go test ./...
# 執(zhí)行當(dāng)前目錄下的全部測試用例并顯示測試過程中的日志內(nèi)容,不遞歸子目錄中的測試用例
go test -v .
# 執(zhí)行當(dāng)前目錄下的全部測試用例并顯示測試過程中的日志內(nèi)容,遞歸子目錄中的測試用例
go test -v ./...
# 執(zhí)行指定的測試用例
go test -v . -test.run '^TestValid$'
啟動命令行,切換到 json-validator-go 項目的 validator 文件夾下,運行全部測試用例:
$ go test -v .
=== RUN TestValid
--- PASS: TestValid (0.00s)
PASS
ok github.com/luduoxin/json-validator-go/validator
運行指定測試用例 TestValid :
$ go test -v . -test.run '^TestValid$'
=== RUN TestValid
--- PASS: TestValid (0.00s)
PASS
ok github.com/luduoxin/json-validator-go/validator