C.W.K.
Stream
Lesson 04 of 06 · published

테스트 — 내장

~11 min · tooling, testing, doctest

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

테스트는 언어랑 Cargo 에 내장돼 있어 — 설치할 프레임워크도, 쓸 설정도 없어. cargo test 가 그냥 돌고, Rust 는 기본으로 세 종류 테스트를 지원해.

단위 테스트

단위 테스트는 테스트하는 코드랑 같은 파일 에, #[cfg(test)] mod tests 블록에 살아. #[test] 표시된 함수가 cargo test 로 돌아. 모듈 안에 있어서 private 함수를 테스트할 수 있어 — 많은 언어가 못 맞추는 의도적 Rust 선택. 검사엔 assert!, assert_eq! 같은 걸 써.

통합 테스트

통합 테스트는 최상위 tests/ 디렉토리에 살고, 각 파일이 네 라이브러리를 공개 API 로만 쓰는 별도 크레이트야 — 진짜 소비자처럼. 네 크레이트가 밖에서 작동하는지 검증해. 분리는 의도적이야: 단위 테스트는 내부를, 통합 테스트는 계약을 검사.

테스트는 일급이지 덧붙인 게 아니야. #[test], cargo test, #[cfg(test)] 가 언어랑 툴링 기능이야 — 서드파티 프레임워크도, 셋업도 없어. 그 낮은 마찰이 관용적 Rust 가 많이 테스트되는 이유야: 테스트 작성이 테스트 자체 외엔 비용이 0 이면, 더 많이 써.

Doctest

세 번째 종류가 독특하게 Rust 야: /// 문서 주석의 코드 예제가 테스트로 컴파일되고 실행 돼. 틀린 예제가 cargo test 를 실패시키니, 문서가 코드와 어긋날 수 없어. stale 문서의 해독제야 — 예제가 매 실행마다 테스트되니까 작동이 보장돼.

Code

단위 테스트, doctest, 다 cargo test 가 돌림·rust
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

/// 숫자를 두 배로.
///
/// ```
/// assert_eq!(my_crate::double(21), 42); // 이 예제는 cargo test 가 RUN 함
/// ```
pub fn double(n: i32) -> i32 { n * 2 }

#[cfg(test)] // 테스트 중에만 컴파일
mod tests {
    use super::*;
    #[test]
    fn add_works() {
        assert_eq!(add(2, 2), 4); // 단위 테스트 — private 항목도 볼 수 있어
    }
}

External links

Exercise

작은 라이브러리 함수를 쓰고, 더해: #[cfg(test)] mod tests 블록의 단위 테스트, /// 주석의 doctest, 그리고 (선택) tests/ 의 통합 테스트. cargo test 를 돌리고 셋 다 도는 걸 봐. 일부러 doctest 예제를 깨고 cargo test 가 잡는지 확인해.
Hint
단위 테스트는 내부 검증 (private 항목 볼 수 있음); doctest 는 문서 예제가 실제로 작동하는지 검증; 통합 테스트는 밖에서 공개 API 검증. doctest 를 깨면 네 문서가 조용히 stale 될 수 없다는 게 증명돼.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.