Come misurare la copertura del codice a Golang?


Risposte:


138

Tieni presente che Go 1.2 (Q4 2013, rc1 è disponibile) ora mostrerà i risultati della copertura del test :

Una delle novità principali di go testè che ora può calcolare e, con l'aiuto di un nuovo go tool coverprogramma " " installato separatamente , visualizzare i risultati della copertura dei test .

Lo coverstrumento fa parte del go.toolssottorepository . Può essere installato eseguendo

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

Lo strumento copertina fa due cose.

  • Per prima cosa, quando " go test" viene assegnato il -coverflag, viene eseguito automaticamente per riscrivere il sorgente per il pacchetto e inserire le istruzioni della strumentazione. Il test viene quindi compilato ed eseguito come al solito e vengono riportate le statistiche di copertura di base:
$ go test -coverprofile fmtcoverage.html fmt
ok      fmt 0.060s  coverage: 91.4% of statements
$

In secondo luogo, per rapporti più dettagliati, diversi flag per "go test" possono creare un file del profilo di copertura, che il programma di copertura, invocato con " go tool cover", può quindi analizzare.

Frank Shearar menziona :

Le ultime versioni di Go (2013/09/19) utilizzano:

go test -coverprofile <filename> <package name>

I dettagli su come generare e analizzare le statistiche di copertura possono essere trovati eseguendo i comandi

$ go help testflag
$ go tool cover -help

Ivan Black menziona nei commenti :

go test -coverprofile cover.oute quindi si
go tool cover -html=cover.outapre cover.outnel browser predefinito

Non voglio nemmeno aspettare che il browser si apra, quindi ho definito questo alias:

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

Ho appena digitato gce ho un elenco di tutte le righe non ancora coperte (qui: con una coverage.outriga che non termina con " 1").


2
Si noti che le ultime versioni di Go (2013/09/19) utilizzanogo test -coverprofile <filename> <package name>
Frank Shearar

@FrankShearar Ok. Ho incluso il tuo commento nella risposta per una maggiore visibilità.
VonC

go test -coverprofile cover.oute quindi go tool cover -html=cover.out -o cover.htmlapri cover.htmlnel browser
Ivan Black

@ IvanBlack buon punto. L'ho incluso nella risposta per una maggiore visibilità. Ho anche aggiunto un alias che uso per vedere rapidamente le righe non coperte.
VonC

1
@VonC go tool cover -html=cover.outaprirà automaticamente un browser, ma non funziona per il mio sistema. Preferisco tenere un browser aperto e aggiornare la pagina se necessario.
Ivan Black

41

Go viene fornito con uno strumento fantastico per test e copertura. Sebbene tutti gli strumenti Go siano ben documentati go tool cover -help, suggerirei di leggere l'articolo di copertina sul blog ufficiale di Go . Ha molti esempi e lo consiglio vivamente!

Ho questa funzione nel mio ~ / .bash_profile. (puoi semplicemente incollarlo nel terminale per provarlo).

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

Quindi basta cdin una cartella go project / package e digita cover. Questo apre uno strumento visivo nel browser che mostra il codice testato e non testato per ogni file nel pacchetto corrente. Comando molto utile! Lo consiglio vivamente per trovare ciò che non è ancora testato al 100%! I risultati visualizzati sono per file. Da un menu a discesa in alto a sinistra puoi vedere i risultati per tutti i file.

Con questo comando puoi anche controllare la copertura di qualsiasi pacchetto ad esempio:

cover fmt

L'output nel terminale da questo comando sarebbe:

ok      fmt 0.031s  coverage: 91.9% of statements

Oltre a ciò nel tuo browser vedrai questo strumento mostrare in rosso tutte le righe di codice che non sono coperte dai test:

inserisci qui la descrizione dell'immagine

È anche possibile salvare semplicemente il file di copertura html invece di aprirlo in un browser. Ciò è molto utile nei casi in cui i test + la copertura vengono eseguiti da uno strumento CI come Jenkins. In questo modo puoi servire i file di copertura da un server centrale e l'intero team sarà in grado di vedere i risultati di copertura per ogni build.



Interessante, lo proverò. +1
VonC

Questo e spettacolare! Grazie per la condivisione. Ho finito per passare a uno script di test perché volevo testare un pacchetto principale nel mio programma. Saluti
James O'Toole

11

Oltre alle buone risposte sopra, trovo che queste tre righe siano il modo più semplice per ottenerlo (che include tutti i pacchetti):

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

Nota che nel file HTML troverai un pulsante a discesa che ti indirizzerà a tutti i file.


5

È proprio qui , alcuni documenti qui .

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

Non l'ho usato, questo è tutto quello che so.


devi installarlo manualmente? nella mia installazione go locale (go versione go1) non è presente.
arriva

Credo che venga creato da ./all.bash. Non riesco a verificare ATM, non sono al rilascio perché ho un CL in sospeso, ma il timestamp binario cov che vedo ~/go/pkg/tool/linux_amd64corrisponde alla mia ultima build Go di ieri.
zzzz

Sì, esegui ./all.bash e lo avrai. Grazie per l'aiuto, jnml!
George Atsev

Ho alcuni problemi a eseguirlo sulla mia macchina x86. Ho provato a cambiare main.c come menzionato in questo thread: groups.google.com/group/golang-dev/browse_thread/thread/… Ma genera un errore di runtime in un'altra posizione. Lo proverò su una macchina a 64 bit.
George Atsev

3

Se ti piace vedere le linee scoperte per funzione direttamente in un terminale ho riscritto lo strumento copertina per questo scopo. È disponibile su https://github.com/gregoryv/uncover .

uso

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

Immagine dello schermo

inserisci qui la descrizione dell'immagine



2

Rapporto di copertura →

a) Eseguire tutti i test e abilitare la copertura -> go test ./... -coverprofile coverage.out

b) Ottieni la copertura per le singole funzioni e la copertura complessiva → go tool cover -func coverage.out

c) Vedi le linee coperte e quelle non coperte dai tuoi test → go tool cover -html=cover.out -o coverage.html. Aprire il coverage.htmlfile qui generato nel browser e analizzare le informazioni dettagliate sulla copertura.


1

Un modo semplice e veloce è utilizzare lo strumento di copertura fornito con go integrato:

$ go test -coverprofile cp.out // Emette la copertura in percentuale di una riga

Dopo aver eseguito il comando precedente, se desideri vedere visivamente la copertura del codice (come istruzioni coperte e mancate ecc.)

$ go tool cover -html = cp.out

Nota: è necessario eseguire i comandi precedenti nella cartella in cui si desidera visualizzare la copertura


1

Ispirato dai menu della guida e da altre risposte a questa domanda, esegui:

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

0

Prova a utilizzare gaia-docker / base-go-build Docker Image.

Questa è un'immagine Docker che contiene tutto ciò di cui hai bisogno per creare e testare la copertura. L'esecuzione della copertura del test all'interno di un contenitore Docker crea la cartella .cover con i risultati della copertura del test del progetto.

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

Lo script di copertura del test viene eseguito su tutte le cartelle dei progetti e viene generato, all'interno di .cover cartella .cover junit, i report di copertura per ciascuna cartella e un report di copertura combinato dei test di tutti i progetti.

Codecov suggerisce anche uno script che raccoglie i risultati della copertura: più file


-1

Copertura del test per Golang

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

Controlla che sia installato correttamente e di avere accesso dal tuo terminale

Esegui il test case

Se esegui il test case, il file .json verrà reimpostato in base al file, otterrai il rapporto sulla copertura del codice nel file .html

gocov test >your_Coverage_report.json

Una volta terminato lo scenario di test, genera un rapporto in file .html utilizzando .json

gocov-html your_Coverage_report.json >your_Coverage_report.html

Riferimento

Strumento di copertura GoTest per go lang

Go Test Report Tool

Metodo alternativo

Vai alla copertura del test nativo

go test -coverprofile=coverage.out
go tool cover -html=coverage.out
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.