어제 오늘 내일

[JUnit5] TestReporter로 테스트 실행 정보 기록하기 본문

IT/JUnit

[JUnit5] TestReporter로 테스트 실행 정보 기록하기

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

JUnit5에서는 테스트 실행 중 키–값 형태의 실행 정보를 기록할 수 있도록 TestReporter API를 제공합니다.
테스트 로그를 구조화하거나, 테스트 실행 맥락(context)을 기록하고 싶을 때 매우 유용한 도구입니다.

아래에서는 TestReporter의 특징, 사용 방법, 실전 예제를 단계별로 정리합니다.

 

1. TestReporter란?

TestReporter는 JUnit5가 제공하는 테스트 실행 정보 리포팅 인터페이스입니다.
JUnit 플랫폼에 테스트 데이터를 전달하면, IDE·콘솔·리포터(예: Gradle, Maven Surefire)가 이를 받아 적절히 출력합니다.

주요 특징

  • 테스트 실행 중 구조적(key-value) 로그를 남길 수 있음
  • 단순 출력이 아니라 테스트 리포터 시스템에 기록
  • TestInfo처럼 파라미터로 자동 주입받아 사용

주요 메서드

  • publishEntry(String key, String value)
  • publishEntry(Map<String, String> values)

 

2. 기본 사용 예제 – 단일 키-값 출력하기

가장 간단한 예제는 테스트 중 특정 정보를 기록하는 것입니다.

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

class TestReporterBasicTest {

    @Test
    void reportBasicInfo(TestReporter reporter) {
        reporter.publishEntry("status", "started");
        reporter.publishEntry("step", "data loaded");
        reporter.publishEntry("result", "success");
    }
}

설명

  • TestReporter는 테스트 실행 중 자동 제공됨
  • publishEntry로 남긴 정보는 IDE나 빌드 로그에 구조적으로 기록됨

 

3. 여러 값을 한 번에 전달하기

키–값 여러 개를 한 번에 넘기면 더 깔끔하게 실행 정보를 묶어서 기록할 수 있습니다.

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

import java.util.Map;

class TestReporterMapTest {

    @Test
    void reportMultipleData(TestReporter reporter) {
        reporter.publishEntry(Map.of(
                "scenario", "user signup",
                "step", "email verification",
                "status", "pending"
        ));
    }
}

설명

  • 여러 값이 하나의 엔트리로 기록되기 때문에 시나리오 테스트에 특히 유용

 

4. TestReporter를 BeforeEach와 함께 사용하기

각 테스트가 시작될 때 공통 메타데이터를 기록하는 방식도 가능합니다.

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestReporter;

class TestReporterLifecycleTest {

    @BeforeEach
    void before(TestReporter reporter) {
        reporter.publishEntry("event", "test starting");
    }

    @Test
    void sampleTest(TestReporter reporter) {
        reporter.publishEntry("action", "running sampleTest");
    }
}

설명

  • 모든 테스트 실행 전에 "test starting" 이벤트가 기록됨
  • 테스트 로그 분석 시 매우 유용

 

5. TestInfo와 함께 활용하기

TestReporter는 TestInfo와 조합하면 테스트 메타데이터 기반으로 로그를 남기는 구조를 만들 수 있습니다.

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

class TestReporterCombinedTest {

    @Test
    void testWithInfo(TestInfo info, TestReporter reporter) {
        reporter.publishEntry("test", info.getDisplayName());
        reporter.publishEntry("tags", info.getTags().toString());
        reporter.publishEntry("status", "executing");
    }
}

설명

  • TestInfo로 테스트 이름·태그를 가져오고
  • TestReporter로 실행 정보를 기록하는 조합 패턴

 

6. TestReporter 사용 시 유용한 활용 사례

  1. 시나리오 테스트 단계 기록
    • 예: 로그인 → 상품 선택 → 결제
    • 각 단계별 이벤트를 리포팅하여 문제 발생 시 추적성 향상
  2. 테스트 환경 정보 기록
    • OS, JVM 버전, 환경 변수 등
    • 재현이 어려운 문제를 디버깅할 때 유용
  3. CI 파이프라인 로그 품질 향상
    • 단순 println보다 체계적으로 기록 가능
    • 리포터가 구조적으로 인식할 수 있어 검색/필터링이 쉬움
  4. 동적 테스트에서 메타데이터 기록
    • DynamicTest 생성 시 테스트 이름과 실행 정보를 함께 남길 수 있음

 

7. TestReporter 사용 시 주의할 점

  1. 표준 출력이 아닌 리포터 시스템에 기록된다는 점 이해 필요
    • publishEntry는 System.out.println과 다름
    • 리포터의 출력 방식에 따라 보이는 결과가 달라질 수 있음
  2. 민감 정보 기록 금지
    • 환경 값을 기록할 때 비밀번호·API Key 등은 절대 포함하지 않도록 주의
  3. 로깅 기능 대체로 사용 X
    • 비즈니스 로직의 로그가 아닌, 테스트 실행 맥락을 남기는 용도로만 사용
    • SLF4J 같은 일반 로깅 라이브러리의 역할과는 구분해야 함

 

8. 정리

  • TestReporter는 JUnit5에서 제공하는 테스트 실행 정보 기록 도구
  • 테스트 흐름 중 이벤트, 테스트 메타데이터, 시나리오 단계를 구조적으로 리포팅 가능
  • TestInfo와 조합하면 강력한 테스트 문서화·로그 구조 구현 가능
  • CI·IDE와의 연동에서 특히 효과적

 

 

반응형
Comments