Jak mierzyć pokrycie kodu w Golang?

114

Czy komuś udało się wygenerować pokrycie kodu dla testów jednostkowych Go? Nie mogę znaleźć odpowiedniego narzędzia w sieci.

George Atsev
źródło

Odpowiedzi:

139

Zwróć uwagę, że Go 1.2 (Q4 2013, rc1 jest dostępne) wyświetli teraz wyniki pokrycia testowego :

Jedną z głównych nowych funkcji programu go testjest to, że może teraz obliczać i, z pomocą nowego, oddzielnie zainstalowanego go tool coverprogramu, " " wyświetlać wyniki pokrycia testów .

coverNarzędzie jest częścią go.toolssubrepository . Można go zainstalować, uruchamiając

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

Narzędzie do okładek ma dwie rzeczy.

  • Po pierwsze, kiedy „ go test” otrzyma -coverflagę, jest uruchamiane automatycznie w celu przepisania źródła pakietu i wstawienia instrukcji instrumentacji. Następnie test jest kompilowany i uruchamiany w zwykły sposób oraz raportowane są podstawowe statystyki pokrycia:
$ go test -coverprofile fmtcoverage.html fmt
ok      fmt 0.060s  coverage: 91.4% of statements
$

Po drugie, w celu uzyskania bardziej szczegółowych raportów, różne flagi do „testu przejścia” mogą tworzyć plik profilu pokrycia, który program pokrycia, wywoływany za pomocą „ go tool cover”, może następnie przeanalizować.

Frank Shearar wspomina :

Najnowsze wersje Go (2013/09/19) wykorzystują:

go test -coverprofile <filename> <package name>

Szczegółowe informacje na temat generowania i analizowania statystyk pokrycia można znaleźć, uruchamiając polecenia

$ go help testflag
$ go tool cover -help

Ivan Black w komentarzach wspomina :

go test -coverprofile cover.outa następnie
go tool cover -html=cover.outotwiera się cover.outw domyślnej przeglądarce

Nie chcę nawet czekać na otwarcie przeglądarki, więc zdefiniowałem ten alias:

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

Że po prostu piszę gci mam listę wszystkich linii, które jeszcze nie zostały omówione (tutaj: z coverage.outlinią nie kończącą się na „ 1”).

VonC
źródło
2
Zauważ, że najnowsze wersje Go (2013/09/19) używajągo test -coverprofile <filename> <package name>
Frank Shearar
@FrankShearar Ok. W odpowiedzi zawarłem Twój komentarz, aby uzyskać lepszą widoczność.
VonC
go test -coverprofile cover.outa następnie go tool cover -html=cover.out -o cover.htmlotwórz cover.htmlw przeglądarce
Ivan Black
@IvanBlack dobra uwaga. Zawarłem to w odpowiedzi dla większej widoczności. Dodałem również alias, którego używam, aby szybko zobaczyć nieobjęte linie.
VonC
1
@VonC go tool cover -html=cover.outautomatycznie otworzy przeglądarkę, ale nie działa w moim systemie. Wolę mieć otwartą przeglądarkę i w razie potrzeby odświeżyć stronę.
Ivan Black
41

Go zawiera niesamowite narzędzie do testowania i pokrycia. Chociaż wszystkie narzędzia Go są dobrze udokumentowane go tool cover -help, proponuję przeczytać artykuł z okładki na oficjalnym blogu Go . Ma mnóstwo przykładów i gorąco go polecam!

Mam tę funkcję w moim ~ / .bash_profile. (możesz po prostu wkleić go do terminala, aby spróbować).

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

Następnie po prostu cddo folderu projektu / pakietu go i wpisz cover. Otwiera to wizualne narzędzie w przeglądarce, które pokazuje przetestowany i nieprzetestowany kod dla każdego pliku w bieżącym pakiecie. Bardzo przydatne polecenie! Zdecydowanie polecam do znalezienia czegoś, co nie jest jeszcze w 100% przetestowane! Wyświetlane wyniki są według pliku. Z listy rozwijanej w lewym górnym rogu możesz zobaczyć wyniki dla wszystkich plików.

Za pomocą tego polecenia możesz również sprawdzić pokrycie dowolnego pakietu, na przykład:

cover fmt

Dane wyjściowe w terminalu z tego polecenia byłyby:

ok      fmt 0.031s  coverage: 91.9% of statements

Oprócz tego w przeglądarce zobaczysz to narzędzie pokazujące na czerwono wszystkie linie kodu, które nie są objęte testami:

wprowadź opis obrazu tutaj

Możliwe jest również zapisanie pliku pokrycia html zamiast otwierania go w przeglądarce. Jest to bardzo przydatne w przypadkach, gdy testy + pokrycie są uruchamiane przez narzędzie CI, takie jak Jenkins. W ten sposób możesz obsługiwać pliki pokrycia z centralnego serwera, a cały zespół będzie mógł zobaczyć wyniki pokrycia dla każdej kompilacji.

Pavel Nikolov
źródło
Fragment
Pavel Nikolov
Ciekawe, przetestuję to. +1
VonC
To jest niesamowite! Dzięki za udostępnienie. Skończyło się na przejściu do skryptu testowego, ponieważ chciałem przetestować główny pakiet w moim programie. Pozdrawiam
James O'Toole
11

Oprócz dobrych odpowiedzi powyżej, uważam, że te trzy wiersze są najprostszym sposobem na uzyskanie tego (co obejmuje wszystkie pakiety):

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

Zwróć uwagę, że w pliku HTML znajduje się przycisk rozwijany, który przekieruje Cię do wszystkich plików.

Sharon Katz
źródło
5

To prawda tutaj , niektóre docs tutaj .

$ 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
$

Nie użyłem tego, to wszystko, co wiem.

zzzz
źródło
czy musisz zainstalować to ręcznie? w mojej lokalnej instalacji go (wersja go1) go tam nie ma.
oferuje
Wierzę, że zostanie zbudowany przez ./all.bash. Nie mogę zweryfikować bankomatu, nie jestem na etapie wydania, ponieważ mam oczekujące CL, ale binarny znacznik czasu cov, który widzę w ~/go/pkg/tool/linux_amd64meczach mojej ostatniej wczorajszej kompilacji Go.
zzzz
Tak, uruchom ./all.bash i będziesz go mieć. Dzięki za pomoc, jnml!
George Atsev
Mam problemy z uruchomieniem go na mojej maszynie x86. Próbowałem zmienić main.c, jak wspomniano w tym wątku: groups.google.com/group/golang-dev/browse_thread/thread/… Ale generuje to błąd w czasie wykonywania w innej lokalizacji. Spróbuję to na komputerze 64-bitowym.
George Atsev
3

Jeśli chcesz zobaczyć odsłonięte linie według funkcji bezpośrednio w terminalu, przepisałem w tym celu narzędzie okładki. Jest dostępny pod adresem https://github.com/gregoryv/uncover .

Stosowanie

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

Zrzut ekranu

wprowadź opis obrazu tutaj

dot7
źródło
2

Jeśli używasz VSCode, ta funkcja jest obsługiwana po wyjęciu z pudełka ( ale domyślnie wyłączona )

Po prostu włącz test na zapisywanie + raportowanie pokrycia

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

Pokaże nawet w twoim edytorze, które linie nie są zakryte, co jest bardzo przydatne.

Tom Yeoman
źródło
2

Raport pokrycia →

a) Uruchom wszystkie testy i włącz pokrycie -> go test ./... -coverprofile coverage.out

b) Uzyskaj zasięg dla poszczególnych funkcji, a także ogólny zasięg → go tool cover -func coverage.out

c) Zobacz omówione linie i te, które nie zostały objęte testami → go tool cover -html=cover.out -o coverage.html. Otwórz coverage.htmlwygenerowany plik w przeglądarce i przeanalizuj szczegółowe informacje o zasięgu.

Aman Mann
źródło
1

Szybkim i łatwym sposobem jest użycie narzędzia pokrycia, które jest dostarczane z wbudowanym go:

$ go test -coverprofile cp.out // Emituje pokrycie w procentach jednej linijki

Po wykonaniu powyższego polecenia, jeśli chcesz wizualnie zobaczyć pokrycie kodu (takie jak pokryte instrukcje i pominięte itp.)

$ go tool cover -html = cp.out

Uwaga: powyższe polecenia musisz wykonać w folderze, w którym chcesz zobaczyć pokrycie

Balaji Boggaram Ramanarayan
źródło
1

Zainspirowany menu pomocy i innymi odpowiedziami na to pytanie, po prostu uruchom:

f=cover.out; if [ -f $f ]; then rm $f; fi; go test ./... -coverprofile $f && \
go tool cover -html $f && \
rm $f
030
źródło
0

Spróbuj użyć obrazu platformy Docker gaia-docker / base-go-build .

To jest obraz Dockera, który zawiera wszystko, czego potrzebujesz do tworzenia i testowania pokrycia. Uruchomienie pokrycia testowego w kontenerze Docker tworzy folder .cover z wynikami pokrycia testowego projektu.

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

Skrypt pokrycia Test działa na wszystkich projektów foldery i generuje wewnątrz .Chronić folderu JUnit i zakres raportów dla każdego folderu i połączyć raport pokrycia wszystkich projektów testów.

Codecov sugeruje również skrypt, który zbiera wyniki pokrycia: wiele plików

Effi Bar-She'an
źródło
-1

Pokrycie testowe dla Golang

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

Sprawdź, czy jest poprawnie zainstalowany. Masz dostęp ze swojego terminala

Uruchom przypadek testowy

Jeśli uruchomisz przypadek testowy, poprawi on plik .json Na podstawie pliku otrzymasz Raport pokrycia kodu w pliku .html

gocov test >your_Coverage_report.json

Po zakończeniu testu wygeneruj raport w pliku .html za pomocą .json

gocov-html your_Coverage_report.json >your_Coverage_report.html

Odniesienie

Narzędzie pokrycia GoTest dla go lang

Narzędzie do raportowania testów Go

Metoda alternatywna

Przejdź do testu natywnego

go test -coverprofile=coverage.out
go tool cover -html=coverage.out
muthukumar selvaraj
źródło