• 【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 开头

     

  • 相关阅读:
    Word 操作类库
    Windows服务卸载之后未重启机器之前再安装问题
    Word转Html
    Centos7下配置Python3和Python2共存,以及对应版本Ipython安装配置
    Linux 和Windows之间命令行实现目录或文件互传
    centos下卸载OpenJDK 并安装sun的jdk
    bridged(桥接模式)、NAT(网络地址转换模式)和hostonly(主机模式)VMware下三种网络配置方式
    关于centos启动报错:Failed to start Crash recovery kernel arming的解决方案
    centos7下固定IP(静态IP)网络配置
    【分享】BUG从诞生到灭亡——处理BUG的流程
  • 原文地址:https://www.cnblogs.com/songgj/p/10946808.html
Copyright © 2020-2023  润新知