go测试用例该如何写
go语言为我们提供了很好的测试框架,通过该测试框架能很轻松的进行功能测试、基准测试、样本测试和用于测试的Main函数。通过该测试框架,可以直接在包中进行所有方法(无论是可导和不可导)的测试,异常方便。
功能测试
功能测试的方法定义:
func TestXxx(t *testing.T)
。功能测试中的T结构体中提供
Error()
,Errorf()
,Fail()
,FailNow()
等一系列的错误信号方法。其中Error()
等价当失败时的Log()
方法,Errorf()
等价当失败时的Logf()
方法。Fail()
方法标记当前测试不通过,但是当前测试还会继续往下执行。FailNow()
该方法也是标记当前测试不通过并且终止当前测试,但不会影响其他的测试。简单的测试代码如下:
func TestFail(t *testing.T) { a := 1 if a != 2 { t.Fail() } fmt.Printf("a: %v\n", a) b := 2 if b != 1 { t.FailNow() } fmt.Printf("b: %v\n", b) } func TestSuccess(t *testing.T) { fmt.Println("hello") }
测试的效果如图:
通过上图可以发现,使用
Fail()
方法并没有结束TestFail这个测试,但是FailNow()
结束了TestFail这个测试但是对TestSuccess这个测试没有影响。Failed()
报告这个测试方法是否失败。Fatal()
和Falalf()
等价调用FailNow()
和Log()
。Log()
和Logf()
两个方法只有在测试失败或者在test.v
标志设置即go test -v
。Parallel()
方法,表示这个测试是在别的测试中运行的测试。Skip()
、SkipNow()
和Skipf()
方法表示当前的测试被跳过。func TestSkip(t *testing.T) { t.Skip("aaa") fmt.Print("bbb") } func TestSuccess(t *testing.T) { fmt.Println("hello") }
测试的结果如图:
从图中我们确实可以发现
TestSkip()
方法没有执行。基准测试
基准测试的方法定义:
func BenchmarkXxx(b *testing.B)
。要使基准测试生效需要在输入go test
命令后添加参数-bench .
这个参数。如果在运行前基准需要一些昂贵的设置,需要使用
b.ResetTimer()
将计数器重置。func BenchmarkHello(b *testing.B) { big := big.NewInt(20000) b.ResetTimer() for i := 0; i < b.N; i++ { big.BitLen() } }
testing.B
结构体中的方法有很多。其中有很多方法的命名和testing.T
结构体中的方法一样。同样的命名方法的作用是一样的。相同命名的方法作用就不在从复。ReportAlllocs()
该方法分配统计内存。它等价于设置-test.benchmem
参数,但是只对调用这个方法的测试有效。使用
-test.benchmem
参数的效果:ResetTimer()
方法的作用是重置计时器。但是当计时器已经在运行时就不受该方法的影响。SetBytes()
记录单一操作中bytes的操作数。它将在测试结果中报告ns/op和MB/s。例子:func BenchmarkHello(b *testing.B) { big := big.NewInt(20000) b.ResetTimer() for i := 0; i < b.N; i++ { b.SetBytes(2000) big.BitLen() } }
测试的结果如图:
StartTimer()
开始定时,但框架会自动被调用,但是也可以在调用StopTimer()
后重启定时。StopTimer()
停止定时。样本测试
样本测试的方法定义:
func Example()
或func ExampleF()
或func ExampleT
和func ExampleT_M()
。在该测试的最后需要结束的注释,需要以Output:开头。并且和标准的输出作比较。当Output和标准输出不同时该测试失败。例子:
func ExampleHello() { fmt.Println("hello") //Output:hello }
输出结果:
当我把Output:后面的内容修改后,在进行测试的结果如图:
func Example()
或func ExampleF()
或func ExampleT
和func ExampleT_M()
这是一些命名规范。func ExampleF()
表示方法或者类别。func ExampleT_M
表示测试类别T的M方法。用于测试的Main函数
测试的Main函数方法定义:
func TestMain(m *testing.M)
。用于在测试前设置一些参数或者在测试后拆卸一些参数。