Go Test代码覆盖率
go test -v -cover 执行单元测试并计算覆盖率
go test
工具可以用来测试 单元测试的代码覆盖率,示例如下:
$ go test -v -cover
=== RUN TestSum
--- PASS: TestSum (0.00s)
=== RUN TestAbs
--- PASS: TestAbs (0.00s)
PASS
coverage: 85.7% of statements
ok gotest 0.005s
从覆盖率来看(coverage: 85.7% of statements),测试用例没有覆盖全部的代码,只有 85.7% ,可以通过如下命令将 cover 的详细信息保存到 cover.out 中。
$ go test -cover -coverprofile=cover.out -covermode=count
-cover 允许代码分析 -covermode 代码分析模式(set:是否执行;count:执行次数;atomic:次数,并发执行) -coverprofile 输出结果文件
然后再通过
$ go tool cover -func=cover.out
查看每个方法的覆盖率。
$ go tool cover -func=cover.out
gotest/compute.go:5: Sum 100.0%
gotest/compute.go:13: Abs 66.7%
total: (statements) 85.7%
这里发现是 Abs 方法没有覆盖完全,因为我们的用例只用到了正数的那个分支。
还可以使用 html 的方式查看具体的覆盖情况。
$ go tool cover -html=cover.out
会默认打开浏览器,将覆盖情况显示到页面中:
可以看出 Abs 方法的负数分支没有覆盖到。将 TestAbs 方法修改如下即可:
func TestAbs(t *testing.T) {
if Abs(5) != 5 {
t.Fatal("abs error, except:5, result:", Abs(5))
}
if Abs(-4) != 4 {
t.Fatal("abs error, except:4, result:", Abs(-4))
}
}
再次运行:
$ go test -cover -coverprofile=cover2.out -covermode=count
$ go tool cover -func=cover2.out
运行结果如下:
$ go test -cover -coverprofile=cover2.out -covermode=count
PASS
coverage: 100.0% of statements
ok gotest 0.006s
$go tool cover -func=cover2.out
gotest/compute.go:5: Sum 100.0%
gotest/compute.go:13: Abs 100.0%
total: (statements) 100.0%
这个说明已经达到了 100% 的覆盖率了。
命令汇总:
$ go test -v -cover
$ go test -cover -coverprofile=cover.out -covermode=count
$ go tool cover -func=cover.out