JUnit5 ParameterizedTest 사용하기

🔥Log·2024년 7월 16일
0

테스트

목록 보기
2/5

💡 글에서 사용한 코드: 깃헙

☕ 개요


이번 글에서는 JUnit에서 제공하는 Parameterized 테스트의 사용법에 대해서 간단히 알아보도록 하겠다.

바~로 고고



🧐 ParameterizedTest ?


	@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 사용하기


1) 여러 값 주입하기: @ValueSource

	...
    
    @ParameterizedTest
    @ValueSource(ints = {1, 2, 3, 4, 5})
    void 숫자_테스트(int num) {
        log.info("{} 테스트 코드", num);
    }
    
    ...

@ParameterizedTest와 함께 @ValueSource 어노테이션을 사용하면, int, byte, long, float, String 등등 모든 종류의 값들을 매개변수로 넘겨서 테스트 코드를 실행할 수 있다.

2) Enum 주입하기: @EnumSource

public enum ArticleType {
    NOTICE, PROMOTION, NOVEL
}
	...
    
	@ParameterizedTest(name = "{index}번째 테스트 {0}")
    @EnumSource(ArticleType.class)
    void Enum_테스트(ArticleType articleType) {
        log.info("{} 테스트 코드", articleType);
    }
    
    ...

@EnumSource를 사용하면, 특정 Enum의 Value들을 매개변수로 넘겨서 테스트 코드를 실행할 수 있다.

3) CSV 주입하기: @CsvSource

	...
    
    @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 데이터를 매개변수로 주입받을 수 있다.

4) 메서드 활용하기: @MethodSource

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

}
  1. @MethodSource를 활용한 매개변수 주입
	...
    
    @ParameterizedTest
    @MethodSource("study.spring_tdd.domain.article.DummyArticles#getDummyArticles")
    void Method_테스트(Article article) {
        log.info("{} 테스트 코드", article.getId());
    }
    
    ...

꼭 이렇게 사용해야하는 건 아니지만, 메서드를 통해서 더미 객체를 여러 개 가져와서 필요한 테스트를 진행하는 것을 가정하고 구현해보았다.

5) 그 외 어노테이션들

  • @NullSource
  • @EmptySource
  • @NullAndEmptySource
  • @ArgumentsSource

이 어노테이션들에 대한 사용법은 Baeldung을 참고하자 🤓

6) DisplayName 수정

	...

    @ParameterizedTest(name = "{index}번째 테스트 {0}")
    @EnumSource(ArticleType.class)
    void Enum_테스트(ArticleType articleType) {
        log.info("{} 테스트 코드", articleType);
    }
    
    ...

@ParameterizedTest에 원하는 형태로 테스트의 이름을 지정해줄 수 있다.



🙏 참고


0개의 댓글