单元测试是代码质量的重要保证,测试覆盖率是关键的衡量指标。
在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 ./...
./...
参考