🔐 들어가며
안녕하세요! 이번 포스팅에서는 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
)가 양수라면 isPositive
가 true
를, 음수라면 false
를 반환합니다.
PositiveTest.class
@RunWith(JUnitParamsRunner.class)
public class PositiveTest {
}
JunitParams를 사용하기 위해서는 @RunWith
에 JunitParamsRunner
를 추가해주어야합니다.
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로 간단하게 중복 제거가 가능하니, 사용해보는 것을 추천해드립니다!
혹시 글을 읽으면서 잘못된 내용이 있으면 댓글로 알려주시면 감사하겠습니다! 읽어주셔서 감사합니다! 😊
👏 참고
'Backend > SpringBoot' 카테고리의 다른 글
스프링의 콘셉트(IoC, DI, AOP, PSA) 쉽게 이해하기 (2) | 2023.05.29 |
---|---|
Spring Boot에서 JWT 사용하기 (10) | 2021.06.09 |
단위 테스트에 Spring Securiy 인증 관련 어노테이션들 사용하기 (3) | 2020.12.08 |
Spring Boot에서 Custom Valid Annotation 만들기 (0) | 2020.09.24 |
Spring Boot에서 이벤트 사용하기 (6) | 2020.08.27 |