2015-02-05 71 views
9

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

回答

7

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

+0

太棒了!我只是将这个[相关golang-nuts线程](https://groups.google.com/forum/#!topic/golang-nuts/fnDBPPUDdQ4)链接起来。 – Simon 2015-02-06 15:56:58

+0

谢谢,西蒙。这确实是我正在寻找的! – 2015-02-09 09:31:41

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 
+0

谢谢您的评论,但这不完全是我所需要的。问题在于覆盖的百分比不包括项目其他包中的代码。我会更新我的问题以反映并更清楚。 – 2015-02-06 10:40:40

+0

@antonevangelatov我明白你的意思了!我会留下这个答案,以防万一有人发现它有用,并且我在你的答案中注明'-coverpkg',谢谢! – 2015-02-06 13:57:16