我正在尝试用来go test -cover
衡量我正在构建的服务的测试覆盖率。它是一个 REST API,我正在通过旋转它、发出测试 HTTP 请求并查看 HTTP 响应来对其进行测试。这些测试不是服务包的一部分,并go tool cover
返回 0% 的测试覆盖率。有没有办法获得实际的测试覆盖率?我希望在给定端点上的最佳案例场景测试能够覆盖特定端点处理程序的至少 30-50% 的代码,并通过添加更多常见错误测试来进一步改进这一点。
问问题
6272 次
3 回答
17
我被指出了该-coverpkg
指令,它可以满足我的需要 - 测量特定包中的测试覆盖率,即使测试使用此包而不是它的一部分。例如:
$ go test -cover -coverpkg mypackage ./src/api/...
ok /api 0.190s coverage: 50.8% of statements in mypackage
ok /api/mypackage 0.022s coverage: 0.7% of statements in mypackage
相比
$ go test -cover ./src/api/...
ok /api 0.191s coverage: 71.0% of statements
ok /api/mypackage 0.023s coverage: 0.7% of statements
在上面的示例中,我进行了测试,main_test.go
其中 is in package main
that is using package mypackage
. 我最感兴趣的是它的覆盖范围,package mypackage
因为它包含了项目中 99% 的业务逻辑。
我对 Go 很陌生,所以这很可能不是通过集成测试来衡量测试覆盖率的最佳方法。
于 2015-02-06T10:52:03.077 回答
2
您可以以创建覆盖率 html 页面的方式运行 go test。像这样:
go test -v -coverprofile cover.out ./...
go tool cover -html=cover.out -o cover.html
open cover.html
于 2018-11-08T21:01:12.390 回答
1
据我所知,如果你想要覆盖,你需要运行go test -cover
.
但是,添加一个可以传递的标志很容易,它将启用这些额外的测试,因此您可以将它们作为测试套件的一部分但不要正常运行它们。
所以在你的whatever_test.go
var integrationTest = flag.Bool("integration-test", false, "Run the integration tests")
然后在每个测试中做这样的事情
func TestSomething(t *testing.T){
if !*integrationTest {
t.Skip("Not running integration test")
}
// Do some integration testing
}
然后运行集成测试
go run -cover -integration-test
于 2015-02-05T17:56:54.653 回答