cargo-nextest - 차세대 Rust 테스트 러너 치트시트
cargo-nextest는 Rust를 위한 차세대 테스트 러너입니다. cargo test와의 핵심 구조적 차이는 각 테스트를 자신의 프로세스에서 실행한다는 것인데, 이는 진정한 격리(한 테스트가 다른 테스트의 글로벌 상태를 손상시킬 수 없음), 더 나은 병렬 처리, 그리고 프로세스를 충돌시키는 테스트를 보고할 수 있는 기능을 제공합니다. 실제로는 보통 2–3배 빠르며 큰 스위트의 경우 훨씬 깨끗한 출력, 불안정 테스트 감지, CI 샤딩을 위한 분할이 있습니다.
설치
| 방법 | 명령 |
|---|
| 사전 제작 (가장 빠름) | cargo install cargo-nextest --locked |
| 바이너리 | nextest 릴리스에서 다운로드 |
| macOS (Homebrew) | brew install cargo-nextest |
| 확인 | cargo nextest --version |
기본 사용법
| 명령 | 설명 |
|---|
cargo nextest run | 모든 테스트 실행 |
cargo nextest run -p mycrate | 한 패키지 |
cargo nextest run test_name | 부분 문자열로 필터 |
cargo nextest list | 실행하지 않고 테스트 나열 |
cargo nextest run --release | 릴리스 프로필 |
cargo nextest run --no-fail-fast | 실패 후 계속 진행 |
필터링 (Filtersets)
nextest는 테스트를 선택하기 위한 표현 언어를 가지고 있습니다.
| 표현 | 선택 |
|---|
-E 'test(auth)' | 이름이 auth와 일치하는 테스트 |
-E 'package(mycrate)' | 패키지의 모든 테스트 |
-E 'kind(lib)' | lib (단위) 테스트만 |
-E 'binary(integration)' | 특정 테스트 바이너리 |
-E 'test(a) + test(b)' | 합집합 |
-E 'package(x) - test(slow)' | 차집합 |
# 하나의 크레이트에 대한 통합 테스트 실행, 느린 것 제외
cargo nextest run -E 'package(api) and kind(test) - test(slow)'
불안정한 테스트 감지
# 실패를 3번까지 재시도; 재시도에서 통과하는 테스트는 FLAKY로 표시
cargo nextest run --retries 3
| 구성 | 효과 |
|---|
--retries N | 실패한 테스트 N번 재시도 |
| FLAKY로 보고 | 재시도 후에만 통과 |
| 테스트별 오버라이드 | 구성에서 특정 테스트에 대한 재시도 설정 |
이러한 구분이 중요합니다: 불안정한 테스트는 실패한 테스트와 다른 문제이며, nextest는 재실행 뒤에 숨기는 대신 명시적으로 표면화합니다.
구성
# .config/nextest.toml
[profile.default]
retries = 0
fail-fast = false
slow-timeout = { period = "30s", terminate-after = 2 }
[profile.ci]
retries = 2
failure-output = "immediate-final"
status-level = "skip"
[[profile.default.overrides]]
filter = 'test(integration)'
threads-required = 2
| 설정 | 목적 |
|---|
retries | 기본 재시도 횟수 |
slow-timeout | 지속 기간을 초과하는 플래그/종료 테스트 |
threads-required | 무거운 테스트를 위한 예약 용량 |
failure-output | 실패 세부 사항 출력 시기 |
| Profiles | cargo nextest run -P ci |
CI 샤딩
# 4대의 CI 머신 간 스위트 분할
cargo nextest run --partition count:1/4 # 러너 1에서
cargo nextest run --partition count:2/4 # 러너 2에서
| 모드 | 분할 기준 |
|---|
count:N/M | 테스트 수별 라운드 로빈 |
hash:N/M | 안정적 해시 (동일 테스트 → 동일 샤드) |
출력 및 보고
| 옵션 | 효과 |
|---|
--status-level all | 모든 테스트의 상태 표시 |
--failure-output immediate | 발생 시 실패 인쇄 |
--message-format libtest-json | 머신 가독 출력 |
--profile ci | CI 조정 설정 사용 |
| JUnit output | CI 보고를 위해 nextest.toml에서 구성 |
제한 사항
| 지원 안 함 | 이유 |
|---|
| Doctests | cargo test --doc로 별도 실행 |
#[bench] | 대신 criterion 사용 |
| 일부 libtest 플래그 | 다른 러너 의미론 |
일반적인 CI 패턴은 cargo nextest run && cargo test --doc입니다.
nextest vs cargo test
| 측면 | cargo nextest | cargo test |
|---|
| 프로세스 모델 | 테스트당 하나 | 바이너리당 하나 |
| 격리 | 강력 | 바이너리 내 공유 |
| 속도 | 보통 2–3배 빠름 | 기준선 |
| 불안정 감지 | 기본 제공 | 없음 |
| CI 샤딩 | 기본 제공 | 수동 |
| Doctests | 아니오 | 예 |
리소스