JUnit5 - parameterized

parameterized test

parameterized 테스트를 위해서 의존성을 추가해줍니다.

1
2
3
4
5
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit-platform.version}</version>
</dependency>

Value Source

우선 가장 간단한 방법으로 @ValueSource 어노테이션으로 테스트에 파라미터를 전달해보겠습니다.

1
2
3
4
5
@ParameterizedTest
@ValueSource(strings = {"AAA", "BBB", "CCC"})
void testValueSource(String val) {
System.out.println(val);
}

결과는 다음과 같습니다.
Running Test - [1] AAA
AAA
Running Test - [2] BBB
BBB
Running Test - [3] CCC
CCC

Display Name

DisplayName을 지정해보겠습니다.

1
2
3
4
5
6
@DisplayName("Value Source Test")
@ParameterizedTest(name = "{displayName} - [{index}] {arguments}")
@ValueSource(strings = {"AAA", "BBB", "CCC"})
void testValueSource(String val) {
System.out.println(val);
}

결과는 다음과 같습니다.
Running Test - Value Source Test - [1] AAA
AAA
Running Test - Value Source Test - [2] BBB
BBB
Running Test - Value Source Test - [3] CCC
CCC

Enum Source

파라미터로 Enum 클래스 전달도 가능합니다. @EnumSource 어노테이션을 사용해서 파라미터로 Enum 클래스를 전달해줄 것을 표시해줍니다. 다음과 같이 RandomType 이넘 클래스를 정의합니다.

1
2
3
public enum RandomType {
AAA, BBB, CCC;
}

@EnumSource 어노테이션의 값으로 RandomType.class 를 명시해줍니다. 테스트 메소드의 파라미터로 RandomType 을 전달합니다.

1
2
3
4
5
6
@DisplayName("Enum Source Test")
@ParameterizedTest(name = "{displayName} - [{index}] {arguments}")
@EnumSource(RandomType.class)
void enumTest(RandomType randomType) {
System.out.println(randomType);
}

결과는 다음과 같습니다.
Running Test - Enum Source Test - [1] AAA
AAA
Running Test - Enum Source Test - [2] BBB
BBB
Running Test - Enum Source Test - [3] CCC
CCC

CSV Source

CSV 포맷의 데이터를 파라미터로 전달할 수 있습니다. @CsvSource 어노테이션을 사용해줍니다.

1
2
3
4
5
6
7
8
9
10
@DisplayName("CSV Input Test")
@ParameterizedTest(name = "{displayName} - [{index}] {arguments}")
@CsvSource({
"FL, 1, 1",
"OH, 2, 2",
"MI, 3, 1"
})
void csvInputTest(String stateName, int val1, int val2) {
System.out.println(stateName + " = " + val1 + ":" + val2);
}

결과는 다음과 같습니다.
Running Test - CSV Input Test - [1] FL, 1, 1
FL = 1:1
Running Test - CSV Input Test - [2] OH, 2, 2
OH = 2:2
Running Test - CSV Input Test - [3] MI, 3, 1
MI = 3:1

CSV File Source

CSV 파일을 소스로 사용할 수 있습니다. @CsvFileSource 어노테이션의 속성을 통해서 파라미터로 전달할 .csv 파일을 지정해줄 수 있습니다. 또한 numLinesToSkip 값을 지정해서 스킵할 줄의 수를 지정해 줄 수 있습니다. 기본값은 0입니다. 첫번째 행에 컬럼명이 들어가는 경우 1번부터 파라미터로 전달하도록 선언해줄 수 있습니다. input.csv 파일을 다음과 같이 작성해주었습니다.

1
2
3
4
state, val1, val2
FL, 3, 3
OH, 4, 5
MI, 8, 3

1
2
3
4
5
6
@DisplayName("CSV From File Test")
@ParameterizedTest(name = "{displayName} - [{index}] {arguments}")
@CsvFileSource(resources = "/input.csv", numLinesToSkip = 1)
void csvFromFileTest(String stateName, int val1, int val2) {
System.out.println(stateName + " = " + val1 + ":" + val2);
}

결과는 다음과 같습니다.
Running Test - CSV From File Test - [1] FL, 3, 3
FL = 3:3
Running Test - CSV From File Test - [2] OH, 4, 5
OH = 4:5
Running Test - CSV From File Test - [3] MI, 8, 3
MI = 8:3

Method Provider

@MethodSource 어노테이션을 통해서 메소드를 소스로 사용할 수 있습니다. 이때 메소드의 리턴 타입은 Stream<Arguments> 로 선언해줍니다.

1
2
3
4
5
6
static Stream<Arguments> getargs() {
return Stream.of(
Arguments.of("FL", 5, 1),
Arguments.of("OH", 2, 8),
Arguments.of("MI", 3, 5));
}

getargs 메소드를 @MethodSource 어노테이션의 값으로 선언하여 파라미터 소스로 getargs 메소드를 사용할 것을 명시합니다. 테스트 코드는 다음과 같습니다.

1
2
3
4
5
6
@DisplayName("Method Provider Test")
@ParameterizedTest(name = "{displayName} - [{index}] {arguments}")
@MethodSource("getargs")
void fromMethodTest(String stateName, int val1, int val2) {
System.out.println(stateName + " = " + val1 + ":" + val2);
}

결과는 다음과 같습니다.
Running Test - Method Provider Test - [1] FL, 5, 1
FL = 5:1
Running Test - Method Provider Test - [2] OH, 2, 8
OH = 2:8
Running Test - Method Provider Test - [3] MI, 3, 5
MI = 3:5

Custom Provider

ArgumentsProvider 인터페이스 구현을 통해서도 테스트의 소스 정의가 가능합니다. provideArguments 메소드를 오버라이딩 해줍니다.

1
2
3
4
5
6
7
8
9
public class CustomArgsProvider implements ArgumentsProvider {
@Override
public Stream<? extends Arguments> provideArguments(ExtensionContext extensionContext) throws Exception {
return Stream.of(
Arguments.of("FL", 7, 10),
Arguments.of("OH", 11, 42),
Arguments.of("MI", 44, 77));
}
}

테스트 코드에는 위에서 구현한 CustomArgsProvider 클래스를 소스로 전달받기 위해서 @ArgumentsSource 을 선언해주고, 값으로 CustomArgsProvider.class 를 전달합니다.

1
2
3
4
5
6
@DisplayName("Custom Provider Test")
@ParameterizedTest(name = "{displayName} - [{index}] {arguments}")
@ArgumentsSource(CustomArgsProvider.class)
void fromCustomProviderTest(String stateName, int val1, int val2) {
System.out.println(stateName + " = " + val1 + ":" + val2);
}

결과는 다음과 같습니다.
Running Test - Custom Provider Test - [1] FL, 7, 10
FL = 7:10
Running Test - Custom Provider Test - [2] OH, 11, 42
OH = 11:42
Running Test - Custom Provider Test - [3] MI, 44, 77
MI = 44:77

JUnit with Mockito JUnit5 - Nested, Tags, Interface, DI, Repeat

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×