이번 편의 목표: 연체료가 0일과 3일에서 기대한 금액인지 cargo test로 확인합니다.

테스트는 실행 파일의 출력을 눈으로 보는 일과 별개입니다. #[test]가 붙은 함수는 cargo test가 실행합니다. assert_eq!의 두 값이 다르면 그 테스트는 실패합니다. 테스트 모듈에 #[cfg(test)]를 붙이면, 테스트를 돌릴 때만 그 모듈이 컴파일됩니다.

13편의 src/book.rs를 다음으로 바꿉니다. src/main.rs의 mod book;은 그대로 둡니다.

Rust
pub fn overdue_fee(days: i32) -> i32 {
    if days <= 0 { 0 } else { days * 100 }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn zero_days_is_free() {
        assert_eq!(overdue_fee(0), 0);
    }

    #[test]
    fn three_days_is_three_hundred() {
        assert_eq!(overdue_fee(3), 300);
    }
}

프로젝트 폴더에서 다음을 실행합니다.

cargo test

두 테스트가 ok로 끝나면 함수가 두 경우를 만족한 것입니다. use super::*;는 상위 모듈의 overdue_fee를 테스트에서 쓰겠다는 뜻입니다. 테스트를 통과한 뒤에도 cargo run은 13편과 같이 동작합니다.

직접 해 보기

overdue_fee(-2)가 0인지 보는 테스트를 하나 추가하고 cargo test를 다시 실행하세요.

해설

함수는 0 이하를 모두 0으로 돌립니다. -2도 0이므로 새 테스트는 통과합니다. 기댓값을 100으로 적으면 실패가 나고, 왼쪽 값과 오른쪽 값이 출력됩니다.