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 | public enum RandomType { |
@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
4state, val1, val2
FL, 3, 3
OH, 4, 5
MI, 8, 3
1 | @DisplayName("CSV From File Test") |
결과는 다음과 같습니다.
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
6static 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
9public 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
Comments