단위 테스트 작성
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 링크에서 확인할 수 있습니다.