For Fun

[rust 공식 문서 14일 공부] 10일차

Jㅐ둥이 2024. 12. 21. 00:40
반응형

11. Writing Automated Tests

지금까지 rust를 공부하면서 프로그래머들의 실수를 컴파일 단계에서 미리 방지해주는 것을 알 수 있었습니다.

강력한 타입 시스템과 엄격한 메모리 관리를 통해서 가능했는데 이것이 모든 버그를 미리 알려준다는 것은 아닙니다.

 

바로 프로그램의 로직 상의 문제는 컴파일러가 알려줄 수 없는데요.

잘못된 로직

이럴 때 필요한 것이 바로 테스트겠지요!

챕터 11에서는 rust에서 테스트 케이스를 작성하는 법을 공부해보겠습니다.

11.1. How to Write Tests

일반적으로 테스트는 다음 3단계로 구성됩니다.

1) 필요한 데이터와 상태를 준비

2) 테스트 하고 싶은 코드 실행

3) 원하는 결과가 나오는지 확인

 

이를 위해서 프로그래밍 언어들은 테스트 프레임워크를 제공하고

테스트 케이스라는 것을 명시하기 위해서 고유한 문법과 용법이 있습니다.

 

rust는 비교적 단순하게 테스트 메소드 위에 #[test] 만 작성해주면 되더라고요.

그리고 cargo test 명령어만 실행하면 됩니다. 추가적인 패키지 설치도 필요 없습니다👍 👍 👍

 

테스트 작성에 필수적인 assert 메소드가 궁금하실텐데요.

공식 문서를 보니 assert!, assert_eq!, assert_ne! 매크로가 있더라고요.

  • assert!는 입력값으로 받은 expression이 true여야 하고
  • assert_eq!는 입력값으로 받은 두 expression의 결과값이 같아야 하고
  • assert_ne!는 입력값으로 받은 두 expression의 결과값이 달라야 합니다.

이외에도 #[should_panic] trait도 있는데 테스트 케이스에서 panic이 발생해야 한다는 뜻이더라고요.

 

11.2. Controlling How Tests Are Run

이제 cargo test 명령어의 옵션에 대해서 조금 더 공부해보겠습니다.

 

  • 테스트를 수행할 스레드 수 설정하기
    • cargo test -- --test-threads=N
  • 테스트 출력값 확인하기
    • cargo test -- --show-output
  • 테스트 케이스 이름으로 필터링 하기
    • cargo test {테스트 케이스 이름}
  • 추가 플래그를 전달하기 전까지는 테스트 케이스가 실행되지 않도록 하기
    • 테스트 케이스 위에 #[ignore] trait 추가
    • #[ignore] trait이 추가된 테스트 케이스 실행하는 방법: cargo test -- --ignored

11.3. Test Organization

이제 테스트 케이스 파일 구성하는 방법에 대해서 알아보겠습니다.

 

테스트 케이스를 만드는 방법은 메소드 위에 #[test] trait만 추가하면 된다고 말씀드렸습니다.

하지만 #[test] trait만 추가하면 컴파일한 바이너리에 테스트 케이스가 포함되어 버립니다.

 

이를 방지하기 위해서 #[cfg(test)] trait이 있습니다.

다음과 같이 #[cfg(test)] trait을 활용하면 컴파일러가 테스트 케이스를 제외하고 바이너리를 생성하게 됩니다.

pub fn add(left: usize, right: usize) -> usize {
    left + right
}

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

    #[test]
    fn it_works() {
        let result = add(2, 2);
        assert_eq!(result, 4);
    }
}

 

그리고 rust에서 통합 테스트를 작성할 때는 src 디렉토리 바깥에 tests 디렉토리를 만들고, tests 디렉토리에서 통합 테스트를 작성하면 됩니다.

 

이렇게 할 시 실제로 외부 코드가 library를 사용하듯이 테스트 케이스를 작성할 수 있습니다! 


공식 문서에서 테스트 케이스 관리법을 이렇게 친절하게 알려주는 것이 인상적이네요...!

 

내일 일정이 있어서 오늘 공부는 이렇게 마쳐보겠습니다 :)

반응형