단위 테스트 작성

완료됨

Rust의 단위 테스트는 테스트가 아닌 코드가 정상적으로 작동하는지 확인하는 #[test] 특성으로 표시된 간단한 함수입니다. 이 함수들은 코드를 테스트할 때만 컴파일됩니다.

테스트 함수는 테스트하려는 코드를 실행합니다. 그런 다음, assert! 또는 assert_eq! 매크로를 사용하여 결과를 확인합니다.

다음 코드 예제에서는 간단한 add 함수와 #[test] 특성으로 표시된 다른 add_works 함수를 정의합니다.

fn add(a: i32, b: i32) -> i32 {
    a + b
}

#[test]
fn add_works() {
    assert_eq!(add(1, 2), 3);
    assert_eq!(add(10, 12), 22);
    assert_eq!(add(5, -2), 3);
}

$ cargo test 명령을 실행하면 출력이 다음 예제와 같이 표시됩니다.

running 1 test
test add_works ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

테스트 실패

cargo tests의 작동 방식을 확인하기 위해 실패하는 테스트를 포함해 보겠습니다.

#[test]
fn add_fails() {
    assert_eq!(add(2, 2), 7);
}

$ cargo test 명령을 사용하여 테스트를 다시 실행하면 add_works 테스트에 통과했다는 출력이 표시됩니다. 또한 add_fails가 실패했고 assert_eq에 대한 실패한 호출에 관한 정보를 포함해야 한다는 출력이 표시됩니다.

running 2 tests
test add_works ... ok
test add_fails ... FAILED

failures:

---- add_fails stdout ----
thread 'add_fails' panicked at 'assertion failed: `(left == right)`
  left: `4`,
 right: `7`', src/main.rs:14:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    add_fails

test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out

예상된 실패

대부분의 시나리오에서는 조건으로 인해 panic!이 발생하는지를 테스트하는 것이 중요합니다.

should_panic 특성을 사용하여 panic!를 확인할 수 있습니다. 테스트 함수에 이 특성을 추가하면 함수의 코드가 패닉 상태인 경우 테스트에 통과합니다. 코드가 패닉 상태인 경우 테스트가 실패합니다.

이제 add_fails 테스트 함수는 예상된 패닉을 캡처하고 통과한 테스트로 처리할 수 있습니다.

#[test]
#[should_panic]
fn add_fails() {
    assert_eq!(add(2, 2), 7);
}

테스트 결과는 다음과 같습니다.

running 2 tests
test add_works ... ok
test add_fails ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

테스트 무시

[test] 특성으로 주석 처리된 함수는 [ignore] 특성으로 주석 처리할 수도 있습니다. 이 특성은 테스트 중에 해당 테스트 함수를 건너뛰도록 합니다.

필요에 따라 테스트를 무시하는 이유를 사용하여 [ignore] 특성을 작성할 수 있습니다.

#[test]
#[ignore = "not yet reviewed by the Q.A. team"]
fn add_negatives() {
    assert_eq!(add(-2, -2), -4)
}

무시된 테스트 함수는 계속 형식이 확인되고 컴파일되지만 테스트에서 실행되지는 않습니다.

running 3 tests
test add_negatives ... ignored
test add_works ... ok
test add_fails ... ok

test result: ok. 2 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out

테스트 모듈

대부분의 단위 테스트는 #[cfg(test)] 특성을 사용하여 하위 모듈로 이동합니다.

fn add(a: i32, b: i32) -> i32 {
    a + b
}

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

    #[test]
    fn add_works() {
        assert_eq!(add(1, 2), 3);
        assert_eq!(add(10, 12), 22);
        assert_eq!(add(5, -2), 3);
    }

    #[test]
    #[should_panic]
    fn add_fails() {
        assert_eq!(add(2, 2), 7);
    }

    #[test]
    #[ignore]
    fn add_negatives() {
        assert_eq!(add(-2, -2), -4)
    }
}

cfg 특성은 조건부 컴파일을 제어하며 조건자가 true인 경우에는 이 특성이 연결된 요소만 컴파일합니다. test 컴파일 플래그는 $ cargo test 명령을 실행할 때마다 Cargo에서 자동으로 지정되므로 테스트를 실행하면 항상 true가 됩니다.

use super::*; 선언은 add_function_tests 모듈 내의 코드가 외부 모듈의 add에 액세스하는 데 필요합니다.

이 단원에서 사용되는 코드는 이 Rust Playground 링크에서 확인할 수 있습니다.