Golang学习笔记十九

测试

Posted by CDz on March 16, 2019

每个语言都少不了测试的环境,编程中有句话说的好”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

代码覆盖率

从编译器的测试按钮上,可以看到:

代码覆盖率1

点击打印:

=== RUN   TestFindMaxNoRepeatString
--- PASS: TestFindMaxNoRepeatString (0.00s)
PASS
coverage: 58.8% of statements //覆盖了58.8%

可以点开测试类查看:

代码覆盖率2

这样我们就可以查看测试的代码覆盖情况.

下一节中,我们会着重讲到,测试性能.


作者所有的学习源码在 go学习源码github地址,如果觉得有用的话帮小智贡献一个star😁