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

原文地址:https://www.cnblogs.com/lanyangsh/p/14224236.html