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

How to measure Golang integration test coverage?

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

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

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

您可以 运行 以创建覆盖率 html 页面的方式进行测试。像这样:

go test -v -coverprofile cover.out ./...
go tool cover -html=cover.out -o cover.html
open cover.html