프로그래밍Rust 개발자

Rust에서 '단위 테스트'를 구현하는 방법, 올바르게 조직하는 방법 및 테스트 코드의 신뢰성과 가독성을 보장하는 기법은 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

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)] 없음)
  • 테스트 내에서 코드 중복 또는 복잡한 로직
  • assert_eq! 미사용 또는 지나치게 복잡한 검사

실생활 예시

부정적 케이스

테스트가 기본 코드와 혼합되어 #[cfg(test)]로 숨겨져 있지 않으며, 전역 변수를 초기화하는 데 사용합니다.

장점:

  • 빠른 프로토타이핑

단점:

  • 테스트 코드가 릴리스에 포함됨
  • 코드 변경으로 인해 테스트가 깨지며 격리되지 않음

긍정적 케이스

테스트가 중첩 모듈에 캡슐화되어 있고, setup 함수와 assert_eq! 매크로를 사용하여 검증합니다.

장점:

  • 테스트를 프로덕션 코드로부터 격리
  • 빠르고 예측 가능한 테스트 실행

단점:

  • 규율과 올바른 파일 구조가 필요함