Post thumbnail

코드 커버리지? 자~ 드가자~! grcov와 Rust 코드 커버리지 측정

· by 박승재

grcov는 Mozilla 재단에서 FireFox의 코드 검사를 위해 만든 코드 커버리지 도구로, .gcda, .profraw 파일을 분석해 코드 커버리지 보고서를 만드는 데에 사용합니다.

lcov, coveralls, cobertura, html 등 다양한 출력 형식을 지원하며, CodeCov, Coveralls 등의 코드 커버리지 서비스에 측정 결과를 업로드해서 온라인으로 보고서를 공유할 수도 있습니다.

코드 커버리지가 무엇인지 대해서는 아래 글을 참고해주세요.

참고: CodeCov 100%? 그만큼 확실하시다는 거지: Codecov를 이용한 C++ 코드 커버리지 측정 방법

grcov는 테스트 코드 컴파일 과정에서 -Z 플래그를 사용하기 때문에 Nightly 빌드에서만 작동합니다.

$ rustup toolchain install nightly

Nightly 빌드를 기본 툴체인(Toolchain)으로 지정합니다.

$ rustup default nightly

툴체인(Toolchain)은 소프트웨어를 만드는 데 사용되는 프로그램 개발 도구들을 부르는 단어입니다.

이제 cargo install을 이용해 grcov를 설치합니다.

$ cargo install grcov

커버리지 보고서 생성에 필요한 의존성을 설치합니다.

$ rustup component add llvm-tools-preview

커버리지를 측정할 코드의 테스트를 실행합니다.

$ LLVM_PROFILE_FILE="grcov-%p-%m.profraw" RUSTFLAGS="-Zinstrument-coverage" cargo test

테스트가 끝나면 .profraw 파일이 생성된 것을 확인할 수 있습니다.

생성된 .profraw 파일을 이용해 커버리지 보고서를 만들어 봅시다.

$ grcov --ignore-not-existing --binary-path ./target/debug/ -o lcov.info -s . .

-o출력 파일의 이름을 지정하는 플래그이며, -s소스 파일의 루트 디렉토리를 지정하는 플래그입니다.

커버리지 보고서에서 제외하고 싶은 파일은 --ignore 플래그를 이용하면 됩니다.

예를 들어, examples 디렉토리를 제외하고 싶은 경우 --ignore "**/examples/**"를 붙여줍니다.

최종적으로 생성된 보고서(lcov.info)는 CodeCov 등의 서비스에 업로드해서 결과를 확인할 수 있습니다.

$ bash <(curl -s https://codecov.io/bash) -f lcov.info

번외

grcov에는 -t 플래그로 출력 보고서의 형식을 지정할 수 있습니다.

로컬에서 커버리지 결과를 확인하고 싶은 경우, HTML 형식으로 보고서를 출력하면 됩니다.

$ grcov --ignore-not-existing --binary-path ./target/debug/ -t html -s . .

이 밖에도, coveralls, ade와 같은 다양한 출력 형식을 지원하니 홈페이지를 참고해 적용해보세요.

참고: man grcov