如何衡量Golang集成测试覆盖率?

时间:2015-02-05 16:27:45

标签: testing go code-coverage test-coverage

我正在尝试使用go test -cover来衡量我正在构建的服务的测试覆盖率。它是一个REST API,我通过旋转它来测试它,发出测试HTTP请求并查看HTTP响应。这些测试不是服务包的一部分,go tool cover返回0%测试覆盖率。有没有办法获得实际的测试覆盖率?我希望在给定端点上进行最佳案例测试,以覆盖特定端点处理程序的至少30-50%的代码,并通过添加更多常见错误测试来进一步改进。

3 个答案:

答案 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