2015-02-05 8 views
9

Ich versuche go test -cover zu verwenden, um die Testabdeckung eines Dienstes zu messen, den ich erstelle. Es ist eine REST-API und ich teste sie, indem ich sie hochfahre, Test-HTTP-Anfragen mache und die HTTP-Antworten überprüfe. Diese Tests sind nicht Teil der Pakete der Dienste und go tool cover gibt 0% Testabdeckung zurück. Gibt es eine Möglichkeit, die tatsächliche Testabdeckung zu erhalten? Ich würde erwarten, dass ein Best-Case-Szenariotest an einem bestimmten Endpunkt mindestens 30 bis 50% des Codes für einen bestimmten Endpunkt-Handler abdecken und weitere Tests für häufige Fehler hinzufügen würde, um dies weiter zu verbessern.Wie misst man die Golang-Integrationstestabdeckung?

Antwort

7

Ich war laufen wies auf die -coverpkg Richtlinie, die das tut, was ich brauche - zu messen s die Testabdeckung in einem bestimmten Paket, auch wenn Tests dieses Paket verwenden und nicht Teil davon sind. Zum Beispiel:

$ 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 

im Vergleich zu

$ go test -cover ./src/api/... 
ok  /api 0.191s coverage: 71.0% of statements 
ok  /api/mypackage 0.023s coverage: 0.7% of statements 

Im obigen Beispiel habe ich Tests in main_test.go, die in package main ist die package mypackage verwendet. Ich bin hauptsächlich an der Abdeckung von package mypackage interessiert, da es 99% der Geschäftslogik im Projekt enthält.

Ich bin ziemlich neu in Go, so ist es durchaus möglich, dass dies nicht der beste Weg ist, Testabdeckung über Integrationstests zu messen.

+0

Großartig! Ich verlinke diesen [relevanten Golang-Nuts-Thread] (https://groups.google.com/forum/#!topic/golang-nuts/fnDBPPUDdQ4). – Simon

+0

Danke, Simon. Das ist in der Tat, was ich gesucht habe! –

1

Soweit ich weiß, wenn Sie Abdeckung wollen, müssen Sie go test -cover ausführen.

Es ist jedoch einfach genug, ein Flag hinzuzufügen, das Sie übergeben können, das diese zusätzlichen Tests aktiviert, damit Sie sie in Ihre Testsuite einfügen, aber nicht normal ausführen können.

hinzufügen So Befehlszeilenparameter in Ihrem whatever_test.go

var integrationTest = flag.Bool("integration-test", false, "Run the integration tests") 

Dann in jedem Test so etwas wie diese

func TestSomething(t *testing.T){ 
    if !*integrationTest { 
     t.Skip("Not running integration test") 
    } 
    // Do some integration testing 
} 

dann die Integrationstests

go run -cover -integration-test 
+0

Vielen Dank für Ihren Kommentar, aber das ist nicht genau das, was ich brauche. Das Problem war, dass der Prozentsatz der Abdeckung den Code in anderen Paketen des Projekts nicht abdeckt. Ich werde meine Frage aktualisieren, um das zu verdeutlichen und sie klarer zu machen. –

+0

@antonevangelatov Ich sehe was du meinst! Ich lasse diese Antwort für den Fall, dass jemand es nützlich findet, und notiere '-coverpkg' in deiner Antwort, danke! –