어제 오늘 내일

[JUnit5] TestReporter에서 Map 기반 로그 기록하기 본문

IT/JUnit

[JUnit5] TestReporter에서 Map 기반 로그 기록하기

hi.anna 2026. 1. 22. 08:03

1. Map 기반 로그 기록이란?

JUnit5의 TestReporter는 테스트 실행 중 키-값 형태의 구조적 로그를 기록할 수 있도록 지원한다. 그 중 Map 기반 로그 기록은 여러 필드를 하나의 엔트리로 묶어 한 번에 전달할 수 있어, 테스트 단계별 상세 로그를 남길 때 매우 유용하다.

publishEntry(Map<String, String> values) 메서드를 사용하면 복잡한 로그 데이터를 깔끔하고 일관된 구조로 리포트에 남길 수 있다.

 

2. 기본 사용 예제

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

import java.util.HashMap;
import java.util.Map;

class ReporterMapExample {

    @Test
    void publishMapEntry(TestReporter reporter) {
        Map<String, String> log = new HashMap<>();
        log.put("step", "1");
        log.put("action", "DB 연결 초기화");
        log.put("status", "OK");

        reporter.publishEntry(log);
    }
}

설명

  • Map을 구성해 publishEntry()에 그대로 전달한다.
  • 테스트 리포트에 여러 항목이 하나의 구조적 로그로 기록된다.
  • 단일 필드보다 분석하기 쉬운 형태의 데이터를 남길 수 있다.

 

3. Map 기반 로그를 활용한 단계별 로깅 패턴

테스트 수행 흐름을 단계적으로 기록하기에 특히 적합하다.

@Test
void stepLogging(TestReporter reporter) {
    reporter.publishEntry(Map.of(
        "step", "1",
        "detail", "사용자 인증 시작",
        "result", "SUCCESS"
    ));

    reporter.publishEntry(Map.of(
        "step", "2",
        "detail", "데이터 조회",
        "result", "SUCCESS"
    ));
}

활용 포인트

  • 각 단계 로그가 독립 구조로 기록되어 가독성이 높음
  • CI 환경에서 단계별 실패 지점 파악이 훨씬 쉬워짐

 

4. 동적 데이터 기록을 위한 Map 생성 패턴

테스트 중간에 동적으로 값을 채워넣어 로그로 남길 수 있다.

@Test
void dynamicLog(TestReporter reporter) {
    Map<String, String> log = new HashMap<>();
    log.put("step", "validation");
    log.put("time", String.valueOf(System.currentTimeMillis()));

    if (Math.random() > 0.5) {
        log.put("status", "PASS");
    } else {
        log.put("status", "RETRY");
    }

    reporter.publishEntry(log);
}

설명

  • 테스트 내 조건 처리 결과를 구조적으로 기록 가능
  • 재현하기 어려운 조건 테스트 로그를 남길 때 강력함

 

5. BeforeEach/AfterEach에서 Map 기반 로그 사용하기

라이프사이클 훅에서도 Map 기반 로그를 함께 남기면 전체 테스트 흐름을 손쉽게 추적할 수 있다.

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.AfterEach;

class ReporterLifecycleExample {

    @BeforeEach
    void before(TestReporter reporter) {
        reporter.publishEntry(Map.of(
            "event", "BeforeEach",
            "status", "initialized"
        ));
    }

    @AfterEach
    void after(TestReporter reporter) {
        reporter.publishEntry(Map.of(
            "event", "AfterEach",
            "status", "completed"
        ));
    }

    @Test
    void test() {}
}

 

6. Map 로그를 사용하면 좋은 상황 요약

  • 로그를 단순 문자열 대신 구조화된 형태로 남기고 싶을 때
  • 테스트 단계(demo, setup, validation 등)를 기록해야 할 때
  • CI/CD 파이프라인에서 테스트 결과를 정교하게 분석해야 할 때
  • 테스트 자동화 도구에서 파싱하기 좋은 로그가 필요할 때

Map 기반 로그는 테스트 데이터를 구조적으로 표현할 수 있어, 협업 환경에서 테스트 가독성·추적성이 크게 향상된다.

 

 

반응형
Comments