[xUnit 테스트 패턴] 08장 - 1회용 픽스처 관리


08장 - 1회용 픽스처 관리

테스트 픽스처 용어

픽스처란

  • SUT를 실행하기 위한 해줘야 하는 모든 것
  • 픽스처 설치 - 픽스츠를 설치하는 테스트 로직
  • 정문 픽스처 설치
    • SUT의 메소드 호출 인자로 넘겨서 테스트
  • 뒷문 픽스처 설치
    • SUT의 상태가 다른 객체나 컴포넌트에 저장 되어 있음
    • 데이터베이스나 모의 객체, 테스트 대역과 함께 쓰임

신선한 픽스처란

  • 실행하는 모든 테스트를 위해 매법 새로운 픽스처 설치
    • 테스트 하나만을 위해 생성, 삭제
  • 서로 반응하는 테스트 문제 피할 수 있음

무엇이 1회용 신선한 픽스처인가

  • 테스트가 끝날 때마다 픽스처 해체하는 방법
  • 새로운 픽스처를 이전 픽스처와 충돌하지 않게 만드는 방법

신선한 픽스처 생성

  • 인라인 설치
    • 모든 픽스처 설치 로직이 테스트 메소드 안에 있음
  • 테스트 유틸리티 메소드 호출이 필요한 위임 설치
  • 암묵적 설치
    • 테스트케이스 클래스의 setUp 메소드 호출

인라인 픽스처 설치

public void testStatus_inital(){
  // 인라인 설치
  Airport departureAirport = new Airport("Calgary", "YYC");
  Airport destinationAirport = new Airport("Toronto", "YYZ");
  Flight flight = new Flight(flightNumber, departureAirport, destinationAirport);

  //SUT 시행 후 결과 검증
  assertEquals(FlightState.PROPOSED, flight.getStatus());
  // 해체
    // 가비지 컬렉션
}
  • 인라인 설치 단점
    • 테스트 코드 중복이 생기기 쉽다.
      • 깨지기 쉬운 테스트를 만들어 높은 테스트 유지 비용 발생
    • 하드 코딩된 테스트 데이터가 생길 수 있다.
  • 픽스처 설치 코드를 테스트 메소드 밖으로 빼내면 된다.

위임 픽스처 설치

  • 메소드 뽑아내기 리팩토링으로 여러 테스트 메소드에서 사용되는 코드 묶음을 테스트 유틸리티 메소드로 옮겨 놓은 후 테스트 메소드에서 호출
  • 생성메소드 - 테스트에서 의존하는 객체를 생성
    • 테스트 픽스처 생성을 위한 재사용 가능한 부품처럼 사용
public void testStatus_inital(){
  // 설치
  Flight flight = createAnonymousFlight();  //생성 메소드
  //SUT 시행 후 결과 검증
  assertEquals(FlightState.PROPOSED, flight.getStatus());
  // 해체
    // 가비지 컬렉션
}
  • 테스트 메소드에서 꼭 보여주지 않아도 되는 게 있다면 테스트 메소드에서 보이지 않게 해야 한다.

  • 생성 메소드는 테스트케에스 클래스의 private 메소드에 두거나 테스트케이스 상위 클래스로 올리거나 테스트 도우미(Test Helper)로 옮길 수 있다.

암묵적 픽스처 설치

  • setUp 메소드
    • 선택적이거나 프레임워크에서 비어있는 기본 구현을 제공
    • 테스트케이스 클래스마다 전부 setUp 메소드를 작성할 필요는 없다.
  • 암묵적 설치에서는 픽스처 생성 관련 로직을 setUp 메소드에 전부 집어넣어 프레임워크 ‘훅’의 장점 이용 가능
public void testStatus_inital(){
  // 암묵적설치
  //SUT 시행 후 결과 검증
  assertEquals(FlightState.PROPOSED, flight.getStatus());
}
  • 문제점
    • 테스트 메소드에서 기대하는 결과 값과 관련된 테스트 선조건(테스트 픽스처)이 무엇인지 볼 수 없다. -> 테스트 이해하기 어려움
      • setUp 메소드 찾아봐야 함
    • 픽스처 안에서 객체를 지역변수에 담을 수 없다.
    • 지속되는 신선한 픽스처를 사용 할 경우 느린 테스트가 될 수 있다.
    • 픽스처와 SUT의 기대 결과 값과의 인과 관계를 숨기기 때문에 애매한 테스트가 될 수 있다.
  • setUp 메소드만 사용 할 경우 설치 로직만 들어가야 한다.
  • 객체를 클래스 변수에 담을 경우 지속되는 신선한 픽스처가 된다.

혼합형 픽스처 설치

  • 위에 3가지 방식으로 섞어 쓸 때 가치를 발한다.
    • 일반적으로 테스트 메소드 안에서 생성 메소드를 호출해 객체를 얻는다.
    • 생성 메소드를 호출해 픽스처를 생성할 때 setUp 메소드를 읽기 더 쉬워진다.
    • 이들 메소드는 테스트케으스 클래스 계층 구조 밖에 있는 클래스에 위치 할 수 있다.

1회용 신선한 픽스처 해체하기

  • 아무런 노력 없이 픽스처를 해체할 수 있다.
    • 범위를 벗어나면 가비지 컬렉션이 해체 해 준다.