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


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


10142
2018-02-05 16:27


起源



答案:


我被指出了 -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的新手,所以很可能这不是通过集成测试来衡量测试覆盖率的最佳方法。


10
2018-02-06 10:52



大!我只是链接这个 相关的golang-nuts线程。 - Simon
谢谢,西蒙。这确实是我在寻找的! - Anton Evangelatov


答案:


我被指出了 -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的新手,所以很可能这不是通过集成测试来衡量测试覆盖率的最佳方法。


10
2018-02-06 10:52



大!我只是链接这个 相关的golang-nuts线程。 - Simon
谢谢,西蒙。这确实是我在寻找的! - Anton Evangelatov


据我所知,如果你想要覆盖,你需要运行 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

1
2018-02-05 17:56



感谢您的评论,但这不是我需要的。问题是覆盖率不包括项目其他包中的代码。我会更新我的问题以反映这一点,并使其更清楚。 - Anton Evangelatov
@antonevangelatov我明白你的意思了!我会留下这个答案,万一有人发现它有用,我注意到了 -coverpkg 在你的回答中,谢谢! - Nick Craig-Wood