반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- math
- 문자열
- Java
- CSS
- Visual Studio Code
- 배열
- HashMap
- IntelliJ
- list
- js
- string
- 이클립스
- 인텔리제이
- 자바스크립트
- java테스트
- html
- json
- 단위테스트
- junit5
- 자바문법
- 정규식
- Array
- 테스트자동화
- vscode
- javascript
- input
- 자바
- junit
- Eclipse
- ArrayList
Archives
- Today
- Total
어제 오늘 내일
[JUnit5] ExtensionContext.getTestMethod()로 메소드 정보 조회 본문
1. ExtensionContext.getTestMethod()란 무엇인가
ExtensionContext.getTestMethod()는 현재 실행 중인 테스트가 어떤 테스트 메서드를 실행하고 있는지를 Optional<Method> 형태로 제공하는 JUnit5 확장 API이다.
확장에서 테스트 메서드 정보를 조회하면 다음과 같은 작업이 가능해진다.
- 테스트 메서드 이름 기반 로깅
- 테스트 메서드 애노테이션 검사
- 메서드 시그니처 기반 조건 처리
- 실행 중인 테스트 메서드에 맞춰 동적 설정 적용
확장을 활용하는 테스트 자동화 환경에서는 매우 빈번하게 사용되는 메타데이터 API다.
2. 기본 사용 예제
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import java.lang.reflect.Method;
public class MethodInfoExtension implements BeforeEachCallback {
@Override
public void beforeEach(ExtensionContext context) {
context.getTestMethod().ifPresent(method ->
System.out.println("현재 실행 중인 테스트 메서드: " + method.getName())
);
}
}
설명
- Optional이므로 ifPresent()를 사용해 안전하게 처리해야 한다.
- 테스트 메서드명을 기반으로 확장에서 다양한 처리가 가능하다.
3. 확장 적용 – @ExtendWith
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(MethodInfoExtension.class)
class ExtensionTest {
@Test
void sampleTest() {}
}
출력 예:
현재 실행 중인 테스트 메서드: sampleTest
4. 메서드 애노테이션 검사하기
테스트 메서드에 특정 애노테이션(@DisplayName, @Tag, 커스텀 애노테이션 등)이 붙어 있는지 확인할 수 있다.
@Override
public void beforeEach(ExtensionContext context) {
context.getTestMethod().ifPresent(method -> {
if (method.isAnnotationPresent(Deprecated.class)) {
System.out.println("⚠ Deprecated 테스트 메서드입니다: " + method.getName());
}
});
}
활용 포인트
- 애노테이션 기반 조건 분기
- 테스트 정책 자동화
- 메소드별 특수 처리 적용
5. 리플렉션으로 메서드 시그니처 조회하기
파라미터 타입이나 반환 타입을 기반으로 조건을 처리할 수 있다.
@Override
public void beforeEach(ExtensionContext context) {
context.getTestMethod().ifPresent(method -> {
System.out.println("메서드 파라미터:");
Arrays.stream(method.getParameters())
.forEach(param -> System.out.println(" - " + param.getType().getSimpleName()));
});
}
활용용도
- 테스트 자동 생성/분석 도구에서 사용
- 메서드 구조 기반의 메타 테스트 구성
6. 실행 순서에서 getTestMethod()의 위치
ExtensionContext.getTestMethod()는 BeforeEach, AfterEach, BeforeTestExecution, AfterTestExecution 등 모든 라이프사이클 콜백에서 조회 가능하다.
일반 실행 순서 내에서의 흐름은 다음과 같다.
BeforeEachCallback.beforeEach() → 테스트 메서드 실행 → AfterEachCallback.afterEach()
각 시점에서 동일한 테스트 메서드를 조회할 수 있다.
7. 테스트 실패 시 메서드 정보 활용하기
import org.junit.jupiter.api.extension.AfterEachCallback;
public class FailureLoggingExtension implements AfterEachCallback {
@Override
public void afterEach(ExtensionContext context) {
if (context.getExecutionException().isPresent()) {
String methodName = context.getTestMethod()
.map(Method::getName)
.orElse("UnknownMethod");
System.out.println("❌ 실패한 테스트 메서드: " + methodName);
}
}
}
설명
- 테스트가 실패했을 때만 메서드명을 기록하는 패턴
- CI 환경에서 테스트 실패 분석에 매우 유용함
8. @Nested 및 동적 테스트에서도 정상 작동
ExtensionContext.getTestMethod()는 다음 환경에서도 올바르게 메서드를 반환한다.
- @Nested 내부 클래스의 테스트 메서드
- Dynamic Test에서 실행되는 실제 테스트 람다(method는 없지만 컨텍스트 정보는 제공됨 → Optional.empty())
DynamicTest의 경우 “메서드”가 아니라 “동적 실행 단위”이므로 반환값이 비어 있을 수 있음에 주의.
9. getTestMethod()를 사용하면 좋은 상황 정리
- 테스트 메서드명 기반 로깅/모니터링
- 테스트 정책 또는 환경을 메서드별로 다르게 적용해야 할 때
- 애노테이션 기반으로 테스트 실행 조건을 제어할 때
- 메서드 정보를 분석해 자동화된 테스트 도구를 개발할 때
- 테스트 실패 시 원인을 메서드 단위로 추적해야 할 때
확장 API를 활용하는 경우 getTestMethod()는 가장 중요한 테스트 메타데이터 조회 도구 중 하나이다.
반응형
'IT > JUnit' 카테고리의 다른 글
| [JUnit5] ConditionEvaluationResult.enabled() 사용법 (0) | 2026.01.27 |
|---|---|
| [JUnit5] ExtensionContext.getStore()로 데이터 저장하고 가져오기 (0) | 2026.01.26 |
| [JUnit5] ExtensionContext.getTestClass()로 테스트 클래스 접근하기 (0) | 2026.01.25 |
| [JUnit5] ExtensionContext.getDisplayName() 활용법 (0) | 2026.01.25 |
| [JUnit5] AfterEachCallback.afterEach() 실행 흐름 정리 (0) | 2026.01.24 |
Comments
