[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회용 신선한 픽스처 해체하기
- 아무런 노력 없이 픽스처를 해체할 수 있다.
- 범위를 벗어나면 가비지 컬렉션이 해체 해 준다.