Rust에서 모듈 테스트는 내장 매크로, 특수 속성 및 cargo 인프라를 통해 언어 자체에 통합되어 있습니다. C 및 기타 여러 언어에서는 테스트가 외부 추가 기능으로 제공되지만, 이는 프로덕션 코드와 테스트 간의 인터페이스가 불일치하게 만듭니다. Rust에서는 테스트가 기본 코드와 동일한 환경에서 컴파일되고 실행되므로 "테스트에서만 작동함"이라는 문제를 제거할 수 있습니다.
문제: 테스트가 빌드를 느리게 하거나 비정보적이거나 잘 조직되지 않을 수 있으며, 잘 분리되지 않은 테스트는 코드 유지보수와 가독성을 방해합니다.
해결책: 테스트는 #[test] 속성이 있는 특별한 함수로 작성되며, mod tests 모듈 내에 위치합니다. 모든 테스트 코드는 cargo test 키로만 컴파일되고 실행되며, 프로덕션 빌드에서는 제외됩니다. assert_eq!, should_panic 및 setup 메소드와 같은 매크로를 사용하여 테스트 효율성과 청결성을 높입니다.
코드 예시:
pub fn add(a: i32, b: i32) -> i32 { a + b } #[cfg(test)] mod tests { use super::*; #[test] fn test_add() { assert_eq!(add(2, 2), 4); } }
주요 특징:
cargo test로 빌드할 때만 컴파일되며, 릴리스 바이너리에 포함되지 않음테스트를 반드시 mod tests라는 중첩 모듈에만 배치해야 합니까?
필수는 아니지만, 테스트를 격리하고 릴리스를 위한 테스트 코드 누수를 방지하기 위해 일반적으로 그렇게 합니다. 또한 #[cfg(test)]를 사용할 수 있도록 도와줍니다.
특정 모듈/파일에서만 테스트를 실행할 수 있습니까?
네, cargo test 이름을 사용하여 테스트 이름이나 경로를 지정할 수 있습니다.
비공식 함수도 테스트됩니까?
네, 테스트 모듈이 동일한 파일 내에 정의되고 use super::*;를 사용하면 테스트는 해당 파일의 모든 내부 함수에 접근할 수 있습니다.
테스트가 기본 코드와 혼합되어 #[cfg(test)]로 숨겨져 있지 않으며, 전역 변수를 초기화하는 데 사용합니다.
장점:
단점:
테스트가 중첩 모듈에 캡슐화되어 있고, setup 함수와 assert_eq! 매크로를 사용하여 검증합니다.
장점:
단점: