Làm thế nào để đo lường độ phủ của mã trong Golang?


113

Có ai đã thành công trong việc tạo vùng phủ mã cho các bài kiểm tra đơn vị Go không? Tôi không thể tìm thấy một công cụ nào cho việc đó trên web.

Câu trả lời:


138

Lưu ý rằng Go 1.2 (Q4 2013, rc1 khả dụng) bây giờ sẽ hiển thị kết quả kiểm tra phạm vi :

Một tính năng mới chính go testgiờ đây nó có thể tính toán và với sự trợ giúp từ một go tool coverchương trình "" mới được cài đặt riêng , hiển thị kết quả kiểm tra phạm vi .

Công covercụ này là một phần của go.toolskho lưu trữ con . Nó có thể được cài đặt bằng cách chạy

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

Công cụ bìa thực hiện hai điều.

  • Đầu tiên, khi " go test" được -covergắn cờ, nó sẽ tự động chạy để viết lại nguồn cho gói và chèn các câu lệnh thiết bị. Sau đó, thử nghiệm được biên dịch và chạy như bình thường, và các số liệu thống kê cơ bản về phạm vi được báo cáo:
$ go test -coverprofile fmtcoverage.html fmt
ok      fmt 0.060s  coverage: 91.4% of statements
$

Thứ hai, đối với các báo cáo chi tiết hơn, các cờ khác nhau để "đi kiểm tra" có thể tạo tệp hồ sơ phạm vi, mà chương trình bao gồm, được gọi bằng " go tool cover", sau đó có thể phân tích.

Frank Shearar đề cập :

Các phiên bản mới nhất của Go (2013/09/19) sử dụng:

go test -coverprofile <filename> <package name>

Bạn có thể tìm thấy chi tiết về cách tạo và phân tích thống kê vùng phủ bằng cách chạy các lệnh

$ go help testflag
$ go tool cover -help

Ivan Black đề cập trong các bình luận :

go test -coverprofile cover.outvà sau đó
go tool cover -html=cover.outmở cover.outtrong trình duyệt mặc định của bạn

Tôi thậm chí không muốn đợi trình duyệt mở, vì vậy tôi đã định nghĩa bí danh này:

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

Mà tôi chỉ cần gõ gc, và có một danh sách của tất cả các dòng không chưa được điều chỉnh (ở đây: với một coverage.outdòng không kết thúc bằng " 1").


2
Lưu ý rằng các phiên bản mới nhất của Go (2013/09/19) sử dụnggo test -coverprofile <filename> <package name>
Frank Shearar

@FrankShearar Ok. Tôi đã bao gồm bình luận của bạn trong câu trả lời để hiển thị nhiều hơn.
VonC

go test -coverprofile cover.outvà sau đó go tool cover -html=cover.out -o cover.htmlmở cover.htmltrong trình duyệt
Ivan Đen

@IvanBlack điểm tốt. Tôi đã đưa nó vào câu trả lời để dễ nhìn hơn. Tôi cũng đã thêm một bí danh mà tôi sử dụng để xem nhanh các dòng không bị che.
VonC

1
@VonC go tool cover -html=cover.outsẽ tự động mở một trình duyệt, nhưng nó không hoạt động với hệ thống của tôi. Tôi muốn mở trình duyệt và làm mới trang nếu cần.
Ivan Black

41

Go đi kèm với công cụ tuyệt vời để kiểm tra và bảo hiểm. Mặc dù tất cả các công cụ go tool cover -helpcờ vây đều được ghi chép đầy đủ, tôi khuyên bạn nên đọc bài viết Câu chuyện trang bìa trên blog cờ vây chính thức . Nó có rất nhiều ví dụ và tôi thực sự khuyên bạn nên sử dụng nó!

Tôi có hàm này trong ~ / .bash_profile của mình. (bạn có thể chỉ cần dán nó vào thiết bị đầu cuối để thử).

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

Sau đó, chỉ cần cdvào một thư mục dự án / gói và nhập cover. Thao tác này sẽ mở ra một công cụ trực quan trong trình duyệt, hiển thị cho bạn mã đã được kiểm tra và chưa được kiểm tra cho mỗi tệp trong gói hiện tại. Lệnh rất hữu ích! Tôi thực sự khuyên bạn nên sử dụng nó để tìm những gì chưa được kiểm tra 100%! Kết quả hiển thị là trên mỗi tệp. Từ menu thả xuống ở trên cùng bên trái, bạn có thể xem kết quả cho tất cả các tệp.

Với lệnh này, bạn cũng có thể kiểm tra phạm vi của bất kỳ gói nào, ví dụ:

cover fmt

Đầu ra trong terminal từ lệnh này sẽ là:

ok      fmt 0.031s  coverage: 91.9% of statements

Ngoài ra, trong trình duyệt của bạn, bạn sẽ thấy công cụ này hiển thị bằng màu đỏ tất cả các dòng mã không được kiểm tra:

nhập mô tả hình ảnh ở đây

Cũng có thể chỉ lưu tệp tin html thay vì mở nó trong trình duyệt. Điều này rất hữu ích trong trường hợp khi các bài kiểm tra + phạm vi bảo hiểm của bạn được chạy bằng công cụ CI như Jenkins. Bằng cách đó, bạn có thể phân phát các tệp phạm vi từ một máy chủ trung tâm và cả nhóm sẽ có thể xem kết quả về phạm vi cho mỗi bản dựng.


Đoạn mã được sao chép từ đây coderwall.com/p/rh-v5a/get-coverage-of-golang-test
Pavel Nikolov

Thật thú vị, tôi sẽ kiểm tra nó. +1
VonC

Điều này thật tuyệt! Cám ơn vì đã chia sẻ. Kết thúc việc chuyển sang tập lệnh thử nghiệm vì tôi muốn thử nghiệm một gói chính trong chương trình của mình. Chúc mừng
James O'Toole

11

Ngoài các câu trả lời hay ở trên, tôi thấy ba dòng này là cách đơn giản nhất để lấy nó (bao gồm tất cả các gói):

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

Lưu ý rằng trong tệp HTML, bạn sẽ tìm thấy một nút thả xuống sẽ hướng bạn đến tất cả các tệp.


5

ngay đây , một số tài liệu ở đây .

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

Tôi chưa sử dụng nó, đây là tất cả những gì tôi biết.


bạn có phải cài đặt nó theo cách thủ công không? trong cài đặt go cục bộ của tôi (go phiên bản go1) nó không có ở đó.
oers

Tôi tin rằng nó được xây dựng bởi ./all.bash. Tôi không thể xác minh ATM, tôi không được phát hành vì tôi có CL đang chờ xử lý, nhưng dấu thời gian nhị phân cov mà tôi thấy trong bản ~/go/pkg/tool/linux_amd64dựng Go cuối cùng của tôi vào ngày hôm qua.
zzzz

Có, hãy chạy ./all.bash và bạn sẽ có nó. Cảm ơn sự giúp đỡ, jnml!
George Atsev

Tôi gặp một số vấn đề khi chạy nó trên máy x86 của mình. Tôi đã thử thay đổi main.c như được đề cập trong chủ đề này: groups.google.com/group/golang-dev/browse_thread/thread/… Nhưng nó tạo ra lỗi thời gian chạy ở một vị trí khác. Tôi sẽ thử nó trên máy 64 bit.
George Atsev

3

Nếu bạn muốn xem các dòng không được che theo chức năng trực tiếp trong một thiết bị đầu cuối, tôi đã viết lại công cụ che cho mục đích này. Nó có sẵn tại https://github.com/gregoryv/uncover .

Sử dụng

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

Ảnh chụp màn hình

nhập mô tả hình ảnh ở đây


2

Nếu bạn đang sử dụng VSCode , chức năng này được hỗ trợ ngoài hộp ( Nhưng bị tắt theo mặc định )

Chỉ cần bật kiểm tra trên lưu + báo cáo mức độ phù hợp

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

Nó thậm chí sẽ hiển thị trong trình soạn thảo của bạn những dòng nào không bị che, rất tiện dụng.


2

Báo cáo phạm vi & rarr;

a) Chạy tất cả các thử nghiệm và kích hoạt phạm vi bảo hiểm -> go test ./... -coverprofile coverage.out

b) Nhận phạm vi bảo hiểm cho các chức năng riêng lẻ cũng như phạm vi bảo hiểm tổng thể → go tool cover -func coverage.out

c) Xem những dòng được đề cập và những dòng không được kiểm tra của bạn → go tool cover -html=cover.out -o coverage.html. Mở coverage.htmltệp được tạo trong trình duyệt và phân tích thông tin chi tiết về phạm vi bảo hiểm.


1

Một cách nhanh chóng và dễ dàng là sử dụng công cụ phủ sóng đi kèm với go tích hợp:

$ go test -coverprofile cp.out // Phát ra phạm vi bảo hiểm theo một tỷ lệ phần trăm lót khôn ngoan

Sau khi bạn thực hiện lệnh trên, nếu bạn muốn xem trực quan phạm vi của mã (như các câu lệnh được đề cập và bị mất, v.v.)

$ go tool cover -html = cp.out

Lưu ý: Bạn cần thực hiện các lệnh trên trong thư mục mà bạn muốn xem phạm vi


1

Lấy cảm hứng từ menu trợ giúp và các câu trả lời khác cho câu hỏi này, chỉ cần chạy:

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

0

Hãy thử sử dụng Hình ảnh Docker của gaia-docker / base-go-build .

Đây là hình ảnh Docker chứa tất cả những gì bạn cần để xây dựng và kiểm tra mức độ phù hợp. Chạy thử nghiệm phạm vi bên trong một vùng chứa Docker tạo thư mục .cover với kết quả kiểm tra phạm vi dự án của bạn.

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

Tập lệnh kiểm tra phạm vi hoạt động trên tất cả các thư mục của dự án và tạo, bên trong thư mục .cover báo cáo phạm vi và báo cáo cho từng thư mục, và báo cáo kết hợp về phạm vi thử nghiệm của tất cả các dự án.

Codecov cũng đề xuất một tập lệnh thu thập kết quả phù hợp: nhiều tệp


-1

Kiểm tra phạm vi bảo hiểm cho Golang

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

Kiểm tra xem nó đã được cài đặt đúng chưa và bạn có quyền truy cập từ thiết bị đầu cuối của mình

Chạy trường hợp thử nghiệm

Nếu bạn chạy trường hợp thử nghiệm, nó sẽ làm đỏ tệp .json Dựa trên tệp, bạn sẽ nhận được Báo cáo phạm vi mã trong tệp .html

gocov test >your_Coverage_report.json

Khi Trường hợp kiểm tra của bạn được thực hiện xong Tạo Báo cáo trong tệp .html bằng cách sử dụng .json

gocov-html your_Coverage_report.json >your_Coverage_report.html

Tài liệu tham khảo

GoTest Coverage Tool cho go lang

Đi tới Công cụ Báo cáo Kiểm tra

Phương pháp luân phiên

Phạm vi thử nghiệm gốc

go test -coverprofile=coverage.out
go tool cover -html=coverage.out
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.