반응형
해당 글에서는 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 모듈이 결합된 형태를 가지고 있습니다.
[ 더 알아보기 ]
💡 단위 테스트(Unit Test)
- 소프트웨어 개발에서 개별적인 코드 단위를 테스트하는 것을 의미합니다.
- 코드의 작은 부분을 격리시켜 독립적으로 테스트함으로써 코드의 정확성과 신뢰성을 검증합니다.
- 자동화가 되고 반복 가능하며 버그를 빠르게 찾아내고 수정하는데 도움이 됩니다. 또한 코드 변경 시 기존 기능에 영향을 주지 않고 코드의 동작을 확인하는 데 유용합니다.
💡 단위 테스트의 범위
- 클래스, 메서드, 함수와 같은 작은 단위의 코드를 격리시켜 독립적으로 테스트하는 것을 의미합니다.
- 따라서, 컨트롤러단이나 서비스단과 같은 구성 요소는 각각 개별적인 단위로 테스트될 수 있습니다
2) JUnit 5 반복 테스트
💡 JUnit 5 반복 테스트
- 이전까지 하나의 메서드에 대해 단일 테스트를 진행했다면, 단순 반복적 테스트 방법이나 파라미터 별 테스트 방법을 통해서 반복 테스트를 수행합니다.
- 동일한 테스트를 여러 번 수행함으로써 예기치 않은 상황이나 경계 상황을 더 잘 검증할 수 있습니다.
- 반복 테스트는 주로 @RepeatedTest와 @ParameterizedTest 애노테이션을 사용하여 구현합니다.
3) JUnit 5 반복 테스트: @RepeatedTest를 이용한 단순 반복 테스트
💡 @RepeatedTest
- 동일한 테스트 메서드를 지정된 횟수만큼 반복해서 실행할 수 있게 합니다.
- 이는 특정 입력에 대해 테스트를 여러 번 수행하고 일관성 있는 결과를 보장하기 위해 유용합니다.
1. @RepeatedTest 어노테이션의 속성
💡 @RepeatedTest 어노테이션의 속성
속성 | 필수여부 | 설명 |
value | 필수 | 테스트를 반복할 횟수를 지정합니다. 필수 속성입니다. |
name | 선택 | 반복 테스트의 각 실행에 대해 표시될 이름을 지정합니다. |
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>을 반환합니다. |
4) JUnit5 반복 테스트 : @ParameterizedTest를 활용한 매개변수 반복 테스트
💡 @ParameterizedTest
- 여러 매개변수를 사용하여 동일한 테스트를 반복 수행할 수 있게 합니다. 이는 다양한 입력 값에 대해 동일한 테스트 논리를 적용할 때 유용합니다.
- 해당 어노테이션과 함께 Source 어노테이션을 함께 사용합니다.
1. @ParameterizedTest 어노테이션 속성
속성 | 필수여부 | 설명 |
name | 선택 | 각 반복에 대해 표시될 테스트 이름을 지정합니다. 기본값은 "{index}"입니다. |
2. Source Annotation
💡 Source Annotation
- @ParameterizedTest 어노테이션과 함께 사용되는 다양한 소스 어노테이션입니다. 이는 테스트 메서드에 제공할 매개변수를 다르게 제공하는 방법에 대해 정의합니다.
어노테이션 | 설명 |
@MethodSource | 메서드를 통해 매개변수를 제공합니다. 메서드는 Stream<Arguments>, 배열, Iterable과 같은 형태로 매개변수를 반환해야 합니다. |
@ArgumentsSource | 사용자 정의 소스에서 매개변수를 제공합니다. 이를 사용하려면 ArgumentsProvider 인터페이스를 구현해야 합니다. |
@ValueSource | 기본형 데이터 타입 배열을 통해 매개변수를 제공합니다. int, long, double, String 등의 배열을 사용할 수 있습니다. |
@EnumSource | Enum 타입을 통해 매개변수를 제공합니다. 특정 Enum 타입의 모든 항목 또는 선택된 항목들을 테스트에 사용할 수 있습니다. |
@CsvSource | CSV 형식의 문자열을 통해 매개변수를 제공합니다. 각 라인을 매개변수 세트로 처리하며, 다양한 데이터 타입을 지원합니다. |
@CsvFileSource | CSV 파일을 통해 매개변수를 제공합니다. 파일 경로를 지정하여, 파일 내의 각 라인을 매개변수 세트로 처리합니다. |
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 |