어제 오늘 내일

[JUnit] TestResult 활용 – 실행 결과와 실패 정보 확인하기 본문

IT/JUnit

[JUnit] TestResult 활용 – 실행 결과와 실패 정보 확인하기

hi.anna 2026. 1. 13. 01:10

JUnit의 테스트 실행 구조를 이해하려면 TestResult 객체가 어떤 역할을 하는지 알고 있어야 합니다.
특히 JUnit3·4 스타일에서는 TestResult가 테스트 실행 과정에서

  • 몇 개의 테스트가 실행되었는지
  • 실패는 무엇인지
  • 어떤 예외가 발생했는지
    등을 모두 기록하는 핵심 클래스였습니다.

JUnit5에서도 내부 개념은 유지되며, 리스너 기반의 결과 수집이 사실상 TestResult의 확장된 형태입니다.

이 글에서는 TestResult가 어떤 일을 하는지, 어떻게 활용되는지, 실전 예제 중심으로 쉽게 정리합니다.

 

1. TestResult란 무엇인가?

TestResult는 테스트 실행 결과를 저장하는 객체입니다.
테스트가 실행되면 JUnit 러너는 그 결과를 TestResult에 하나씩 기록합니다.

TestResult가 관리하는 대표 정보

  • 실행된 테스트 개수
  • 실패(failures) 목록
  • 에러(errors) 목록
  • 성공 여부
  • 테스트 실행 중 발생한 예외

즉, 테스트 완료 후 결과를 요약하는 보고서 역할을 합니다.

 

2. TestResult 기본 사용 패턴 (JUnit3 방식)

JUnit3에서는 직접 TestResult 객체를 만들어 테스트를 실행하는 방식이 흔했습니다.

예제 코드

import junit.framework.TestResult;
import junit.framework.TestSuite;

public class RunWithResult {
    public static void main(String[] args) {
        TestSuite suite = new TestSuite(MyTest.class);
        TestResult result = new TestResult();

        suite.run(result); // 실행 결과가 result에 담김

        System.out.println("실행된 테스트 수: " + result.runCount());
        System.out.println("실패한 테스트 수: " + result.failureCount());
        System.out.println("에러 발생 수: " + result.errorCount());
    }
}

실행 흐름

  1. TestSuite가 내부 테스트를 차례대로 실행
  2. 각 테스트의 성공/실패 정보를 result에 기록
  3. 실행 후 result에서 요약 정보 사용 가능

 

3. 실패 정보 확인하기 – Failure 객체

실패가 발생한 경우 TestResult는 Failure 객체 목록을 통해 상세 정보를 제공합니다.

예제

for (Object failure : result.failures()) {
    System.out.println("실패 정보: " + failure);
}

Failure에 담기는 정보

  • 실패한 테스트 이름
  • Assertion 실패 메시지
  • 스택 트레이스

즉, 어떤 테스트가 왜 실패했는지 디버깅할 수 있게 해주는 핵심 정보입니다.

 

4. TestResult의 실제 동작 구조

TestResult는 테스트 실행 중 다음과 같은 이벤트를 기록합니다.

  1. startTest() – 테스트 시작
  2. addFailure() – Assertion 실패
  3. addError() – 예외(Error) 발생
  4. endTest() – 테스트 끝

이 흐름은 JUnit 내부에서 자동으로 호출됩니다.

즉, TestResult는 테스트 수집기가 아니라 테스트 실행 리스너라고 볼 수 있습니다.

 

5. JUnit4에서의 TestResult 활용

JUnit4에서는 보통 JUnitCore를 통해 Result 객체를 사용하지만,
원리적으로는 TestResult와 동일한 역할을 수행합니다.

예제

Result result = JUnitCore.runClasses(MyTest.class);

System.out.println("실패 수: " + result.getFailureCount());
for (Failure f : result.getFailures()) {
    System.out.println("실패한 테스트: " + f.getTestHeader());
    System.out.println("원인: " + f.getMessage());
}

JUnit4의 Result = JUnit3의 TestResult라고 이해하면 됩니다.

 

6. JUnit5에서의 대응 개념은?

JUnit5는 더 이상 TestResult를 직접 사용하지 않고,
Launcher API + TestExecutionListener 조합으로 결과를 수집합니다.

예:

public void executionFinished(TestIdentifier testIdentifier,
                              TestExecutionResult result) {
    // 테스트 성공/실패/에러 정보를 여기서 확인
}

즉, TestResult가 리스너 기반 구조로 확장된 형태라고 보면 됩니다.

 

7. TestResult 사용 시 주의할 점

  1. 대부분 레거시 코드에서만 사용
    • JUnit5에서는 직접 사용하지 않음
  2. 스위트 실행 시 테스트 순서에 따라 결과가 누적되므로 주의
    • 테스트마다 독립적인 실행 환경이 필요
  3. Assertion 실패(failure)와 에러(error)는 구분해야 함
    • failure: 검사(assert) 실패
    • error: 예상하지 못한 예외
  4. 테스트 개수가 많을 경우 결과 로그가 매우 장황해질 수 있음
    • CI 시스템에서는 필터링하거나 요약 옵션 필요

 

8. 정리

  • TestResult는 테스트 실행 결과 요약 객체
  • 실행된 테스트 수, 실패 정보, 에러 정보 등을 관리
  • JUnit3·4에서 직접 사용할 수 있고, JUnit5에서는 리스너 방식으로 대체
  • 디버깅 및 테스트 자동화 환경에서 유용하게 활용 가능

 

 

반응형
Comments