zoukankan      html  css  js  c++  java
  • golang 单元测试覆盖率

    单元测试是代码质量的重要保证,测试覆盖率是关键的衡量指标。

    在golang 中,通过go test 进行单元测试,并可以分析覆盖率。

    单元测试覆盖率

    示例代码

    首先看下示例代码。

    新建目录utils,目录有以下文件

     ll
    total 16
    -rw-r--r--  1 lanyang  staff   132B 12 31 21:09 add_hint.go
    -rw-r--r--  1 lanyang  staff   360B 12 31 21:09 add_hint_test.go
    

    add_hint.go 文件内容如下:

    package utils
    
    func AddPrefix(s string) string {
    
            return "good " + s
    }
    
    
    
    func AddSuffix(s string) string {
    
            return s + "!"
    }
    
    

    add_hint_test.go 文件内容如下:

    package utils
    
    import (
            "testing"
            "strings"
    )
    
    
    func TestAddPrefix(t *testing.T) {
    
            src := "boy"
            dst := AddPrefix(src)
    
            if !strings.HasPrefix(dst, "good") {
                    t.Fatalf("unexpected dst:%s", dst)
            }
    }
    
    func TestAddSufffix(t *testing.T) {
            src := "good"
            dst := AddSuffix(src)
    
            if !strings.HasSuffix(dst, "!") {
                    t.Fatalf("unexpected dst:%s", dst)
            }
    }
    

    以上代码分别在字符串头部和尾部分别添加字符串前缀和后缀。

    执行单元测试

    go test -v -covermode=set -coverprofile=hint_test.out ./
    === RUN   TestAddPrefix
    --- PASS: TestAddPrefix (0.00s)
    === RUN   TestAddSufffix
    --- PASS: TestAddSufffix (0.00s)
    PASS
    coverage: 100.0% of statements
    ok  	_/go_exercise/utils	0.007s	coverage: 100.0% of statements
    

    从终端输出,可以看到整体的测试情况。

    其中,

    -covermode 有三种模式:

    • set 语句是否执行,默认模式
    • count 每个语句执行次数
    • atomic 类似于count,表示并发程序中的精确技术

    -coverprofile是统计信息保存的文件。

    这里指定的输出文件是hint_test.out,其内容如下:

    mode: set
    /go_exercise/utils/add_hint.go:4.33,7.2 1 1
    /go_exercise/utils/add_hint.go:11.33,14.2 1 1
    

    生成coverprofile后,当前目录下文件列表如下:

    ll
    total 24
    -rw-r--r--  1 lanyang  staff   132B 12 31 21:09 add_hint.go
    -rw-r--r--  1 lanyang  staff   457B  1  2 20:37 add_hint_test.go
    -rw-r--r--  1 lanyang  staff   164B  1  2 20:38 hint_test.out
    

    查看具体的测试覆盖情况

    上面终端输出中,可以看到整体的覆盖率。但没有每个更具体的覆盖情况。

    下面通过使用刚才生成的profile文件具体看下覆盖情况。

    (1)查看每个函数的覆盖情况:

     go tool cover -func=hint_test.out
    /go_exercise/utils/add_hint.go:4:	AddPrefix	100.0%
    /go_exercise/utils/add_hint.go:11:	AddSuffix	100.0%
    total:									(statements)	100.0%
    

    (2)使用网页方式展示覆盖率情况

    go tool cover -html=hint_test.out
    

    执行命令后,跳出浏览器页面以图形化的方式展示测试覆盖情况。

    在这里插入图片描述

    从图中可以看到,根据颜色就可以分辨出哪些代码已覆盖,哪些代码没覆盖。

    如果需要测试当前目录下所有package 的单元测试覆盖情况,可执行

    go test -v -covermod=set -coverprofile=all_pkg.out ./...
    

    ./... 表示当前目录及其子目录下的所有package。

    参考

    Go的测试覆盖率

    GO Command cover

  • 相关阅读:
    VS2017专业版和企业版激活密钥
    jquery 中的回调函数,回调函数(callback)是什么?
    artDialog
    MVC 5 视图之公用代码
    联想服务器thinkserver rd650安装 windows server 2008 r2
    c#类库中使用Session
    C#导出Excel按照指定格式设置单元格属性值
    visual studio 2017使用NHibernate4.0连接oracle11g数据库
    NHibernate连接oracle报错
    第五章 面向方面编程___通知类型
  • 原文地址:https://www.cnblogs.com/lanyangsh/p/14224236.html
Copyright © 2011-2022 走看看