Wie wird die Codeabdeckung in Golang gemessen?

111

Hat es jemand geschafft, Codeabdeckung für Go-Unit-Tests zu generieren? Ich kann kein Tool dafür im Web finden.

George Atsev
quelle

Antworten:

137

Beachten Sie, dass in Go 1.2 (Q4 2013, rc1 ist verfügbar) jetzt die Ergebnisse der Testabdeckung angezeigt werden :

Eine wichtige Neuerung von go testist, dass es jetzt die go tool coverErgebnisse der Testabdeckung berechnen und mithilfe eines neuen, separat installierten " " Programms anzeigen kann .

Das coverTool ist Teil des go.toolsSubrepositorys . Es kann durch Ausführen installiert werden

$ go get golang.org/x/tools/cmd/cover

Das Cover-Tool macht zwei Dinge.

  • Wenn " go test" das -coverFlag erhält , wird es automatisch ausgeführt, um die Quelle für das Paket neu zu schreiben und Instrumentierungsanweisungen einzufügen. Der Test wird dann wie gewohnt kompiliert und ausgeführt, und es werden grundlegende Abdeckungsstatistiken gemeldet:
$ go test -coverprofile fmtcoverage.html fmt
ok      fmt 0.060s  coverage: 91.4% of statements
$

Zweitens können für detailliertere Berichte verschiedene Flags zum "Go-Test" eine Abdeckungsprofildatei erstellen, die das mit " go tool cover" aufgerufene Cover-Programm dann analysieren kann.

Frank Shearar erwähnt :

Die neuesten Versionen von Go (19.09.2013) verwenden:

go test -coverprofile <filename> <package name>

Details zum Generieren und Analysieren von Abdeckungsstatistiken finden Sie durch Ausführen der Befehle

$ go help testflag
$ go tool cover -help

Ivan Black erwähnt in den Kommentaren :

go test -coverprofile cover.outund wird dann in Ihrem Standardbrowser
go tool cover -html=cover.outgeöffnetcover.out

Ich möchte nicht einmal warten, bis der Browser geöffnet wird, deshalb habe ich diesen Alias ​​definiert:

alias gc=grep -v -e " 1$" cover.out

Dass ich nur tippe gcund eine Liste aller noch nicht abgedeckten Zeilen habe (hier: mit einer coverage.outZeile, die nicht mit " 1" endet ).

VonC
quelle
2
Beachten Sie, dass die neuesten Versionen von Go (2013/09/19) verwendengo test -coverprofile <filename> <package name>
Frank Shearar
@FrankShearar Ok. Ich habe Ihren Kommentar zur besseren Sichtbarkeit in die Antwort aufgenommen.
VonC
go test -coverprofile cover.outund dann im Browser go tool cover -html=cover.out -o cover.htmlöffnencover.html
Ivan Black
@ IvanBlack guter Punkt. Ich habe es in die Antwort für mehr Sichtbarkeit aufgenommen. Ich habe auch einen Alias ​​hinzugefügt, mit dem ich nicht abgedeckte Zeilen schnell erkennen kann.
VonC
1
@VonC go tool cover -html=cover.outöffnet automatisch einen Browser, funktioniert aber auf meinem System nicht. Ich ziehe es vor, einen Browser offen zu halten und die Seite bei Bedarf zu aktualisieren.
Ivan Black
40

Go wird mit einem fantastischen Tool zum Testen und zur Abdeckung geliefert. Obwohl alle Go-Tools gut dokumentiert sind, go tool cover -helpwürde ich empfehlen, den Titelartikel im offiziellen Go-Blog zu lesen . Es gibt viele Beispiele und ich kann es nur empfehlen!

Ich habe diese Funktion in meinem ~ / .bash_profile. (Sie können es einfach in das Terminal einfügen, um es auszuprobieren).

cover () { 
    t="/tmp/go-cover.$$.tmp"
    go test -coverprofile=$t $@ && go tool cover -html=$t && unlink $t
}

Dann einfach cdin einen Projekt- / Paketordner gehen und eingebencover . Dies öffnet ein visuelles Tool im Browser, das Ihnen den getesteten und nicht getesteten Code für jede Datei im aktuellen Paket anzeigt. Sehr nützlicher Befehl! Ich empfehle es dringend, um herauszufinden, was noch nicht zu 100% getestet wurde! Die angezeigten Ergebnisse sind pro Datei. In einem Dropdown-Menü oben links sehen Sie die Ergebnisse für alle Dateien.

Mit diesem Befehl können Sie auch die Abdeckung eines Pakets überprüfen, zum Beispiel:

cover fmt

Die Ausgabe dieses Befehls im Terminal wäre:

ok      fmt 0.031s  coverage: 91.9% of statements

Darüber hinaus wird in Ihrem Browser in diesem Tool alle Codezeilen rot angezeigt, die nicht mit Tests abgedeckt sind:

Geben Sie hier die Bildbeschreibung ein

Es ist auch möglich, die HTML-Coverage-Datei einfach zu speichern, anstatt sie in einem Browser zu öffnen. Dies ist sehr nützlich, wenn Ihre Tests + Abdeckung von einem CI-Tool wie Jenkins ausgeführt werden. Auf diese Weise können Sie die Coverage-Dateien von einem zentralen Server aus bereitstellen, und das gesamte Team kann die Coverage-Ergebnisse für jeden Build anzeigen.

Pavel Nikolov
quelle
Snippet von hier kopiert coderwall.com/p/rh-v5a/get-coverage-of-golang-test
Pavel Nikolov
Interessant, ich werde es testen. +1
VonC
Das ist fantastisch! Danke für das Teilen. Am Ende wechselte ich in ein Testskript, als ich ein Hauptpaket in meinem Programm testen wollte. Prost
James O'Toole
11

Zusätzlich zu den guten Antworten oben finde ich diese drei Zeilen der einfachste Weg, um es zu bekommen (der alle Pakete enthält):

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

Beachten Sie, dass Sie in der HTML-Datei eine Dropdown-Schaltfläche finden, die Sie zu allen Dateien weiterleitet.

Sharon Katz
quelle
5

Es ist genau hier , einige Dokumente hier .

$ go tool
6a
6c
6g
6l
addr2line
api
cgo
cov
dist
ebnflint
fix
gotype
nm
objdump
pack
pprof
prof
vet
yacc
$ go tool cov -h
usage: cov [-lsv] [-g substring] [-m minlines] [6.out args...]
-g specifies pattern of interesting functions or files
go tool cov: exit status 1
$

Ich habe es nicht benutzt, das ist alles was ich weiß.

zzzz
quelle
Müssen Sie es manuell installieren? In meiner lokalen go-Installation (go-Version go1) ist sie nicht vorhanden.
Oers
Ich glaube, es wird von ./all.bash erstellt. Ich kann ATM nicht verifizieren, ich bin nicht bei der Veröffentlichung, da ein CL aussteht, aber der Cov-Binärzeitstempel, den ich in sehe, ~/go/pkg/tool/linux_amd64stimmt mit meinem letzten Go-Build von gestern überein.
zzzz
Ja, führen Sie ./all.bash aus und Sie werden es haben. Danke für die Hilfe, jnml!
George Atsev
Ich habe einige Probleme beim Ausführen auf meinem x86-Computer. Ich habe versucht, main.c wie in diesem Thread erwähnt zu ändern: groups.google.com/group/golang-dev/browse_thread/thread/… Es wird jedoch ein Laufzeitfehler an einem anderen Speicherort generiert. Ich werde es auf einem 64-Bit-Computer versuchen.
George Atsev
3

Wenn Sie die unbedeckten Linien nach Funktion direkt in einem Terminal sehen möchten, habe ich das Abdeckungswerkzeug zu diesem Zweck neu geschrieben. Es ist unter https://github.com/gregoryv/uncover verfügbar .

Verwendung

go get -u github.com/gregoryv/uncover/...
go test -coverprofile /tmp/c.out
uncover /tmp/c.out

Bildschirmfoto

Geben Sie hier die Bildbeschreibung ein

dot7
quelle
2

Wenn Sie VSCode verwenden, wird diese Funktionalität sofort unterstützt ( standardmäßig deaktiviert ).

Aktivieren Sie einfach den Test für Save + Coverage Reporting

https://github.com/microsoft/vscode-go/wiki/On-Save-features

In Ihrem Editor wird sogar angezeigt, welche Zeilen nicht abgedeckt sind, was sehr praktisch ist.

Tom Yeoman
quelle
2

Berichterstattungsbericht →

a) Führen Sie alle Tests aus und aktivieren Sie die Abdeckung -> go test ./... -coverprofile coverage.out

b) Abdeckung für einzelne Funktionen sowie Gesamtabdeckung erhalten → go tool cover -func coverage.out

c) Siehe die abgedeckten und die von Ihren Tests nicht abgedeckten Zeilen → go tool cover -html=cover.out -o coverage.html. Öffnen Sie die coverage.htmlhiermit im Browser generierte Datei und analysieren Sie die detaillierten Coverage-Informationen.

Aman Mann
quelle
1

Eine schnelle und einfache Möglichkeit besteht darin, das mit dem integrierten Go gelieferte Coverage-Tool zu verwenden:

$ go test -coverprofile cp.out // Gibt die Abdeckung prozentual in einem Liner aus

Nachdem Sie den obigen Befehl ausgeführt haben, möchten Sie die Codeabdeckung visuell anzeigen (z. B. abgedeckte Anweisungen und verpasste Anweisungen usw.).

$ go tool cover -html = cp.out

Hinweis: Sie müssen die obigen Befehle in dem Ordner ausführen, in dem die Abdeckung angezeigt werden soll

Balaji Boggaram Ramanarayan
quelle
1

Inspiriert von den Hilfemenüs und anderen Antworten auf diese Frage, führen Sie einfach Folgendes aus:

f=cover.out; if [ -f $f ]; then rm $f; fi; go test ./... -coverprofile $f && \
go tool cover -html $f && \
rm $f
030
quelle
0

Versuchen Sie es mit gaia-docker / base-go-build Docker Image.

Dies ist ein Docker-Image, das alles enthält, was Sie zum Erstellen und Testen der Abdeckung benötigen. Durch Ausführen der Testabdeckung in einem Docker-Container wird ein .cover- Ordner mit den Ergebnissen der Testabdeckung Ihres Projekts erstellt.

docker run --rm -v "$PWD":$PROJECT_PATH -w $PROJECT_PATH $BUILDER_IMAGE_NAME /go/script/coverage.sh

Das Testabdeckungsskript wird in allen Projektordnern ausgeführt und in .cover generiert Ordner und Abdeckungsberichte für jeden Ordner sowie einen kombinierten Abdeckungsbericht für alle .

Codecov schlägt außerdem ein Skript vor, das Abdeckungsergebnisse sammelt: mehrere Dateien

Effi Bar-She'an
quelle
-1

Testabdeckung für Golang

go get github.com/axw/gocov/gocov go get -u gopkg.in/matm/v1/gocov-html

Überprüfen Sie, ob es richtig installiert ist und Sie Zugriff von Ihrem Terminal aus haben

Führen Sie den Testfall aus

Wenn Sie den Testfall ausführen, wird die .json-Datei erneut gespeichert. Basierend auf der Datei erhalten Sie den Code Coverage Report in der .html-Datei

gocov test >your_Coverage_report.json

Sobald Ihr Testfall abgeschlossen ist, erstellen Sie mit .json einen Bericht in einer HTML-Datei

gocov-html your_Coverage_report.json >your_Coverage_report.html

Referenz

GoTest Coverage Tool für go lang

Gehen Sie zum Testbericht-Tool

Alternative Methode

Go Native Test-Abdeckung

go test -coverprofile=coverage.out
go tool cover -html=coverage.out
muthukumar selvaraj
quelle