Golang에서 코드 커버리지를 측정하는 방법은 무엇입니까?


답변:


138

참고 로 이동 1.2 (Q4 2013, RC1을 사용할 수는) 이제 표시됩니다 테스트 커버리지 결과 :

의 새로운 주요 기능 중 하나 는 이제 계산할 수 있고 별도로 설치된 새로운 " "프로그램의 도움으로 테스트 범위 결과를 표시 할 수go test 있다는 go tool cover 입니다.

cover도구는 go.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
참고 그 이동의 최신 버전 (2013년 9월 19일) 사용go test -coverprofile <filename> <package name>
프랭크 Shearar

@FrankShearar 좋아. 더 많은 가시성을 위해 답변에 귀하의 의견을 포함했습니다.
VonC

go test -coverprofile cover.out다음 go tool cover -html=cover.out -o cover.htmlcover.html브라우저에서
이반 블랙

@IvanBlack 좋은 지적입니다. 더 많은 가시성을 위해 답변에 포함했습니다. 또한 가려지지 않은 선을 빠르게 볼 수 있도록 별칭을 추가했습니다.
VonC

1
@VonC go tool cover -html=cover.out는 자동으로 브라우저를 열지 만 내 시스템에서 작동하지 않습니다. 필요한 경우 브라우저를 열어두고 페이지를 새로 고치는 것을 선호합니다.
이반 블랙

41

Go는 테스트 및 적용을위한 멋진 도구와 함께 제공됩니다. 모든 Go 도구는 잘 문서화 되어 있지만 공식 Go 블로그에서 The cover story 기사를go tool cover -help 읽는 것이 좋습니다 . 많은 예제가 있으며 강력히 추천합니다!

이 기능은 ~ / .bash_profile에 있습니다. (단지 터미널에 붙여 넣어 사용해 볼 수 있습니다).

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

그런 다음 cdgo 프로젝트 / 패키지 폴더에 cover. 그러면 현재 패키지의 각 파일에 대해 테스트되고 테스트되지 않은 코드를 보여주는 시각적 도구가 브라우저에 열립니다. 매우 유용한 명령! 아직 100 % 테스트되지 않은 것을 찾기 위해 강력히 추천합니다! 표시된 결과는 파일 당입니다. 왼쪽 상단의 드롭 다운에서 모든 파일에 대한 결과를 볼 수 있습니다.

이 명령을 사용하면 다음과 같은 패키지의 적용 범위를 확인할 수도 있습니다.

cover fmt

이 명령의 터미널 출력은 다음과 같습니다.

ok      fmt 0.031s  coverage: 91.9% of statements

브라우저에서이 도구가 테스트로 다루지 않은 모든 코드 줄이 빨간색으로 표시되는 것을 볼 수 있습니다.

여기에 이미지 설명 입력

브라우저에서 열지 않고 html 커버리지 파일을 저장하는 것도 가능합니다. Jenkins와 같은 CI 도구에서 테스트 + 커버리지를 실행할 때 매우 유용합니다. 이렇게하면 중앙 서버에서 커버리지 파일을 제공 할 수 있으며 전체 팀은 각 빌드의 커버리지 결과를 볼 수 있습니다.



흥미 롭습니다. 테스트하겠습니다. +1
VonC 2014

굉장합니다! 공유해 주셔서 감사합니다. 내 프로그램에서 메인 패키지를 테스트하고 싶었 기 때문에 테스트 스크립트로 이동했습니다. 건배
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 버전 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

커버리지 리포트 →

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와 함께 제공되는 커버리지 도구를 사용하는 것입니다.

$ 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

올바르게 설치되었는지 확인하고 터미널에서 액세스 할 수 있습니다.

테스트 케이스 실행

테스트 케이스를 실행하면 파일을 기반으로 .json 파일이 다시 작성됩니다. 코드 커버리지 보고서가 .html 파일로 표시됩니다.

gocov test >your_Coverage_report.json

테스트 케이스가 완료되면 .json을 사용하여 .html 파일로 보고서 생성

gocov-html your_Coverage_report.json >your_Coverage_report.html

참고

go lang 용 GoTest Coverage Tool

Go 테스트 보고서 도구

대체 방법

Go Native Test 커버리지

go test -coverprofile=coverage.out
go tool cover -html=coverage.out
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.