Java테스트와 빌드

JUnit parameterized test와 lifecycle

입력 케이스를 여러 번 돌리는 parameterized test와 테스트 준비/정리 단계의 lifecycle을 JUnit 5 기준으로 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

java
@ParameterizedTest
@ValueSource(ints = {0, 1, 2, 10})
void isNonNegative_returnsTrue(int value) {
    assertTrue(value >= 0);
}

설명

  • 기본 테스트가 "하나의 입력으로 하나의 결과를 검증"한다면, parameterized test는 같은 검증 구조를 여러 입력에 반복 적용하는 방법입니다. 입력 표가 있는 규칙 검증에 특히 잘 맞습니다.
  • @ValueSource, @CsvSource, @MethodSource는 입력을 어디서 가져올지 정하는 대표적인 방법입니다. 어떤 source를 고를지는 테스트 데이터의 복잡도에 따라 달라집니다.
  • lifecycle도 함께 중요합니다. @BeforeEach, @AfterEach, @BeforeAll, @AfterAll은 테스트마다 준비할 것과 전체 묶음에 한 번만 준비할 것을 분리합니다. 이 구분이 없으면 테스트가 무겁고 느려지기 쉽습니다.
  • 핵심은 "같은 규칙을 여러 사례로 확인하되, 준비 비용은 과하게 키우지 않는다"는 균형입니다. parameterized test가 반복문처럼 보일 수 있지만, 의도는 데이터 중심 테스트 설계에 더 가깝습니다.
  • 입문 이후에는 테스트 수보다 구조가 중요해집니다. parameterized test와 lifecycle을 이해하면, 비슷한 테스트를 복붙하지 않고도 더 강한 검증을 만들 수 있습니다.

빠른 정리

요소역할
@ParameterizedTest같은 테스트를 여러 입력으로 실행
@ValueSource단순 값 목록 입력
@CsvSource여러 컬럼 입력
@MethodSource복잡한 테스트 데이터 공급
@BeforeEach / @BeforeAll준비 단계 분리

주의할 점

parameterized test가 편하다고 해서 모든 케이스를 한 메서드에 몰아넣으면 오히려 실패 원인이 흐려질 수 있습니다. 입력 구조가 크게 다르면 테스트도 나누는 편이 더 읽기 쉽습니다.

참고 링크

2 sources