안녕하세요 푸드 백앤드 개발자 박형민입니다.
오늘은 test Fixture 에 대해서 알아보겠습니다.
일종의 개념이라고 생각합니다.
중복 발생되는 행위를 고정시켜 한곳에서 관리하는 개념.
아래의 예시처럼 금액과 나라라는 상태를 가지고있는 Money 객체가 있다고 해봅니다.
@Getter
@AllArgsConstructor
@EqualsAndHashCode
public class Money {
private int money;
private String country;
public Money add(Money anotherMoney) {
checkOrigin(anotherMoney.getCountry());
money+= anotherMoney.getMoney();
return new Money(money, country);
}
private void checkOrigin(final String country) {
if (!country.equals(country)) {
throw new NullPointerException("같은 나라 돈이 아니에여!");
}
}
}
이 Money 객체를 테스트합니다.
@Test
public void simpleAdd() {
Money m12CHF= new Money(12, "CHF");
Money m14CHF= new Money(14, "CHF");
Money expected= new Money(26, "CHF");
Money result= m12CHF.add(m14CHF);
Assertions.assertThat(expected).isEqualTo(result);
}
이와 같은 상황에서, 다른 테스트를 진행한다고할 때, 아래처럼 똑같은 Money 객체를 매번 생성해야하는 상황이 생기겠죠??
@Test
public void simpleAdd() {
Money m12CHF= new Money(12, "CHF");
Money m14CHF= new Money(14, "CHF");
Money expected= new Money(26, "CHF");
Money result= m12CHF.add(m14CHF);
Assertions.assertThat(expected).isEqualTo(result);
}
//예시를 위한 테스트 이므로 중복 발생된 다른 케이스의 테스트 예제라고 생각해주세요ㅎㅎ
@Test
public void anotherAdd() {
Money m12CHF= new Money(12, "CHF");
Money m14CHF= new Money(14, "CHF");
Money 다른비교객체= new Money(26, "CHF");
Money 다른테스트결과= m12CHF.add(m14CHF);
Assertions.assertThat(다른비교객체).isEqualTo(다른테스트결과);
}
Junit 에서는 이러한 상황, 즉 "동일하거나 유사한 개체 집합에 대해 작동하는 두 개 이상의 테스트가 있는경우" 테스트 픽스쳐를 사용하라고 권유합니다.
Junit에서는 테스트 픽스쳐 구현을 위한 픽스쳐 메소드를 제공합니다.
private Money f12CHF_fixture;
private Money f14CHF_fixture;
private Money f28USD_fixture;
@BeforeAll
public void setUp() {
f12CHF_fixture= new Money(12, "CHF");
f14CHF_fixture= new Money(14, "CHF");
f28USD_fixture= new Money(28, "USD");
}
@BeforeAll
@AfterAll
@BeforeEach
@AfterEach
이처럼 junit4 공식문서에서 말하는 fixture 는 테스트 픽스처 메소드를 사용하라고 합니다.
하지만, Fixture는 앞에서 말했다시피 큰 개념이라고 생각합니다.
픽스쳐 메소드를 사용하지 않아도, 중복발생되는 행위를 고정하여 관리하는 방법은 픽스쳐입니다.
아래는 이 개념을 토대로 Fixture 라는 파일에 많은 생성자 케이스를 만들어 별도로 테스트에서 객체의 생성을 관리하는 픽스쳐를 사용하는 예시입니다.
아래 예시의 경우
//Fixtures
public class MoneyFixtures {
public static Money createMoney(final int money) {
return new Money(money, "default");
}
public static Money createMoney(final String country) {
return new Money(10000, country);
}
public static Money createMoney(final int money, final String country) {
return new Money(money, country);
}
}
//Test
public class MoneyFixtureTest {
private Money m12CHF = MoneyFixtures.createMoney(12);
private Money m14CHF = MoneyFixtures.createMoney(14);
@Test
public void simpleAdd() {
Money expected = MoneyFixtures.createMoney(26);
Money result= m12CHF.add(m14CHF);
Assertions.assertThat(expected).isEqualTo(result);
}
}
테스트 픽스쳐는 개념일뿐 위의 2가지 방법이 정답인것은 아닙니다!
2가지 방법 모두 픽스쳐라는 개념을 구성하는 방법일 뿐, 픽스쳐라는 개념을 구현하는 방법은 다양하게 구현할 수 있다고 생각합니다!
감사합니다 :)
아주 알찬 내용이었습니다 ㅎㅎ