Go 有一个由go test
命令和testing
包组成的轻量级测试框架。testing
包为 Go 包提供自动化测试支持,并和go test
命令配合使用,自动运行符合以下形式的任意函数:
func TestXxx(*testing.T)
被测试函数Xxx
首字母为大写。在测试函数中使用Error
、Fail
或相关方法来标记失败。如果测试函数调用一个失败的函数,如t.Error
或者t.Fail
,则认为测试失败。
测试文件以_test.go
结尾,该文件包含名为TestXxx
、签名为func (t *testing.T)
的函数,测试文件与被测试文件放在同一个包中。测试文件在一般的包编译时
被忽略,在运行go test
命令时才会被使用。
以下是一个完整的例子,创建一个stringutil
包,包文件有reverse.go
和reverse_test.go
,reverse.go
文件为普通的包文件,代码如下:
package stringutil
func Reverse(s string) string {
r := []rune(s)
for i, j := 0, len(r) - 1; i < len(r) / 2; i, j = i + 1, j - 1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}
reverse_test.go
文件为reverse.go
的测试文件,代码如下:
package stringutil
import (
"testing"
)
func TestReverse(t *testing.T) {
cases := []struct {
in, want string
}{
{"Hello, world", "AAAdlrow ,olleH"},
{"Hello, 世界", "界世 ,olleH"},
{"", ""},
}
for _, c := range cases {
got := Reverse(c.in)
if got != c.want {
t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)
}
}
}
如上所示,TestReverse
函数为Reverse
函数的测试函数。现在可以进入stringutil
目录,运行以下命令:
$ go test
PASS
ok github.com/lwlwilliam/stringutil 0.199s
如果要测试的所有函数都运行正常,则会显示如上信息,否则会提示错误。