해당 글에서는 Spring Boot JUni5를 이용하여 반복 테스트 방법에 대해 알아봅니다.
![]()
💡 [참고] JUnit5 테스트 방법에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
분류 | 링크 |
JUnit 5 이론 및 구성 요소 | https://adjh54.tistory.com/341 |
JUnit 5 환경구성 및 활용예제 | https://adjh54.tistory.com/342 |
JUnit 5 반복 테스트 구성 방법 | https://adjh54.tistory.com/541 |
JUnit 5 + Mockito 이론 및 활용예제 | https://adjh54.tistory.com/346 |
JUnit 5 + MockMvc 이론 및 활용예제 | https://adjh54.tistory.com/347 |
Assertions API Document | https://adjh54.tistory.com/348 |
개발방법론 TDD, BDD | https://adjh54.tistory.com/305 |
JUnit 5 + Mockito + MockMVC 사용예제 Github | https://github.com/adjh54ir/blog-codes/tree/main/spring-boot-test |
1) Junit5
💡 JUnit5
- Java 언어에서 독립된 단위 테스트(Unit Test)를 지원해 주는 프레임워크를 의미합니다.
- JUnit 5의 경우 'Java8 이상 버전'부터 지원을 하며 JUnit Platform, Jupiter, Vintage 모듈이 결합된 형태를 가지고 있습니다.
JUnit 5
The JUnit team uses GitHub for version control, project management, and CI.
junit.org
[ 더 알아보기 ]
💡 단위 테스트(Unit Test)
- 소프트웨어 개발에서 개별적인 코드 단위를 테스트하는 것을 의미합니다.
- 코드의 작은 부분을 격리시켜 독립적으로 테스트함으로써 코드의 정확성과 신뢰성을 검증합니다.
- 자동화가 되고 반복 가능하며 버그를 빠르게 찾아내고 수정하는데 도움이 됩니다. 또한 코드 변경 시 기존 기능에 영향을 주지 않고 코드의 동작을 확인하는 데 유용합니다.
💡 단위 테스트의 범위
- 클래스, 메서드, 함수와 같은 작은 단위의 코드를 격리시켜 독립적으로 테스트하는 것을 의미합니다.
- 따라서, 컨트롤러단이나 서비스단과 같은 구성 요소는 각각 개별적인 단위로 테스트될 수 있습니다
2) JUnit 5 반복 테스트
💡 JUnit 5 반복 테스트
- 이전까지 하나의 메서드에 대해 단일 테스트를 진행했다면, 단순 반복적 테스트 방법이나 파라미터 별 테스트 방법을 통해서 반복 테스트를 수행합니다.
- 동일한 테스트를 여러 번 수행함으로써 예기치 않은 상황이나 경계 상황을 더 잘 검증할 수 있습니다.
- 반복 테스트는 주로 @RepeatedTest와 @ParameterizedTest 애노테이션을 사용하여 구현합니다.
3) JUnit 5 반복 테스트: @RepeatedTest를 이용한 단순 반복 테스트
💡 @RepeatedTest
- 동일한 테스트 메서드를 지정된 횟수만큼 반복해서 실행할 수 있게 합니다.
- 이는 특정 입력에 대해 테스트를 여러 번 수행하고 일관성 있는 결과를 보장하기 위해 유용합니다.
1. @RepeatedTest 어노테이션의 속성
💡 @RepeatedTest 어노테이션의 속성
속성 | 필수여부 | 설명 |
value | 필수 | 테스트를 반복할 횟수를 지정합니다. 필수 속성입니다. |
name | 선택 | 반복 테스트의 각 실행에 대해 표시될 이름을 지정합니다. |
RepeatedTest (JUnit 5.0.1 API)
@RepeatedTest is used to signal that the annotated method is a test template method that should be repeated a specified number of times with a configurable display name. Each invocation of the repeated test behaves like the execution of a regular @Test met
junit.org
1.1. @RepeatedTest 어노테이션을 이용한 예시
💡 @RepeatedTest 어노테이션을 이용한 예시
- @RepeatedTest(value = 5)의 값을 주어서 단순 5번 반복되는 테스트를 구성하였습니다.
public class RepeatableTest {
@DisplayName("덧셈 테스트")
@RepeatedTest(value = 5)
public void repeatedAddTest(TestInfo testInfo) {
// Arrange: 준비
Calculator myCalculator = new Calculator();
// Act: 행동
myCalculator.add(10.0);
// Assert: 단언 검증
Assertions.assertEquals(10.0, myCalculator.getResult());
// 현재 반복 횟수와 전체 반복 횟수를 출력
System.out.println(testInfo.getDisplayName());
}
}
1.2. @RepeatedTest 어노테이션을 이용한 결과
💡 @RepeatedTest 어노테이션을 이용한 결과
- 아래와 같이 5번 반복되어 수행이 됨을 확인하였습니다. 또한 모두 테스트에 통과하였습니다.

2. @RepeatedTest 어노테이션의 name 속성을 활용한 출력방법
💡 @Repeated 어노테이션의 name 속성을 활용한 출력방법
- @Repeated 어노테이션 내에는 name 속성이 존재하고, 이에 따라 반복되는 테스트에 대한 이름에 대해 정의를 합니다.
- 기본적으로 "repetition {currentRepetition} of {totalRepetitions}” 형태로 정의되고 출력되지만, 사용자가 원하는 데로 출력이 가능합니다.
💡 name 속성에서 사용되는 변수 값
변수 | 설명 |
{displayName} | 테스트 메서드의 표시 이름을 의미합니다 |
{currentRepetition} | 현재 반복 횟수를 의미합니다 |
{totalRepetitions} | 전체 반복 횟수를 의미합니다 |
2.1. @RepeatedTest 어노테이션의 name 속성을 응용한 예시
💡 @RepeatedTest 어노테이션의 name 속성을 응용한 예시
- 이전 소스와 동일하지만, name 부분을 출력하고자 하는데로 수정하여서 구성하였습니다.
@DisplayName("덧셈 테스트")
@RepeatedTest(value = 5, name = "{displayName} :: 반복 {currentRepetition} / {totalRepetitions}")
public void repeatedAddTest2(TestInfo testInfo) {
// Arrange: 준비
Calculator myCalculator = new Calculator();
// Act: 행동
myCalculator.add(10.0);
// Assert: 단언 검증
Assertions.assertEquals(10.0, myCalculator.getResult());
// 현재 반복 횟수와 전체 반복 횟수를 출력
System.out.println(testInfo.getDisplayName());
}
2.2. @RepeatedTest 어노테이션의 name 속성을 응용한 결과
💡 @RepeatedTest 어노테이션의 name 속성을 응용한 결과
- 아래와 같이 name 속성 값으로 지정한 형태로 출력이 됨을 확인하였습니다.

3. [참고] TestInfo 클래스
💡 TestInfo 클래스
- JUnit 5에서 제공되는 인터페이스로, 테스트 메서드에 대한 유용한 정보를 제공합니다. 이를 통해 테스트 메서드의 이름, 디스플레이 이름, 태그 및 현재 반복 횟수 등의 정보를 얻을 수 있습니다.
- TestInfo는 주로 테스트 메서드에 대한 메타데이터를 확인하거나, 테스트 실행 중에 동적으로 정보를 출력하는 데 사용됩니다.
메서드 | 설명 |
getDisplayName() | 테스트 메서드의 표시 이름을 반환합니다. |
getTestClass() | 테스트 클래스의 Optional<Class<?>>를 반환합니다. |
getTestMethod() | 테스트 메서드의 Optional<Method>를 반환합니다. |
getTags() | 테스트에 정의된 태그들의 Set<String>을 반환합니다. |
TestInfo (JUnit 5.0.1 API)
TestInfo is used to inject information about the current test or container into to @Test, @BeforeEach, @AfterEach, @BeforeAll, and @AfterAll methods. If a method parameter is of type TestInfo, JUnit will supply an instance of TestInfo corresponding to the
junit.org
4) JUnit5 반복 테스트 : @ParameterizedTest를 활용한 매개변수 반복 테스트
💡 @ParameterizedTest
- 여러 매개변수를 사용하여 동일한 테스트를 반복 수행할 수 있게 합니다. 이는 다양한 입력 값에 대해 동일한 테스트 논리를 적용할 때 유용합니다.
- 해당 어노테이션과 함께 Source 어노테이션을 함께 사용합니다.
1. @ParameterizedTest 어노테이션 속성
속성 | 필수여부 | 설명 |
name | 선택 | 각 반복에 대해 표시될 테스트 이름을 지정합니다. 기본값은 "{index}"입니다. |
ParameterizedTest (JUnit 5.0.2 API)
@ParameterizedTest is used to signal that the annotated method is a parameterized test method. @ParameterizedTest methods must specify at least one ArgumentsProvider via the @ArgumentsSource or a corresponding composed annotation. The provider is responsib
junit.org
2. Source Annotation
💡 Source Annotation
- @ParameterizedTest 어노테이션과 함께 사용되는 다양한 소스 어노테이션입니다. 이는 테스트 메서드에 제공할 매개변수를 다르게 제공하는 방법에 대해 정의합니다.
어노테이션 | 설명 |
@MethodSource | 메서드를 통해 매개변수를 제공합니다. 메서드는 Stream<Arguments>, 배열, Iterable과 같은 형태로 매개변수를 반환해야 합니다. |
@ArgumentsSource | 사용자 정의 소스에서 매개변수를 제공합니다. 이를 사용하려면 ArgumentsProvider 인터페이스를 구현해야 합니다. |
@ValueSource | 기본형 데이터 타입 배열을 통해 매개변수를 제공합니다. int, long, double, String 등의 배열을 사용할 수 있습니다. |
@EnumSource | Enum 타입을 통해 매개변수를 제공합니다. 특정 Enum 타입의 모든 항목 또는 선택된 항목들을 테스트에 사용할 수 있습니다. |
@CsvSource | CSV 형식의 문자열을 통해 매개변수를 제공합니다. 각 라인을 매개변수 세트로 처리하며, 다양한 데이터 타입을 지원합니다. |
@CsvFileSource | CSV 파일을 통해 매개변수를 제공합니다. 파일 경로를 지정하여, 파일 내의 각 라인을 매개변수 세트로 처리합니다. |
MethodSource (JUnit 5.0.2 API)
@MethodSource is an ArgumentsSource which provides access to values returned by methods of the class in which this annotation is declared. By default such methods must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS). Th
junit.org
3. @ParameterizedTest와 @MethodSource를 활용한 예시
💡 @ParameterizedTest와 @MethodSource를 활용한 예시
1. parameterized(Double addValue, Double expectedValue)
- @ParameterizedTest와 @MethodSource 어노테이션을 선언하였고 메서드 명으로 parameterizedTestParameters를 매핑하였습니다.
- 그렇기에 테스트가 진행이 되면 파라미터로 parameterizedTestParameters() 메서드에서 반환되는 값을 파라미터로 받습니다.
2. parameterizedTestParameters()
- 각각의 파라미터를 Stream<Arguments> 형태로 준비합니다. 총 4개의 addValue, expectedValue에 대한 파라미터를 구성하였습니다.
/**
* @ParameterizedTest와 @MethodSource를 활용한 예시
*
* @author : jonghoon
* @fileName : MyCalculatorRepeatableTest
* @since : 7/28/24
*/
public class MyCalculatorRepeatableTest {
/**
* parameterized 기능을 이용한 테스트
*
* @param addValue
* @param expectedValue
*/
@DisplayName("각기 다른 파라미터 값에 따라 반복하여 테스트 ")
@ParameterizedTest
@MethodSource("parameterizedTestParameters")
public void parameterized(Double addValue, Double expectedValue) {
// Arrange : 준비
MyCalculator myCalculator = new MyCalculator();
// Act : 행동
myCalculator.add(addValue);
// Assert : 단언 검증
Assertions.assertEquals(expectedValue, myCalculator.getResult());
}
/**
* 전달하려는 파라미터를 구성합니다.
*
* @return
*/
public static Stream<Arguments> parameterizedTestParameters() {
return Stream.of(
Arguments.of(10.0, 10.0),
Arguments.of(8.0, 8.0),
Arguments.of(4.0, 4.0),
Arguments.of(16.0, 16.0)
);
}
}
4. @ParameterizedTest와 @MethodSource를 활용한 예시 결과
💡 @ParameterizedTest와 @MethodSource를 활용한 예시 결과
- 파라미터로 지정된 값을 전달 받아서 테스트가 수행됨을 확인하였습니다.

오늘도 감사합니다. 😀
'Java > Testing' 카테고리의 다른 글
[Java] Spring Boot MockMvc 이해하기 : 테스트 흐름 및 사용예제 (0) | 2023.12.15 |
---|---|
[Java] Spring Boot Mockito 이해하기 : 테스트 흐름 및 사용예시 (0) | 2023.12.14 |
[Java] Spring Boot JUnit5 이해하기 -2 : 환경구성 및 활용 예제 (0) | 2023.12.08 |
[Java] Spring Boot JUnit5 이해하기 -1 : 이론 및 구조 (1) | 2023.12.07 |