Test Fixture 에 대해서

푸드테크·2022년 10월 31일
0

안녕하세요 푸드 백앤드 개발자 박형민입니다.

오늘은 test Fixture 에 대해서 알아보겠습니다.



Test Fixture 란

일종의 개념이라고 생각합니다.
중복 발생되는 행위를 고정시켜 한곳에서 관리하는 개념.

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에서는 테스트 픽스쳐 구현을 위한 픽스쳐 메소드를 제공합니다.

🙌🏻 Test Fixture 메소드 사용

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");
}

픽스쳐 메소드

  1. @BeforeAll

    • 테스트 메소드 시작 전 1번 실행
  2. @AfterAll

    • 테스트 메서드 종료 후 1번 실행
  3. @BeforeEach

    • 각 테스트 메소드 시작 전 실행
  4. @AfterEach

    • 각 테스트 메소드 종료 후 실행

이처럼 junit4 공식문서에서 말하는 fixture 는 테스트 픽스처 메소드를 사용하라고 합니다.
하지만, Fixture는 앞에서 말했다시피 큰 개념이라고 생각합니다.
픽스쳐 메소드를 사용하지 않아도, 중복발생되는 행위를 고정하여 관리하는 방법은 픽스쳐입니다.

👏🏻 Test Fixtures 를 구성하는 다른 방법

아래는 이 개념을 토대로 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가지 방법 모두 픽스쳐라는 개념을 구성하는 방법일 뿐, 픽스쳐라는 개념을 구현하는 방법은 다양하게 구현할 수 있다고 생각합니다!

감사합니다 :)

profile
푸드 테크 기술 블로그

3개의 댓글

comment-user-thumbnail
2022년 11월 1일

아주 알찬 내용이었습니다 ㅎㅎ

1개의 답글
comment-user-thumbnail
2022년 11월 7일

Fixture Method를 사용하면서도 이게 Test Fixture 란 용어로 사용하는줄은 몰랐네요!
하나 배워 갑니다!

답글 달기