러스트에서는 함수의 동작을 테스트할 수 있는 문법을 제공한다. 테스트는 cargo test
로 실행할 수 있고, 이 명령을 실행하면 테스트 실행 바이너리를 빌드한다.
테스트 작성
src/lib.rs
#[cfg(test]
mod tests{
#[test] //이 함수가 테스트 함수임을 명시
fn it_works() {
let result = 2 + 2;
assert_eq!(result, 4); //result의 값은 4와 같을 것
}
}
#[test]
로 이 함수가 테스트 함수임을 명시한다. assert_eq!
매크로는 ‘result의 값이 4와 같을 것’이라고 단언(assert)한다. cargo test
로 실행하면 test result: ok.
라는 프롬프트가 뜬다.
assert!
: true가 반환되면 passassert_eq!
: 두 표현식이 동등하면 passassert_ne!
: 두 표현식이 다르면 pass
커스텀 실패 메세지
pub fn greeting(name: &str) -> String {
String::from("Hello!")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn greeting_contains_name() {
let result = greeting("Carol");
assert!(
result.contains("Carol"),
"Greeting did not contain name, value was `{}`",
result
);
}
}
test에서는 greeting
함수가 매개변수로 입력된 “Carol”을 반환하기를 기대하지만 실제로는 “Hello!”를 반환한다. 따라서 테스트는 실패하고, 실제 반환하는 result
값을 오류 메세지에 출력할 수 있게 assert!
매크로를 작성했다.
Reslut<T, E>를 이용한 테스트
#[cfg(test)]
mod tests {
#[test]
fn it_works() -> Result<(), String> {
if 2 + 2 == 4 {
Ok(())
} else {
Err(String::from("two plus two does not equal four"))
}
}
}
테스트 실행 제어
스레드 지정
테스트는 기본적으로 속도 향상을 위해 스레드를 이용해 병렬 처리된다. 이 때문에 테스트끼리 충돌이 발생할 수 있으므로, cargo test -- --test-threads=1
과 같이 스레드 개수를 지정해 하나의 스레드만 사용하도록 설정할 수 있다.
함수 출력 표시
테스트에서 출력한 내용을 보고 싶다면 cargo test -- --show-output
을 사용한다.
지정 테스트만 실행
cargo test <function_name>
으로 지정한 함수에 대한 테스트만 실행할 수 있다.
테스트 조직화
유닛 테스트
유닛 테스트는 각 코드 단위를 분리해 어떤 코드가 동작하지 않는지 빠르게 파악하는 것이다. 각 파일에 tests 모듈을 만들고 cfg(test)를 명시하는 것이 관례다.
#[cfg(test)]
는 cargo test
실행 시에만 컴파일 및 실행하라는 뜻이다.
통합 테스트
통합 테스트는 라이브러리의 여러 부분을 함께 사용했을 때 제대로 동작하는지 확인하는 것이다. tests 디렉토리를 먼저 만들어야 한다. 이 디렉토리 내의 코드는 #[cfg(test)]
기 없어도 된다.
'프로그래밍 > Rust' 카테고리의 다른 글
[Rust] 반복자 (0) | 2024.05.19 |
---|---|
[Rust] 클로저 (0) | 2024.05.19 |
[Rust] 제네릭과 트레이트 (0) | 2024.05.19 |
[Rust] 오류 처리 (0) | 2024.05.18 |
[Rust] 컬렉션 (0) | 2024.05.18 |