2015-02-05 96 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