จะวัดความครอบคลุมของรหัสใน Golang ได้อย่างไร?


114

มีใครบ้างที่ประสบความสำเร็จในการสร้างความครอบคลุมของรหัสสำหรับการทดสอบหน่วย Go? ฉันไม่พบเครื่องมือสำหรับสิ่งนั้นบนเว็บ

คำตอบ:


139

โปรดทราบว่าGo 1.2 (Q4 2013, rc1 พร้อมใช้งาน)จะแสดงผลการทดสอบ :

หนึ่งคุณลักษณะใหม่ที่สำคัญของgo testคือว่าตอนนี้มันสามารถคำนวณและด้วยความช่วยเหลือจากใหม่ติดตั้งแยกต่างหาก " go tool cover" โปรแกรมการทดสอบการแสดงผลผลการคุ้มครอง

coverเครื่องมือที่เป็นส่วนหนึ่งของsubrepositorygo.tools สามารถติดตั้งได้โดยการรัน

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

เครื่องมือปกทำสองสิ่ง

  • ขั้นแรกเมื่อgo testกำหนด-coverค่าสถานะ" " ระบบจะรันโดยอัตโนมัติเพื่อเขียนซอร์สสำหรับแพ็กเกจและแทรกคำสั่งเครื่องมือวัด จากนั้นการทดสอบจะถูกรวบรวมและดำเนินการตามปกติและมีการรายงานสถิติความครอบคลุมพื้นฐาน:
$ go test -coverprofile fmtcoverage.html fmt
ok      fmt 0.060s  coverage: 91.4% of statements
$

ประการที่สองสำหรับรายงานที่มีรายละเอียดมากขึ้นแฟล็กต่างๆในการ "ไปทดสอบ" สามารถสร้างไฟล์โปรไฟล์ความครอบคลุมซึ่งโปรแกรมหน้าปกเรียกใช้ด้วย " go tool cover" จากนั้นสามารถวิเคราะห์ได้

Frank Shearar กล่าวถึง :

เวอร์ชันล่าสุดของ Go (2013/09/19) ใช้:

go test -coverprofile <filename> <package name>

สามารถดูรายละเอียดเกี่ยวกับวิธีการสร้างและวิเคราะห์สถิติความครอบคลุมได้โดยการรันคำสั่ง

$ go help testflag
$ go tool cover -help

Ivan Blackกล่าวถึงในความคิดเห็น :

go test -coverprofile cover.outจากนั้น
go tool cover -html=cover.outเปิดcover.outในเบราว์เซอร์เริ่มต้นของคุณ

ฉันไม่ต้องการรอให้เบราว์เซอร์เปิดดังนั้นฉันจึงกำหนดนามแฝงนี้:

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

ที่ฉันเพิ่งพิมพ์gcและมีรายการบรรทัดทั้งหมดที่ยังไม่ครอบคลุม (ที่นี่: มีcoverage.outบรรทัดที่ไม่ได้ลงท้ายด้วย " 1")


2
โปรดทราบว่า Go เวอร์ชันล่าสุด (2013/09/19) ใช้go test -coverprofile <filename> <package name>
Frank Shearar

@FrankShearar โอเค. ฉันได้รวมความคิดเห็นของคุณไว้ในคำตอบเพื่อให้มองเห็นได้มากขึ้น
VonC

go test -coverprofile cover.outแล้วgo tool cover -html=cover.out -o cover.htmlเปิดcover.htmlในเบราว์เซอร์
Ivan Black

@IvanBlack จุดดี. ฉันได้รวมไว้ในคำตอบเพื่อให้มองเห็นได้มากขึ้น ฉันยังเพิ่มนามแฝงที่ฉันใช้เพื่อดูบรรทัดที่ไม่ครอบคลุมอย่างรวดเร็ว
VonC

1
@VonC go tool cover -html=cover.outจะเปิดเบราว์เซอร์โดยอัตโนมัติ แต่ใช้ไม่ได้กับระบบของฉัน ฉันชอบเปิดเบราว์เซอร์ค้างไว้และรีเฟรชหน้าหากจำเป็น
Ivan Black

41

Go มาพร้อมกับเครื่องมือที่ยอดเยี่ยมสำหรับการทดสอบและการครอบคลุม แม้ว่าเครื่องมือทั้งหมดที่ไปมีเอกสารดีgo tool cover -helpฉันขอแนะนำให้อ่านบทความเรื่องปกในบล็อกไปอย่างเป็นทางการ มีตัวอย่างมากมายและฉันขอแนะนำอย่างยิ่ง!

ฉันมีฟังก์ชันนี้ใน ~ / .bash_profile ของฉัน (คุณสามารถวางลงในเทอร์มินัลเพื่อทดลองใช้)

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

แล้วก็cdเป็นโครงการไปโฟลเดอร์ / coverแพคเกจและประเภท สิ่งนี้จะเปิดเครื่องมือภาพในเบราว์เซอร์ซึ่งจะแสดงรหัสที่ทดสอบและยังไม่ทดสอบสำหรับแต่ละไฟล์ในแพ็คเกจปัจจุบัน คำสั่งที่มีประโยชน์มาก! ฉันขอแนะนำอย่างยิ่งสำหรับการค้นหาสิ่งที่ยังไม่ผ่านการทดสอบ 100%! ผลลัพธ์ที่แสดงเป็นต่อไฟล์ จากเมนูแบบเลื่อนลงด้านซ้ายบนคุณจะเห็นผลลัพธ์สำหรับไฟล์ทั้งหมด

ด้วยคำสั่งนี้คุณสามารถตรวจสอบความครอบคลุมของแพ็คเกจใด ๆ ได้เช่น:

cover fmt

ผลลัพธ์ในเทอร์มินัลจากคำสั่งนี้จะเป็น:

ok      fmt 0.031s  coverage: 91.9% of statements

นอกจากนั้นในเบราว์เซอร์ของคุณคุณจะเห็นเครื่องมือนี้แสดงเป็นสีแดงทุกบรรทัดของโค้ดซึ่งไม่ครอบคลุมถึงการทดสอบ:

ใส่คำอธิบายภาพที่นี่

นอกจากนี้ยังสามารถบันทึกไฟล์ครอบคลุม html แทนการเปิดในเบราว์เซอร์ สิ่งนี้มีประโยชน์มากในกรณีที่การทดสอบ + ความครอบคลุมของคุณดำเนินการโดยเครื่องมือ CI เช่น Jenkins ด้วยวิธีนี้คุณสามารถให้บริการไฟล์ความครอบคลุมจากเซิร์ฟเวอร์ส่วนกลางและทั้งทีมจะสามารถดูผลลัพธ์การครอบคลุมสำหรับแต่ละบิลด์ได้


ตัวอย่างข้อมูลคัดลอกมาจากที่นี่coderwall.com/p/rh-v5a/get-coverage-of-golang-test
Pavel Nikolov

น่าสนใจฉันจะทดสอบ +1
VonC

นี่มันเจ๋งมาก! ขอบคุณสำหรับการแบ่งปัน. สิ้นสุดลงด้วยการย้ายไปสู่สคริปต์ทดสอบเนื่องจากฉันต้องการทดสอบแพ็คเกจหลักในโปรแกรมของฉัน Cheers
James O'Toole

11

นอกจากคำตอบที่ดีข้างต้นแล้วฉันพบว่าทั้งสามบรรทัดนี้เป็นวิธีที่ง่ายที่สุดในการรับมัน (ซึ่งรวมถึงแพ็คเกจทั้งหมด):

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

โปรดทราบว่าในไฟล์ HTML คุณจะพบปุ่มดรอปดาวน์ที่จะนำคุณไปยังไฟล์ทั้งหมด


5

มันอยู่ที่นี่เอกสารบางอย่างที่นี่

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

ฉันไม่ได้ใช้มันนี่คือทั้งหมดที่ฉันรู้


คุณต้องติดตั้งด้วยตนเองหรือไม่? ในการติดตั้ง go ในพื้นที่ของฉัน (go version go1) มันไม่มี
oers

ฉันเชื่อว่ามันสร้างโดย. / all.bash ฉันไม่สามารถตรวจสอบ ATM ได้ฉันไม่ได้รับการปล่อยตัวเนื่องจากฉันมี CL ที่รอดำเนินการ แต่การประทับเวลาไบนารี cov ที่ฉันเห็น~/go/pkg/tool/linux_amd64ตรงกับรุ่น Go ล่าสุดของเมื่อวานนี้
zzzz

ใช่เรียกใช้. / all.bash แล้วคุณจะมี ขอบคุณสำหรับความช่วยเหลือ jnml!
George Atsev

ฉันมีปัญหาในการใช้งานบนเครื่อง x86 ของฉัน ฉันลองเปลี่ยน main.c ตามที่กล่าวไว้ในหัวข้อนี้: groups.google.com/group/golang-dev/browse_thread/thread/…แต่เกิดข้อผิดพลาดรันไทม์ในตำแหน่งอื่น ฉันจะลองบนเครื่อง 64 บิต
George Atsev

3

หากคุณต้องการดูบรรทัดที่เปิดโดยฟังก์ชันโดยตรงในเทอร์มินัลฉันเขียนเครื่องมือปกใหม่เพื่อจุดประสงค์นี้ มันมีอยู่ในhttps://github.com/gregoryv/uncover

การใช้งาน

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

ภาพหน้าจอ

ใส่คำอธิบายภาพที่นี่


2

หากคุณใช้VSCodeฟังก์ชันนี้ได้รับการสนับสนุนนอกกรอบ ( แต่ปิดใช้งานโดยค่าเริ่มต้น )

เพียงเปิดการทดสอบในการบันทึก + การรายงานความครอบคลุม

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

มันจะแสดงในตัวแก้ไขของคุณว่าไม่ครอบคลุมบรรทัดใดซึ่งสะดวกมาก


2

รายงานความครอบคลุม→

a) ทำการทดสอบทั้งหมดและเปิดใช้งานการครอบคลุม -> go test ./... -coverprofile coverage.out

b) รับความครอบคลุมสำหรับแต่ละฟังก์ชั่นรวมถึงความครอบคลุมโดยรวม→ go tool cover -func coverage.out

c) go tool cover -html=cover.out -o coverage.htmlดูสายที่ครอบคลุมและคนที่ไม่ได้รับการคุ้มครองโดยการทดสอบของคุณ→ เปิดcoverage.htmlไฟล์ที่สร้างขึ้นในเบราว์เซอร์และวิเคราะห์ข้อมูลความครอบคลุมโดยละเอียด


1

วิธีที่ง่ายและรวดเร็วคือใช้เครื่องมือครอบคลุมที่มาพร้อมกับการเดินทางในตัว:

$ go test -coverprofile cp.out // ปล่อยความครอบคลุมในเปอร์เซ็นต์ซับเดียวอย่างชาญฉลาด

หลังจากที่คุณดำเนินการคำสั่งข้างต้นแล้วหากคุณต้องการดูความครอบคลุมของรหัสด้วยสายตา (เช่นข้อความที่ครอบคลุมและพลาด ฯลฯ )

ปกเครื่องมือ $ go -html = cp.out

หมายเหตุ: คุณต้องดำเนินการตามคำสั่งข้างต้นในโฟลเดอร์ที่คุณต้องการดูความครอบคลุม


1

แรงบันดาลใจจากเมนูความช่วยเหลือและคำตอบอื่น ๆ สำหรับคำถามนี้เพียงเรียกใช้:

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

0

ลองใช้gaia-docker / base-go-build Docker Image

นี่คืออิมเมจ Docker ที่มีทั้งหมดที่คุณต้องการเพื่อสร้างและทดสอบการครอบคลุม การเรียกใช้ความครอบคลุมการทดสอบภายในคอนเทนเนอร์ Docker จะสร้างโฟลเดอร์. coverพร้อมผลการทดสอบความครอบคลุมของโครงการของคุณ

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

สคริปต์ครอบคลุมการทดสอบที่ทำงานบนโฟลเดอร์ทุกโครงการและสร้างภายใน.coverโฟลเดอร์ junit และความคุ้มครองรายงานสำหรับแต่ละโฟลเดอร์และรวมรายงานความคุ้มครองของทุกโครงการการทดสอบ

Codecov ยังแนะนำสคริปต์ที่รวบรวมผลการครอบคลุม: ไฟล์หลายไฟล์


-1

ครอบคลุมการทดสอบสำหรับ Golang

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

ตรวจสอบว่าติดตั้งอย่างถูกต้องและคุณสามารถเข้าถึงได้จาก Terminal ของคุณ

เรียกใช้กรณีทดสอบ

หากคุณเรียกใช้กรณีทดสอบมันจะทำให้ไฟล์. json ใหม่ขึ้นตามไฟล์คุณจะได้รับ Code Coverage Report ในไฟล์. html

gocov test >your_Coverage_report.json

เมื่อกรณีการทดสอบของคุณเสร็จสิ้นสร้างรายงานในไฟล์. html โดยใช้. json

gocov-html your_Coverage_report.json >your_Coverage_report.html

ข้อมูลอ้างอิง

GoTest Coverage Tool สำหรับ go lang

ไปทดสอบรายงานเครื่องมือ

วิธีอื่น

ไปครอบคลุมการทดสอบพื้นเมือง

go test -coverprofile=coverage.out
go tool cover -html=coverage.out
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.