【Golang】Golang测试及性能优化

 

代码测试

  当开发人员开发好程序后还需要对代码进行测试,可以发现程序中可能存在的问题,测试可以分为传统测试和表格驱动测试,而表格驱动的单元测试技术相比传统测试有很多优点,下面对比下。

  

  传统测试和表格驱动测试对比

  1. 传统测试

    看看下面一段传统测试代码,是对一个加法函数add的单元测试,assertEquals函数是测试函数,它的第一个参数表示期待的值,第二个参数是实际算出来的值,assertEquals会比较这两个值是否相等。

@Test public void testAdd() {
    assertEquals(3, add(1, 2));
    assertEquals(2, add(0, 2));
    assertEquals(0, add(0, 0));
    assertEquals(0, add(-1, 1));
    assertEquals(Integer.MIN_VALUE, add(1, Integer.MAX_VALUE));
}

 

  传统测试缺点:

    1. 测试数据和测试逻辑混在一起。上面add是测试逻辑,而里面的数字3 1 2是测试数据。

    2. 出错信息不明确。比如说期待结果是 3 但实际算出来是4,但是它不会告诉你add(1,2)算出来是4,那么我们要去看代码,多一个环节。

    3. 一旦一个数据出错测试全部结束。因为是assert,如果错了一批改一批。

 

  2. 表格驱动测试

    看看下面一段表格驱动测试代码。

    定一个一个结构体,里面有几个属性值,表示期望a + b = c。然后再将一大段测试数据写在下面,就像一个表格一样。

tests := []struct {
    a, b, c int32
} {
    {1,2,3},
    {0,2,2},
    {0,0,0},
    {-1,1,0},
    {math.MaxInt32, 1, math.MinInt32},
}
for _, test : range tests {
    if actual := add(test.a, test.b); actual != test.c {
        ........
    }
}

 

  表格测试优点:

    1. 分离测试数据于测试逻辑。

    2. 明确的出错信息, 可以自定义。

    3. 可以部分失败。

    4. go语言的语法可以使我们更容易实践表格驱动测试。比如java写起来就很麻烦。

 

    go 语言原生支持了单元测试,并且go语言属于表格驱动测试。

 

golang表格驱动测试

  go语言使用测试非常简单,测试代码只需要放到以 _test.go 结尾的文件中即可。

  basic.go  被测试文件保护被测试函数calcTriangle

package main

import (
   "fmt"
   "math"
)

func triangle() {
   var a, b int = 3, 4
   fmt.Println(calcTriangle(a, b))
}

func calcTriangle(a, b int) int {
   var c int
   c = int(math.Sqrt(float64(a*a + b*b)))
   return c
}

func main(){

}

 

triangle_test.go  测试文件

package main 

import (
    "testing"    // go测试需要引入testing包,提供对 Go 包的自动化测试的支持
)

func TestTriangle(t *testing.T){
    tests := []struct{
        a, b, c int
    }{
        {3, 4, 5},
        {5, 12, 13},
        {8, 15, 17},
        {12, 35, 37},
    }
    
    for _, tt := range tests {    
        if actual := calcTriangle(tt.a, tt.b); actual != tt.c{
            t.Errorf("Triangle(%d, %d) got %d, expacted %d", tt.a, tt.b, actual, tt.c)
        }
        
    } 
    
}

   点击编辑器的run test 开始运行,得到结果是通过。

  

   当然我们也可以在命令行中进行测试

  

   查看代码覆盖率

  

   执行go tool cover -html=c.out 默认打开浏览器显示结果

  

 

 

golang性能测试

  golang的测试除了单元测试还可以性能测试。单元测试的测试用例以 Test 开头,性能测试以 Benchmark 开头

 

 

posted @ 2019-05-29 22:42  songguojun  阅读(393)  评论(0编辑  收藏  举报