我创建一个执行go test -cover
的makefile。如果覆盖率低于X,是否可能使make unit_tests
命令失败?我该怎么办?
答案 0 :(得分:9)
您可以在测试中使用TestMain
来执行此操作。 TestMain可以作为测试的自定义入口点,然后您可以调用testing.Coverage()
来访问coverage统计信息。
例如,如果你想在80%以下的任何事情上失败,你可以将它添加到你的一个包的测试文件中:
func TestMain(m *testing.M) {
// call flag.Parse() here if TestMain uses flags
rc := m.Run()
// rc 0 means we've passed,
// and CoverMode will be non empty if run with -cover
if rc == 0 && testing.CoverMode() != "" {
c := testing.Coverage()
if c < 0.8 {
fmt.Println("Tests passed but coverage failed at", c)
rc = -1
}
}
os.Exit(rc)
}
然后go test -cover
将调用此入口点,您将失败:
PASS
coverage: 63.0% of statements
Tests passed but coverage failed at 0.5862068965517241
exit status 255
FAIL github.com/xxxx/xxx 0.026s
请注意,testing.Coverage()
返回的数字低于测试报告的数字。我查看了代码,函数计算的覆盖范围与测试的内部报告不同。我不确定哪个更“正确”。