Study/Java

[Java] JUnit ParameterizedTest input 여러개 테스트 돌리기

dev_kong 2022. 11. 3. 23:12
728x90
728x90

0. 목차

1. 개요

2. 여러개 테스트 한큐에 돌리기(ParamterizedTest)

3. 그외에도 이것저것

1. 개요

프리코스 2주차 2일째.
고난과 역경의 TDD 하다가

TDD하는 내 심정

input 여러개 넣고 한큐에 테스트 돌리는 방법 찾다가 알게된거 정리해볼려고한다.

2. 여러개 테스트 한큐에 돌리기(@ParameterizedTest)

예를 들어서, 인자로 받은 숫자가 짝수인지 아닌지 테스트하는 테스트 코드를 작성했다고 해보자.

@Test
void check_odd_test() {
    Integer input = 2;
    boolean result = isOdd(input);

    Assertions.assertThat(result).isTrue();
}

input의 값을 2로 지정하고 테스트가 통과했다.
하지만 나는 나를 스스로 믿지 못하고 테스트를 몇개 더 돌려보고 싶었는데,
직접 일일이 input 값을 변경하면서 테스트를 돌렸었다.

 

이렇게 멍청한 짓을 10번 정도 하다가,
분명 이거 똑똑하게 하는 방법 있을텐데. 라는생각이 들어서 이제서야 검색을 해봤다.

@ParameterizedTest@ValueSource를 활용하면 된다.

 

@ParameterizedTest
@ValueSource(ints = {"0", "2", "4", "6", "8", "12"})
void check_odd_test(int input) {
    boolean result = isOdd(input);

    Assertions.assertThat(result).isTrue();
}

 

이렇게 테스트 코드를 작성하게 되면,
ValueSource의 인자로 들어간 값들이 순서대로 check_odd_test의 인자값으로 들어간다.
이렇게 하면 한번에 여러개의 값을 테스트 해볼 수 있다.

 

3. ParameterizedTest 다른 활용들

ParameterizedTest는 이외에도 다양한 활용이 가능하다.

 

3-1. NullSource

null 값이 들어갔을 때를 테스트 하기 위해 사용된다.

@ParameterizedTest
@NullSource
void isBlank_ShouldReturnTrueForNullInputs(String input) {
    Assertions.assertThat(result).isBlank();
}

 

 

3-2. EmptySource

공백문자열이 들어갔을 때를 테스트 하기 위해 사용한다.

@ParameterizedTest
@EmptySource
void isBlank_ShouldReturnTrueForNullInputs(String input) {
    Assertions.assertThat(result).isBlank();
}

 

 

3-3. NullAndEmptySource

이름은 And가 들어가지만 사실 Or의 역할임.
문자열이 null 또는 Empty 일 경우의 테스트를 위해 사용한다.

@ParameterizedTest
@NullAndEmptySource
void isBlank_ShouldReturnTrueForNullInputs(String input) {
    Assertions.assertThat(result).isBlank();
}

 

 

3-4. EnumSource

Enum 타입을 인수로 전달 가능하다

@ParameterizedTest
@EnumSource(Day.class)
void check_odd_test(Day day) {
    Integer input = day.getValue();
    Assertions.assertThat(input > 0 && input < 8).isTrue();
}

 

만약 Enum 전체가 아닌 일부만 사용하고 싶다면 아래와 같이 하면된다.

@ParameterizedTest
@EnumSource(value = Day.class, names = {"MONDAY", "TUESDAY", "WEDNESDAY"})
void check_odd_test(Day day) {
    Integer input = day.getValue();
    Assertions.assertThat(input < 4).isTrue();
}

요렇게.

이외에도 굉장히 많은 활용법이 있는데,
나의 자그마한 블로그에 담기는 너무 방대하다.
이정도면 내가 쓸정도는 정리한 것 같다

혹시라도 더 궁금해진다면, 아래의 링크를 참고하자^^
https://www.baeldung.com/parameterized-tests-junit-5

 

Guide to JUnit 5 Parameterized Tests | Baeldung

Learn how to simplify test coverage in JUnit 5 with parameterized tests

www.baeldung.com

 

728x90
728x90