[Rust 공식문서 한국어 정리] 53. Rust 코드 커버리지 가이드
[Rust 공식문서 한국어 정리] 53. Rust 코드 커버리지 가이드
원문 제목: Source-based Code Coverage — rustc
작성자: Rust Compiler Team
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
이 문서는 Rust 컴파일러의 소스 기반 코드 커버리지 도구를 사용하여 테스트가 코드의 어느 부분을 실행하는지 측정하는 방법을 설명합니다.
LLVM의 coverage instrumentation을 활용한 최신 접근 방식과, 기존의 kcov, tarpaulin 등의 외부 도구와의 차이를 다룹니다.
커버리지 데이터를 수집하고, lcov나 HTML 리포트로 변환하여 시각화하는 전 과정을 안내합니다.
CI 통합과 커버리지 게이트 설정을 통해, 테스트 품질을 지속적으로 모니터링하는 방법을 중심으로 설명합니다.
테스트 커버리지를 정량적으로 관리하려는 팀과 개발자에게 필수적인 가이드입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① Source-based Coverage: 컴파일 타임에 LLVM instrumentation을 삽입하여 코드 실행 경로를 추적합니다.
② profraw: LLVM profiling 데이터를 저장하는 바이너리 형식입니다.
③ llvm-cov: profraw 데이터를 분석하여 커버리지 리포트를 생성하는 LLVM 도구입니다.
④ lcov/html: 커버리지 결과를 표준 포맷으로 변환하여 CI와 리포트 도구에서 활용합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Rust의 소스 기반 커버리지는 rustc의 -C instrument-coverage 플래그로 활성화합니다.
RUSTFLAGS="-C instrument-coverage" cargo test 명령으로 테스트를 실행하면, 프로파일 데이터가 생성됩니다.
기존의 kcov나 tarpaulin은 외부 도구에 의존하지만, 소스 기반 방식은 컴파일러 수준에서 정확하고 빠릅니다.
커버리지 측정 과정은 세 단계로 이루어집니다.
첫째, -C instrument-coverage로 컴파일하여 각 코드 영역에 계수기를 삽입합니다.
둘째, 테스트를 실행하여 .profraw 파일을 생성합니다.
셋째, llvm-profdata와 llvm-cov로 profraw를 병합하고 분석하여 리포트를 생성합니다.
llvm-cov는 다양한 출력 포맷을 지원합니다.
--text로 터미널에 커버리지를 출력하고, --html로 웹 페이지 리포트를 생성합니다.
--lcov로 lcov.info 파일을 생성하면, Codecov나 Coveralls 같은 서비스에 업로드할 수 있습니다.
CI 통합은 테스트 실행 후 llvm-cov로 커버리지를 측정하고, 임계값을 설정하여 게이트로 사용합니다.
GitHub Actions의 codecov-action으로 lcov를 업로드하면, PR에서 커버리지 변화를 시각화합니다.
커버리지 100%를 강제하기보다는, 핵심 로직의 커버리지를 유지하고 점진적으로 개선하는 것이 현실적입니다.
커버리지 도구의 한계도 이해해야 합니다.
커버리지가 높다고 버그가 없는 것은 아니며, 중요한 경로나 경계 조건을 커버하지 못할 수 있습니다.
따라서 커버리지는 테스트 품질의 필요 조건이지 충분 조건은 아닙니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CI에서 RUSTFLAGS를 설정하고 cargo test 후 llvm-cov로 lcov를 생성하여 Codecov에 업로드합니다.
PR 리뷰 시 커버리지 변화를 확인하고, 새 코드의 커버리지가 기준 아래로 떨어지면 블로킹합니다.
unsafe 코드나 복잡한 분기 경로의 커버리지를 집중적으로 모니터링합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
소스 기반 커버리지는 Rust 테스트 품질을 정량적으로 평가하는 강력한 도구입니다.
llvm-cov와 CI 통합으로 커버리지를 지속적으로 추적하고 개선하세요.
커버리지는 목표가 아닌 지표이며, 품질 있는 테스트와 함께 가치를 갖습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://doc.rust-lang.org/rustc/instrument-coverage.html
llvm-cov docs: https://llvm.org/docs/CommandGuide/llvm-cov.html
#Rust #CodeCoverage #Testing #LLVM #CI #Codecov #번역

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