어제 오늘 내일

[JUnit5] TestInfo.getTestClass()로 테스트 클래스 정보 얻기 본문

IT/JUnit

[JUnit5] TestInfo.getTestClass()로 테스트 클래스 정보 얻기

hi.anna 2026. 1. 21. 01:16

1. getTestClass()란 무엇인가

TestInfo.getTestClass()는 현재 실행 중인 테스트가 속해 있는 테스트 클래스 정보를 Optional<Class<?>> 형태로 제공하는 메서드다.
테스트 이름이나 태그뿐 아니라, 테스트가 어떤 클래스에서 실행되고 있는지를 런타임에 파악할 수 있어 로깅, 공통 동작 처리, 리플렉션 기반 테스트 설정에 활용되기 좋다.

Optional로 감싸져 있으므로 값이 없을 가능성도 처리해야 한다.

 

2. 기본 사용 예제

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;

class TestClassInfoExample {

    @Test
    void testClassInfo(TestInfo testInfo) {
        System.out.println("테스트 클래스: " + testInfo.getTestClass());
    }
}

설명

  • 출력값은 Optional[클래스명] 형태로 표시된다.
    예: Optional[class TestClassInfoExample]
  • Optional이므로 isPresent() 또는 orElse() 등을 활용해 안전하게 값을 꺼내야 한다.

 

3. 클래스명을 문자열로 정리해 출력하기

@Test
void printClassName(TestInfo testInfo) {
    String className = testInfo.getTestClass()
                               .map(Class::getSimpleName)
                               .orElse("UnknownClass");

    System.out.println("현재 테스트 클래스명: " + className);
}

설명

  • map(Class::getSimpleName)을 이용해 순수 클래스명만 추출할 수 있다.
  • Optional을 사용하여 값이 없을 경우 기본값 처리도 쉽게 가능하다.

 

4. 클래스 기반 공통 로깅 처리

테스트 클래스마다 공통 설정을 자동으로 적용하는 패턴이다.

@Test
void classBasedLogging(TestInfo testInfo) {
    String className = testInfo.getTestClass()
                               .map(Class::getName)
                               .orElse("UnknownClass");

    System.out.println("[START] " + className);

    // 테스트 실행 로직
    assertTrue(true);
}

활용 포인트

  • 테스트 클래스 단위로 로깅을 통일하고 싶을 때
  • 여러 테스트 파일에서 공통 형식의 로그를 생성하고 싶을 때
  • 테스트 클래스별 환경 설정을 자동 적용할 때

 

5. getTestClass() + 리플렉션 활용 예제

테스트 클래스에 특정 애노테이션이 있는지 검사하는 패턴이다.

@Test
void checkCustomAnnotation(TestInfo testInfo) {
    Class<?> testClass = testInfo.getTestClass().orElse(null);

    if (testClass != null && testClass.isAnnotationPresent(Deprecated.class)) {
        System.out.println("이 테스트 클래스는 Deprecated 상태입니다.");
    }

    assertTrue(true);
}

설명

  • 메타 애노테이션을 기반으로 테스트 일부를 조건부 실행하거나 경고를 출력할 수 있다.
  • 커스텀 애노테이션을 만들면 더욱 강력한 테스트 설정이 가능하다.

 

6. BeforeEach에서 테스트 클래스 정보를 사용하는 패턴

테스트 메서드뿐 아니라 라이프사이클 훅에서도 TestInfo를 받을 수 있다.

import org.junit.jupiter.api.BeforeEach;

class ClassLevelInitializationTest {

    @BeforeEach
    void setup(TestInfo testInfo) {
        String className = testInfo.getTestClass()
                                   .map(Class::getSimpleName)
                                   .orElse("UnknownClass");

        System.out.println(">>> 테스트 준비 중: " + className);
    }

    @Test
    void sampleTest() {
        assertEquals(1, 1);
    }
}

설명

  • 테스트 실행 전마다 해당 클래스명을 기반으로 로그·초기화 작업을 자동 수행할 수 있다.
  • 다수의 테스트 클래스가 있는 프로젝트에서 특히 유용하다.

 

7. getTestClass()를 사용하면 좋은 상황 요약

  • 테스트 클래스 기반 로깅이 필요한 경우
  • 클래스 애노테이션을 검사해 조건부 테스트 제어가 필요할 때
  • 클래스별 초기화 로직을 자동화하고 싶을 때
  • CI 환경에서 어떤 테스트 클래스가 실행 중인지 명확하게 기록하고자 할 때

특히 규모가 큰 프로젝트에서는 클래스 단위 메타데이터를 활용하면 테스트 가독성과 유지보수성이 크게 증가한다.

 

반응형
Comments