ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JUnit5] @ParameterizedTest, @ValueSource, @CsvSource
    스프링 2023. 11. 1. 17:56

    @ParameterizedTest

    JUnit5에서 추가된 새로운 기능 중 하나이다.

    매개변수를 사용해서 단일 테스트를 여러 번 실행할 수 있다.

     

    Example

    public Class Example{
     private set<Integer> numbers;
    
    	@BeforeEach
       void setUp() {
            numbers = new HashSet<>();
            numbers.add(1);
            numbers.add(1);
            numbers.add(2);
            numbers.add(3);
        }
    }
    

     

    @ValueSource를 활용한 단순 값 비교

    numbers 변수 안에 1,2,3 값이 들어있는지 확인하는 단위 테스트를 작성해보자

    	 @Test
    	 @DisplayName("numbers 1,2,3 값이 존재하는지 확인")
    	 void contains() {
        assertThat(numbers.contains(1)).isTrue();
        assertThat(numbers.contains(2)).isTrue();
        assertThat(numbers.contains(3)).isTrue();
    	 }
    

    위와 같이 작성했을 시에 asserThat 문이 중복되어 코드가 길어진다.

    이를 @ParameterizedTest를 활용해서 중복 코드를 줄여보자

    		@ParameterizedTest
        @ValueSource(ints = {1,2,3})
        @DisplayName("numbers 1,2,3 값이 존재하는지 확인(중복제거)")
        void is_SouldContainsNumberOneTwoThree(int num){
            assertThat(numbers.contains(num)).isTrue();
        }
    

    @ValueSource를 사용하여 리터럴 값의 배열을 테스트 메서드로 전달할 수 있다.

    위의 테스트케이스에서는 1,2,3 값이 아닌 다른 값이 들어가면 테스트 오류가 난다.

    Ture, False 값으로 반환하는 테스트 케이스를 작성해보자.

     

    @CsvSource를 활용하여 Ture, False 값 반환하기

    	  @DisplayName("요구사항3) 1,2,3 값이면 Ture, 4,5면 Flase 반환")
        @ParameterizedTest
        @CsvSource(value = {"1,true","2,true","3,true","4,false","5,false"})
        void contains_TrueOrFalse(int num, boolean expected) {
            assertThat(numbers.contains(num)).isEqualTo(expected);
        }
    

    "1, true"에서 1은 int num, true는 boolean expected의 타입으로써 매개변수로 전달된다.

    @CsvSource는 기본적으로 콤마', '가 구분 자이며, delimiter 속성을 추가해주면 구분자를 지정해줄 수 있다.

    @CsvSource(value = {"1:true","2:true","3:true","4:false","5:false"}, delimiter = ':')
    

    그 외에 @NullSource, @EmptySource, @EnumSource, @CsvFileSource, @MethodSource 등과의 어노테이션을 활용할 수 있다.

    728x90

    댓글

Designed by Tistory.