Updated:

1 minute read

개요

  • test 속성을 어노테이션하는 함수
  • 매크로
    • assert!
      • true이면 통과 아니면 패닉 발생
    • assert_eq!
      • 같으면 통과 아니면 패닉 발생
    • assert_ne!
      • 다르면 통과 아니면 패닉 발생
  • 속성
    • should_panic
      • 패닉이 발생하면 통과 아니면 실패
      • expected 파라미터를 통해 특정 패닉 메세지를 지닌 패닉 테스트 가능
    • ignore
      • 테스트 배제
  • 커스텀 실패 메세지
    • assert!, assert_eq!, assert_ne!의 추가 인자 전달 가능
  • cargo test 플래그
    • --test-threads
      • 테스트 스레드 개수 조정
    • --nocapture
      • 출력 캡처 동작 비활성화
      • 성공한 테스트의 출력 메세지도 출력
    • --ignored
      • ignored만 테스트
    • cargo test xxx
      • xxx 테스트만 테스트


단위 테스트(unit test)

  • 한 번에 하나의 모듈만 분리하여 테스트
  • 각 코드의 단위를 나머지 부분과 분리하여 테스트하는 것이 목적
  • 비공개 인터페이스(private interface)를 테스트
  • src 디렉토리 내에 위치
  • 각 파일마다 cfg(test)를 어노테이션하며 테스트 함수를 담고 있는 tests라는 이름의 모듈을 생성
  • #[cfg(test)] 어노테이션
    • cargo test를 수행할 때에만 컴파일하고 실행
    • 코드와 테스트 코드가 동일한 파일에 존재하므로 빌드 시에는 포함시키지 않기 위함
    • 통합 테스트는 라이브러리 외부에 위치하기 때문에 해당 주석이 필요하지 않음


통합 테스트(integration test)

  • 외부에서 공개 인터페이스(public interface)를 테스트
  • 프로젝트 최상위 디렉토리(src와 같은 레벨)에 tests 디렉토리에 위치
  • 각각의 파일들을 개별적인 크레이트처럼 컴파일
  • 공통 코드
    • tests/common/mod.rs에 구현
    • 그래야 테스트 출력에 나타나지 않음
  • 바이너리 크레이트를 위한 통합 테스트
    • src/main.rs에 정의한 함수를 가져올 수 없음
    • src/lib.rs에 대부분 구현 후 테스트 코드 작성
    • src/main.rs에는 테스트할 필요 없을 정도의 소량의 코드(src/lib.rs의 로직을 호출하는)만 구현