Bagaimana mengukur cakupan kode di Golang?

113

Adakah yang berhasil menghasilkan cakupan kode untuk pengujian unit Go? Saya tidak dapat menemukan alat untuk itu di web.

George Atsev
sumber

Jawaban:

138

Perhatikan bahwa Go 1.2 (Q4 2013, rc1 tersedia) sekarang akan menampilkan hasil cakupan pengujian :

Salah satu fitur baru yang utama go testadalah bahwa ia sekarang dapat menghitung dan, dengan bantuan dari go tool coverprogram " " baru yang dipasang secara terpisah , menampilkan hasil cakupan pengujian .

The coveralat merupakan bagian dari go.toolssubrepository . Itu dapat diinstal dengan menjalankan

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

Alat penutup melakukan dua hal.

  • Pertama, ketika go testdiberi -coverbendera, " " dijalankan secara otomatis untuk menulis ulang sumber paket dan menyisipkan pernyataan instrumentasi. Tes ini kemudian disusun dan dijalankan seperti biasa, dan statistik cakupan dasar dilaporkan:
$ go test -coverprofile fmtcoverage.html fmt
ok      fmt 0.060s  coverage: 91.4% of statements
$

Kedua, untuk laporan yang lebih mendetail, tanda yang berbeda untuk "uji coba" dapat membuat file profil cakupan, yang go tool coverkemudian dapat dianalisis oleh program sampul, yang dipanggil dengan " ".

Frank Shearar menyebutkan :

Versi terbaru Go (2013/09/19) menggunakan:

go test -coverprofile <filename> <package name>

Rincian tentang cara menghasilkan dan menganalisis statistik cakupan dapat ditemukan dengan menjalankan perintah

$ go help testflag
$ go tool cover -help

Ivan Black menyebutkan di komentarnya :

go test -coverprofile cover.outdan kemudian
go tool cover -html=cover.outterbuka cover.outdi browser default Anda

Saya bahkan tidak ingin menunggu browser dibuka, jadi saya mendefinisikan alias ini:

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

Bahwa saya hanya mengetik gc, dan memiliki daftar semua garis tidak belum dibahas (di sini: dengan coverage.outgaris tidak berakhir dengan " 1").

VonC
sumber
2
Perhatikan bahwa versi terbaru Go (2013/09/19) menggunakango test -coverprofile <filename> <package name>
Frank Shearar
@Tokopedia Saya telah memasukkan komentar Anda dalam jawaban untuk visibilitas lebih lanjut.
VonC
go test -coverprofile cover.outdan kemudian go tool cover -html=cover.out -o cover.htmlbuka cover.htmldi browser
Ivan Black
@Ivan poin bagus. Saya telah memasukkannya dalam jawaban untuk visibilitas lebih. Saya juga menambahkan alias yang saya gunakan untuk melihat garis yang tidak tertutup dengan cepat.
VonC
1
@VonC go tool cover -html=cover.outakan secara otomatis membuka browser, tetapi tidak berfungsi untuk sistem saya. Saya lebih memilih untuk tetap membuka browser dan menyegarkan halaman jika perlu.
Ivan Black
41

Go hadir dengan alat yang luar biasa untuk pengujian dan cakupan. Meskipun semua alat Go terdokumentasi dengan baik, go tool cover -helpsaya sarankan membaca artikel cerita sampul di blog resmi Go . Ini memiliki banyak contoh dan saya sangat merekomendasikannya!

Saya memiliki fungsi ini di ~ / .bash_profile saya. (Anda bisa menempelkannya di terminal untuk mencobanya).

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

Kemudian cdmasuk ke folder go project / package dan ketik cover. Ini membuka alat visual di browser yang menunjukkan kepada Anda kode yang diuji dan belum diuji untuk setiap file dalam paket saat ini. Perintah yang sangat berguna! Saya sangat merekomendasikannya untuk menemukan apa yang belum 100% diuji! Hasil yang ditampilkan adalah per file. Dari drop-down di kiri atas, Anda dapat melihat hasil untuk semua file.

Dengan perintah ini Anda juga dapat memeriksa cakupan paket apa pun, misalnya:

cover fmt

Output di terminal dari perintah ini adalah:

ok      fmt 0.031s  coverage: 91.9% of statements

Selain itu di browser Anda, Anda akan melihat alat ini menunjukkan semua baris kode berwarna merah yang tidak tercakup dalam tes:

masukkan deskripsi gambar di sini

Anda juga dapat menyimpan file cakupan html alih-alih membukanya di browser. Ini sangat berguna jika pengujian + cakupan Anda dijalankan oleh alat CI seperti Jenkins. Dengan begitu, Anda dapat menyajikan file cakupan dari server pusat dan seluruh tim akan dapat melihat hasil cakupan untuk setiap build.

Pavel Nikolov
sumber
Cuplikan disalin dari sini coderwall.com/p/rh-v5a/get-coverage-of-golang-test
Pavel Nikolov
Menarik, saya akan mengujinya. +1
VonC
Ini luar biasa! Terima kasih telah berbagi. Akhirnya pindah ke skrip pengujian karena saya ingin menguji paket utama dalam program saya. Cheers
James O'Toole
11

Selain jawaban bagus di atas, saya menemukan tiga baris ini sebagai cara termudah untuk mendapatkannya (yang mencakup semua paket):

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

Perhatikan bahwa di file HTML Anda akan menemukan tombol dropdown yang akan mengarahkan Anda ke semua file.

Sharon Katz
sumber
5

Ada di sini , beberapa dokumen di sini .

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

Saya belum pernah menggunakannya, hanya ini yang saya tahu.

zzzz
sumber
apakah Anda harus menginstalnya secara manual? di instalasi go lokal saya (go versi go1) tidak ada.
oers
Saya percaya itu dibangun oleh ./all.bash. Saya tidak dapat memverifikasi ATM, saya tidak dalam rilis karena saya memiliki CL tertunda, tetapi stempel waktu biner cov yang saya lihat ~/go/pkg/tool/linux_amd64cocok dengan versi Go terakhir saya kemarin.
zzzz
Ya, jalankan ./all.bash dan Anda akan mendapatkannya. Terima kasih atas bantuannya, jnml!
George Atsev
Saya mengalami beberapa masalah saat menjalankannya di mesin x86 saya. Saya mencoba mengubah main.c seperti yang disebutkan di utas ini: groups.google.com/group/golang-dev/browse_thread/thread/… Tapi itu menghasilkan kesalahan runtime di lokasi lain. Saya akan mencobanya di mesin 64 bit.
George Atsev
3

Jika Anda ingin melihat garis-garis yang tidak tercakup oleh fungsinya secara langsung di terminal, saya menulis ulang alat sampul untuk tujuan ini. Ini tersedia di https://github.com/gregoryv/uncover .

Pemakaian

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

Screenshot

masukkan deskripsi gambar di sini

dot7
sumber
2

Jika Anda menggunakan VSCode , fungsionalitas ini didukung di luar kotak ( Tapi dinonaktifkan secara default )

Cukup aktifkan pengujian pada penyimpanan + pelaporan cakupan

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

Ini bahkan akan menunjukkan di editor Anda garis mana yang tidak tercakup yang sangat berguna.

Tom Yeoman
sumber
2

Laporan Cakupan →

a) Jalankan semua tes dan aktifkan cakupan -> go test ./... -coverprofile coverage.out

b) Dapatkan cakupan untuk fungsi individu serta cakupan keseluruhan → go tool cover -func coverage.out

c) Lihat garis yang tercakup dan yang tidak tercakup dalam pengujian Anda → go tool cover -html=cover.out -o coverage.html. Buka coverage.htmlfile yang dibuat dengan ini di browser dan analisis info cakupan terperinci.

Aman Mann
sumber
1

Cara cepat dan mudah adalah dengan menggunakan alat cakupan yang disertakan dengan fitur bawaan:

$ go test -coverprofile cp.out // Memberikan cakupan dalam satu persentase liner

Setelah Anda menjalankan perintah di atas, jika Anda ingin melihat secara visual cakupan kode (seperti pernyataan tertutup dan tidak terjawab dll)

$ go tool cover -html = cp.out

Catatan: Anda perlu menjalankan perintah di atas di folder tempat Anda ingin melihat cakupan

Balaji Boggaram Ramanarayan
sumber
1

Terinspirasi oleh menu bantuan dan jawaban lain untuk pertanyaan ini, jalankan saja:

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

Coba gunakan Gambar Docker gaia-docker / base-go-build .

Ini adalah image Docker yang berisi semua yang Anda butuhkan untuk membangun dan menguji cakupan. Menjalankan cakupan pengujian di dalam container Docker membuat folder .cover dengan hasil cakupan pengujian project Anda.

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

The cakupan tes Script berjalan pada semua proyek folder dan menghasilkan, di dalam .cover folder JUnit dan cakupan laporan untuk setiap folder, dan laporan cakupan dari semua proyek menggabungkan tes.

Codecov juga menyarankan skrip yang mengumpulkan hasil cakupan: banyak file

Effi Bar-She'an
sumber
-1

Cakupan Tes untuk Golang

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

Periksa Sudah Dipasang dengan Benar Dan Anda memiliki akses dari Terminal Anda

Jalankan Test Case

Jika Anda menjalankan uji kasus itu akan Reder File .json Berdasarkan file Anda akan mendapatkan Laporan Cakupan Kode dalam file .html

gocov test >your_Coverage_report.json

Setelah Test case Anda selesai Buat Laporan dalam File .html menggunakan .json

gocov-html your_Coverage_report.json >your_Coverage_report.html

Referensi

Alat Cakupan GoTest untuk go lang

Buka Alat Laporan Uji

Metode Alternatif

Pergi cakupan Tes Asli

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