💡 글에서 사용한 코드: 깃헙
이번 글에서는 JUnit에서 제공하는 Parameterized 테스트의 사용법에 대해서 간단히 알아보도록 하겠다.
바~로 고고
@Test
void 덧셈_테스트_1() {
// 1 + 1 = 2
}
@Test
void 덧셈_테스트_2() {
// 1 + 2 = 3
}
@Test
void 덧셈_테스트_3() {
// 2 + 1 = 3
}
테스트 코드를 작성할 때, 테스트 변수만 변하고 테스트하는 로직은 동일해서 여러개의 동일한 테스트 메서드를 작성하거나 Loop문을 돌리도록 테스트 코드를 작성한 경험이 있을 것이다.
이런 상황에서 테스트 코드를 좀 더 쉽게 작성할 수 있도록 JUnit에 포함되어 있는 기능이 ParameterizedTest이다.
@ParameterizedTest
@EnumSource(ints = {1, 2, 3})
void 덧셈_테스트(int num) {
// num + 2 = ??
}
@ParameterizedTest
어노테이션을 테스트 메서드에 붙이면 다양한 변수를 하나의 테스트 코드로 테스트할 수 있게 된다.
...
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4, 5})
void 숫자_테스트(int num) {
log.info("{} 테스트 코드", num);
}
...
@ParameterizedTest
와 함께 @ValueSource
어노테이션을 사용하면, int, byte, long, float, String 등등 모든 종류의 값들을 매개변수로 넘겨서 테스트 코드를 실행할 수 있다.
public enum ArticleType {
NOTICE, PROMOTION, NOVEL
}
...
@ParameterizedTest(name = "{index}번째 테스트 {0}")
@EnumSource(ArticleType.class)
void Enum_테스트(ArticleType articleType) {
log.info("{} 테스트 코드", articleType);
}
...
@EnumSource
를 사용하면, 특정 Enum의 Value들을 매개변수로 넘겨서 테스트 코드를 실행할 수 있다.
...
@ParameterizedTest
@CsvSource(value = {"a1,a2,a3,a4", "b1,b2,b3,b4", "c1,c2,c3,c4"}, delimiter = ',')
void CSV_테스트(String v1, String v2, String v3, String v4) {
log.info("{}, {}, {}, {} 테스트 코드", v1, v2, v3, v4);
}
...
@CsvSource
를 사용하면, csv 형태의 문자열을 매개변수로 주입받을 수 있고, @CsvFileSource
를 사용하면, 특정 CSV 파일 안의 csv 데이터를 매개변수로 주입받을 수 있다.
1. 객체 만들기
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class Article {
private Long id;
private String title;
private String content;
}
2. Dummy 객체를 관리하는 클래스 만들기
import java.util.stream.Stream;
public class DummyArticles {
public static Stream<Article> getDummyArticles() {
return Stream.of(
new Article(1L, "제목1", "내용1"),
new Article(2L, "제목2", "내용2"),
new Article(3L, "제목3", "내용3"),
new Article(4L, "제목4", "내용4"),
new Article(5L, "제목5", "내용5")
);
}
}
@MethodSource
를 활용한 매개변수 주입 ...
@ParameterizedTest
@MethodSource("study.spring_tdd.domain.article.DummyArticles#getDummyArticles")
void Method_테스트(Article article) {
log.info("{} 테스트 코드", article.getId());
}
...
꼭 이렇게 사용해야하는 건 아니지만, 메서드를 통해서 더미 객체를 여러 개 가져와서 필요한 테스트를 진행하는 것을 가정하고 구현해보았다.
@NullSource
@EmptySource
@NullAndEmptySource
@ArgumentsSource
이 어노테이션들에 대한 사용법은 Baeldung을 참고하자 🤓
...
@ParameterizedTest(name = "{index}번째 테스트 {0}")
@EnumSource(ArticleType.class)
void Enum_테스트(ArticleType articleType) {
log.info("{} 테스트 코드", articleType);
}
...
@ParameterizedTest
에 원하는 형태로 테스트의 이름을 지정해줄 수 있다.