본문 바로가기

Backend/SpringBoot

JUnit4에서 JUnitParams 이용해서 파라미터 테스트하기

🔐 들어가며

안녕하세요! 이번 포스팅에서는 JUnit4에서 사용할 수 있는 JUnitParams에 대해 소개해드리려고 합니다.

// 만약 위 세 개의 테스트를 하나의 테스트로 돌릴 수 있다면?
@Test
public void positiveTest1() {
    Positive positive = new Positive(1);
    assertThat(positive.isPositive()).isEqualTo(true);
}

@Test
public void positiveTest2() {
    Positive positive = new Positive(5);
    assertThat(positive.isPositive()).isEqualTo(true);
}

@Test
public void positiveTest3() {
    Positive positive = new Positive(-1);
    assertThat(positive.isPositive()).isEqualTo(false);
}

JUnitParams를 사용하면 위 테스트들과 같이 값만 다르고 나머지 로직이 똑같은 테스트들을 테스트 하나로 여러 값을 반복해서 돌릴 수 있습니다. 전체 코드는 Github에서 확인이 가능합니다.

⚠️ 해당 포스팅은 Junit4를 기준으로 작성되었습니다. (Junit5에서는 사용법이 바뀌었습니다.)


📚 사전준비

1. 의존성 추가

build.gradle

testCompile("pl.pragmatists:JUnitParams:1.1.0")

JUnitParams를 사용하기 위해 의존성을 추가해줍니다.


💻 구현

1. 테스트용 도메인 및 테스트 코드 만들기

 

Positive.class

public class Positive {

  private int number;
  private boolean isPositive;

  public boolean isPositive() {
    return isPositive;
  }

  public Positive(int number) {
    this.number = number;
    this.isPositive = number > 0;
  }
}

테스트용 도메인으로 Positive라는 클래스를 만들어주었습니다. 생성할 때 입력받는 숫자(number)가 양수라면 isPositivetrue를, 음수라면 false를 반환합니다.

 

PositiveTest.class

@RunWith(JUnitParamsRunner.class)
public class PositiveTest {
}

JunitParams를 사용하기 위해서는 @RunWithJunitParamsRunner를 추가해주어야합니다.

 

2. 직접 값 입력하기

 

PositiveTest.class

@RunWith(JUnitParamsRunner.class)
public class PositiveTest {

  @Test
  @Parameters({
      "1, true",
      "2, true",
      "-1, false"
  })
  public void positive(int number, boolean isPositive) {
    // given, when
    Positive positive = new Positive(number);

    // then
    assertThat(positive.isPositive()).isEqualTo(isPositive);
  }
}

JunitParams를 사용하는 첫 번째 방법은 @Parameters에 순서대로 넣어줄 파라미터들을 입력하는 것입니다. 값들(number, isPositive)은 테스트 메소드에서 파라미터로 받아 사용이 가능합니다.

 

위 코드를 실행하면 세 개의 테스트가 순서대로 동작합니다.

 

만약 실패하는 값을 넣는다면 틀린 값이 무엇인지 알려줍니다.

 

3. 값 메소드로 분리하기

 

PositiveTest.class

@RunWith(JUnitParamsRunner.class)
public class PositiveTest {

  @Test
  @Parameters(method = "parameters")
  public void positive(int number, boolean isPositive) {
    // given, when
    Positive positive = new Positive(number);

    // then
    assertThat(positive.isPositive()).isEqualTo(isPositive);
  }

private Collection<Object[]> parameters() {
    return Arrays.asList(new Object[][]{
        {1, true},
        {2, true},
        {-1, false}
    });
  }
}

두 번째 방법으로는 method 속성을 이용하여 메소드 이름을 지정하는 방법입니다. 첫 번째 방법보다 조금 더 type-safe하고, 재사용이 가능하다는 장점이 존재합니다.

 

 

PositiveTest.class

@RunWith(JUnitParamsRunner.class)
public class PositiveTest {

  @Test
  @Parameters
  public void positive(int number, boolean isPositive) {
    // given, when
    Positive positive = new Positive(number);

    // then
    assertThat(positive.isPositive()).isEqualTo(isPositive);
  }

private Collection<Object[]> parametersForPositive() {
    return Arrays.asList(new Object[][]{
        {1, true},
        {2, true},
        {-1, false}
    });
  }
}

만약 메소드 이름을 parametersFor + 테스트 메소드 이름으로 짓는다면 method 속성을 생략할 수 있습니다. 대신 재사용은 불가능하다는 단점이 있습니다.

 


✨ 정리

테스트를 돌릴 때 값만 다르고 로직이 같은 테스트 코드가 있다면, JunitParams로 간단하게 중복 제거가 가능하니, 사용해보는 것을 추천해드립니다!

혹시 글을 읽으면서 잘못된 내용이 있으면 댓글로 알려주시면 감사하겠습니다! 읽어주셔서 감사합니다! 😊


👏 참고