[Go 공식문서 한국어 정리] ⑤3. 통합 테스트 커버리지 프로파일링
통합 테스트 커버리지 프로파일링
https://go.dev/doc/build-cover
Go 1.20부터 단위 테스트뿐 아니라 애플리케이션과 통합 테스트에서도 코드 커버리지 데이터를 수집할 수 있습니다. 이 기능은 더 복잡하고 무거운 테스트 시나리오에서도 코드 실행 범위를 측정할 수 있게 해줍니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① 서론
기존 go test -coverprofile은 패키지 단위 테스트에서만 커버리지를 수집했습니다. Go 1.20에서는 go build -cover로 커버리지 계측된 바이너리를 빌드하고, 실행 시 GOCOVERDIR 환경변수를 통해 데이터를 수집합니다.
② 핵심 개념
1. go build -cover: 커버리지 계측된 바이너리를 빌드합니다.
2. GOCOVERDIR: 커버리지 데이터 출력 디렉토리를 지정합니다.
3. go tool covdata: 커버리지 데이터를 분석하고 병합하는 도구입니다.
4. 메인 모듈만 기본 계측: go.mod의 의존성은 기본적으로 제외됩니다.
5. -coverpkg: 계측할 패키지를 명시적으로 지정합니다.
③ 주요 내용 상세
바이너리 빌드 및 실행
$ go build -cover -o myprogram.exe .
$ mkdir somedata
$ GOCOVERDIR=somedata ./myprogram.exe
실행 후 somedata 디렉토리에 covmeta.*와 covcounters.* 파일이 생성됩니다.
패키지 선택
기본적으로 메인 모듈의 패키지만 계측됩니다. 외부 의존성을 포함하려면:
$ go build -cover -coverpkg=io,mydomain.com,rsc.io/quote -o myprogram.exe .
go.mod의 모든 비표준 의존성을 포함하려면:
$ go list -f '{{if not .Standard}}{{.ImportPath}}{{end}}' -deps . | paste -sd "," > pkgs.txt
$ go build -coverpkg=`cat pkgs.txt` -o myprogram.exe .
covdata 도구
- percent: 패키지별 커버리지 퍼센트 보고
$ go tool covdata percent -i=somedata
- textfmt: 레거시 텍스트 형식으로 변환
$ go tool covdata textfmt -i=somedata -o profile.txt
$ go tool cover -func=profile.txt
- merge: 여러 실행 결과 병합
$ go tool covdata merge -i=dir1,dir2 -o merged
- pkg: 특정 패키지만 선택하여 보고
$ go tool covdata percent -i=somedata -pkg=mydomain.com/greetings
주의사항
- 패닉이나 치명적 예외 발생 시 커버리지 데이터가 손실됩니다.
- os.Exit() 또는 main.main 정상 반환 시에만 데이터가 기록됩니다.
- GOCOVERDIR이 설정되지 않으면 경고와 함께 실행되지만 데이터는 생성되지 않습니다.
④ 실전 활용
- CI/CD에서 통합 테스트 후 커버리지 보고서를 생성하세요.
- 크로스 플랫폼 테스트 결과를 covdata merge로 통합하세요.
- go tool cover -html=profile.txt로 시각적 커버리지 리포트를 생성하세요.
- 부하 테스트나 E2E 테스트에서도 코드 커버리지를 측정하여 테스트가 충분한지 평가하세요.
⑤ 정리
Go 1.20의 통합 테스트 커버리지 기능은 단위 테스트를 넘어 실제 애플리케이션 실행에서도 코드 커버리지를 측정할 수 있게 합니다. go build -cover로 계측된 바이너리를 빌드하고, GOCOVERDIR로 데이터를 수집한 후 covdata 도구로 분석하면 됩니다. 이를 통해 더 현실적인 테스트 시나리오에서의 커버리지를 파악할 수 있습니다.
#Go #Golang #Coverage #커버리지 #통합테스트 #IntegrationTest #go.tool.covdata #공식문서

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30