컴파일러 테스트하기
Rust 프로젝트는 빌드 시스템(./x test)이 조율하는 매우 다양한 테스트를 실행합니다. 이 절에서는 여러 테스트 도구를 간략히 소개합니다. 이어지는 장에서는 테스트 실행하기와 새 테스트 추가하기를 자세히 다룹니다.
테스트의 종류
Rust 배포판의 여러 부분을 검증하기 위한 테스트에는 여러 종류가 있습니다. 아래에 언급한 몇 가지 예외를 제외하면 거의 모든 테스트는 ./x test로 실행됩니다.
Compiletest
컴파일러 자체를 테스트하는 주요 테스트 하네스는 compiletest라는 도구입니다.
compiletest는 테스트 스위트로 구성된 여러 형태의 테스트 실행을 지원합니다. 테스트 모드는 일련의 테스트 스위트에 공통 프리셋/동작을 제공할 수 있습니다. compiletest가 지원하는 테스트는 tests 디렉터리에 있습니다.
Compiletest 장에서 이 도구의 사용법을 자세히 설명합니다.
예:
./x test tests/ui
패키지 테스트
표준 라이브러리와 여러 컴파일러 패키지에는 일반적인 Rust #[test] 단위 테스트, 통합 테스트, 문서 테스트가 들어 있습니다. library/ 또는 compiler/ 디렉터리에 있는 거의 모든 패키지의 경로를 ./x test에 전달할 수 있으며, 그러면 x는 사실상 해당 패키지에 대해 cargo test를 실행합니다.
예시:
| 명령 | 설명 |
|---|---|
./x test library/std | std에 대해서만 테스트를 실행합니다 |
./x test library/core | core에 대해서만 테스트를 실행합니다 |
./x test compiler/rustc_data_structures | rustc_data_structures에 대해 테스트를 실행합니다 |
표준 라이브러리는 기능을 검증하는 데 문서 테스트에 매우 크게 의존합니다. 하지만 필요에 따라 단위 테스트와 통합 테스트도 사용할 수 있습니다. 거의 모든 컴파일러 패키지에서는 문서 테스트가 비활성화되어 있습니다.
표준 라이브러리와 컴파일러의 모든 단위 테스트는 별도의 tests 파일에 배치됩니다(이는 tidy에서 강제합니다). 이렇게 하면 테스트 파일이 변경되어도 크레이트를 다시 컴파일할 필요가 없습니다. 예를 들면 다음과 같습니다.
#[cfg(test)]
mod tests;
이렇게 하지 않았다면 core 같은 부분을 작업할 때 표준 라이브러리 전체와 rustc 전체를 다시 컴파일해야 했을 것입니다.
./x test에는 이러한 패키지 테스트의 동작을 제어하는 몇 가지 CLI 옵션이 있습니다.
--doc— 패키지의 문서 테스트만 실행합니다.--all-targets— 문서 테스트를 제외한 모든 테스트를 실행합니다.--tests— 단위 테스트와 통합 테스트만 실행합니다.
Tidy
Tidy는 긴 줄을 거부하는 등 소스 코드 스타일과 포맷팅 규칙을 검증하는 데 사용하는 자체 도구입니다. 자세한 내용은 코딩 규칙 섹션이나 Tidy Readme를 참고하십시오.
예시:
./x test tidy
포맷팅
Rustfmt는 빌드 시스템에 통합되어 있어 컴파일러 전체에 일관된 스타일을 적용합니다. 포맷팅 검사는 위에서 언급한 Tidy 도구가 자동으로 실행합니다.
예시:
| 명령 | 설명 |
|---|---|
./x fmt --check | 포맷팅을 검사하고, 포맷팅이 필요하면 오류와 함께 종료합니다. |
./x fmt | 코드베이스 전체에 rustfmt를 실행합니다. |
./x test tidy --bless | 먼저 rustfmt를 실행해 코드베이스를 포맷팅한 다음 tidy 검사를 실행합니다. |
책 문서 테스트
출판되는 모든 책에는 각자의 테스트가 있으며, 이 테스트는 주로 Rust 코드 예제가 통과하는지 검증합니다. 내부적으로 이 테스트들은 사실상 Markdown 파일에 대해 rustdoc --test를 사용합니다. 책 경로를 ./x test에 전달하면 테스트를 실행할 수 있습니다.
예시:
./x test src/doc/book
문서 링크 검사기
모든 문서의 링크는 링크 검사 도구로 검증하며, 다음과 같이 실행할 수 있습니다.
./x test linkchecker
이 작업은 모든 문서를 빌드해야 하므로 시간이 다소 걸릴 수 있습니다.
distcheck
distcheck는 빌드 시스템이 만든 소스 배포 tarball이 정상적으로 압축 해제되고 빌드되며 모든 테스트를 실행하는지 검증합니다.
./x test distcheck
도구 테스트
Rust에 포함된 패키지들도 모든 테스트를 실행합니다. 여기에는 cargo, clippy, rustfmt, miri, bootstrap(Rust 빌드 시스템 자체를 테스트함) 등이 포함됩니다.
대부분의 도구는 src/tools 디렉터리에 있습니다. 도구의 테스트를 실행하려면 해당 경로를 ./x test에 전달하기만 하면 됩니다.
예:
./x test src/tools/cargo
일반적으로 이러한 도구의 테스트는 도구 디렉터리 안에서 cargo test를 실행하는 방식으로 이루어집니다.
지정한 테스트 집합만 실행하려면 명령에 --test-args FILTER_NAME을 덧붙이십시오.
예:
./x test src/tools/miri --test-args padding
CI에서는 일부 도구의 실패가 허용됩니다. 실패하면 해당 팀에 알림이 전송되며, 실패 내역은 toolstate 웹사이트에서 추적됩니다. 자세한 내용은 toolstate 문서에서 확인할 수 있습니다.
생태계 테스트
Rust는 회귀를 발견하고 언어의 발전에 관해 근거 있는 결정을 내리기 위해 실제 코드와의 통합을 테스트합니다. Crater를 비롯하여 여러 종류의 생태계 테스트가 있습니다. 자세한 내용은 생태계 테스트 장을 참고하십시오.
성능 테스트
컴파일러의 성능을 테스트하고 추적하는 데에는 별도의 인프라가 사용됩니다. 자세한 내용은 성능 테스트 장을 참고하십시오.
코드 생성 백엔드 테스트
코드 생성 백엔드 테스트를 참고하십시오.
기타 정보
테스트와 관련된 그 밖의 유용한 정보는 기타 정보에 있습니다.
더 읽을거리
다음 블로그 글도 흥미로울 수 있습니다:
- brson의 고전적인 글 “How Rust is tested”