每个语言都少不了测试的环境,编程中有句话说的好”Debugging Sucks!”,”Testing Rocks”.意思是说,多使用测试,而非调试.
我的开发经验也是如此,当进行调试时,说明是自己的逻辑不够严谨,或者对业务没有深入了解,不知道该如何去测试(输入什么,想要得到什么).
传统测试 VS 表格测试
说到测试就不得不提到,流行的两种测试方法,传统测试和表格测试.传统测试大家都经历过,其实缺点很明显,测试数据与逻辑在一起,当报错时,信息并不明确.并且测试写下来也很费劲.表格测试就是解决这个痛点而提出的一种测试方法,测试数据与测试逻辑分割开,就像写表格一样,写需要测试数据.
总结: 传统测试
- 测试数据与测试逻辑混在一起
- 出错信息不明确(需要看代码)
- 一旦一个数据错误测试全部结束
表格驱动测试
- 分离测试数据与测试逻辑
- 明确错误信息
- 可以部分出错
- go语言的语法使得我们更容易实践表格驱动测试
表格驱动测试
一般我们创建测试类可以直接在需要测试类包下创建,命名已 测试类(方法)_test形式命名.测试方法Test开头:
func TestRriangle(t *testing.T) {//传入参数 t *testing.T
tests := []struct{
a,b,c int
}{
{3,4,5},
{5,12,13},
{8,15,17},
{12,35, 37},
{30000,40000,50000},
}
for _, tt := range tests {
if c:=triangle(tt.a, tt.b) ;c!=tt.c {
t.Errorf("triangle (%d,%d); " +
"got %d; expected %d",tt.a,tt.b,c,tt.c)
}
}
}
测试成功结果打印
=== RUN TestRriangle
--- PASS: TestRriangle (0.00s)
PASS
测试失败打印:
=== RUN TestRriangle
--- FAIL: TestRriangle (0.00s)
triangle_test.go:22: triangle (12,35); got 37; expected 0
FAIL
这样就可以优雅的写出一个简单的表格驱动测试来.
命名行测试
通过命名行我们可以测试更多的信息,进入当当前测试类的文件目录输入: ` go test .`
得到以下信息ok com.cdz/learngo/basic/func 0.003s
代码覆盖率
从编译器的测试按钮上,可以看到:
点击打印:
=== RUN TestFindMaxNoRepeatString
--- PASS: TestFindMaxNoRepeatString (0.00s)
PASS
coverage: 58.8% of statements //覆盖了58.8%
可以点开测试类查看:
这样我们就可以查看测试的代码覆盖情况.
下一节中,我们会着重讲到,测试性能.
作者所有的学习源码在 go学习源码github地址,如果觉得有用的话帮小智贡献一个star😁