我正在尝试使用go test -cover
来衡量我正在构建的服务的测试覆盖率。它是一个REST API,我通过旋转它来测试它,发出测试HTTP请求并查看HTTP响应。这些测试不是服务包的一部分,go tool cover
返回0%测试覆盖率。有没有办法获得实际的测试覆盖率?我希望在给定端点上进行最佳案例测试,以覆盖特定端点处理程序的至少30-50%的代码,并通过添加更多常见错误测试来进一步改进。
答案 0 :(得分:12)
我被指向-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
中的package main
使用package mypackage
进行了测试。我最感兴趣的是package mypackage
的覆盖范围,因为它包含项目中99%的业务逻辑。
我是Go的新手,所以很可能这不是通过集成测试来衡量测试覆盖率的最佳方式。
答案 1 :(得分:2)
据我所知,如果你想覆盖,你需要运行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
答案 2 :(得分:1)
您可以通过创建coverage html页面的方式运行go测试。像这样:
go test -v -coverprofile cover.out ./...
go tool cover -html=cover.out -o cover.html
open cover.html