Go语言中自带有一个轻量级的测试框架testing和自带的go test命令来实现单元测试和性能测试。这里以main_test.go这个文件为例
1. 单元测试文件,基本原则:
文件名必须是_test.go结尾的,这样在执行go test的时候才会执行到相应的代码
你必须import testing这个包
所有的测试用例函数必须是Test开头
测试用例会按照源代码中写的顺序依次执行
测试函数TestXxx()的参数是testing.T,我们可以使用该类型来记录错误或者是测试状态
测试格式:func TestXxx (t *testing.T),Xxx部分可以为任意的字母数字的组合,但是首字母不
是小写字母[a-z],例如Testintdiv是错误的函数名。
函数中通过调用testing.T的Error, Errorf, FailNow, Fatal, FatalIf方法,说明测试不通过,调用Log方法用来记录测试的信息。
2. 功能测试函数
2.1 测试函数中的某条测试用例执行结果与预期不符时,调用t.Error()或t.Errorf()方法记录日志并标记测试失败:
func TestCompareIdenticalSlice(t *testing.T) {
sa := "aaa"
sb := "bbb"
if strings.Compare(sa, sb) != 0 {
t.Error("b != b")
}
}
2.2 使用t.Fatal()和t.Fatalf()方法,在某条测试用例失败后就跳出该测试函数
func TestCompareIdenticalSlice(t *testing.T) {
sa := "aaa"
sb := "bbb"
if strings.Compare(sa, sb) != 0 {
t.Fatal("error")
}
s1 := "aaa1"
s2 := "bbb"
if strings.Compare(s1, s2) != 0 {
t.Errorf("errorf")
}
}
2.3 使用t.Skip()和t.Skipf()方法,跳过某条测试用例的执行如下会跳过TestCompareIdenticalSlice 执行 TestCompareIdenticalSlice1测试用例
func TestCompareIdenticalSlice(t *testing.T) {
sa := "aaa"
sb := "bbb"
if strings.Compare(sa, sb) != 0 {
t.Skip("slow test; skipping")
}
s1 := "aaa1"
s2 := "bbb"
if strings.Compare(s1, s2) != 0 {
t.Errorf("errorf")
}
}
func TestCompareIdenticalSlice1(t *testing.T) {
sa := "aaa"
sb := "bbb"
if strings.Compare(sa, sb) != 0 {
t.Errorf("errorf2")
}
s1 := "bbb"
s2 := "bbb"
if strings.Compare(s1, s2) != 0 {
t.Errorf("errorf2")
}
}
2.4 使用t.Parallel()标记需要并发执行的测试函数
func gorw() {
sa := "aaa"
sb := "bbb"
if strings.Compare(sa, sb) != 0 {
fmt.Println("dfdf")
}
}
func TestCompareIdenticalSlice(t *testing.T) {
t.Parallel()
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
gorw()
}()
wg.Wait()
}
sync.WaitGroup只有3个方法,Add(),Done(),Wait()。其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。