JUnit 5 Cheatsheet
JUnit 5 공식 가이드 문서
※ 본 포스트는 제가 작성한 JUnit 5 공식 가이드 문서 정리을 cheatsheet 형태로 정리한 문서입니다.
애노테이션
| 애노테이션 | 대상 | 용도 | 상속 여부 |
|---|
@Test | 메서드 | 일반 테스트 | O |
@ParameterizedTest | 메서드 | 파라미터 테스트 | O |
@RepeatedTest | 메서드 | 반복 테스트 | O |
@TestFactory | 메서드 | 다이나믹 테스트를 위한 테스트 팩토리 | O |
@TestTemplate | 메서드 | 테스트 케이스에 대한 템플릿 | O |
@TestMethodOrder | 클래스 | 테스트 메서드 실행 순서 설정 | O |
@TestInstance | 클래스 | 테스트 인스턴스 라이프사이클 설정 | O |
@DisplayName | 클래스, 메서드 | 표시 이름 지정 | X |
@DisplayNameGeneration | 클래스 | 표시 이름 생성기 지정 | O |
@BeforeEach | 메서드 | 각 테스트 메서드 실행 전 실행 | O |
@AfterEach | 메서드 | 각 테스트 메서드 실행 후 실행 | O |
@BeforeAll | 메서드 | 모든 테스트 메서드 실행 전 실행 | O |
@AfterAll | 메서드 | 모든 테스트 메서드 실행 후 실행 | O |
@Nested | 클래스 | 중첩 테스트 클래스 | X |
@Tag | 클래스, 메서드 | 태그 지정 | O |
@Disabled | 클래스, 메서드 | 테스트 비활성화 | X |
@Timeout | 메서드 | 타임아웃 지정 | O |
@ExtendWith | 클래스 | 익스텐션 등록 | O |
@RegisterExtension | 클래스 | 익스텐션 등록 | O |
@TempDir | 클래스 | 임시 디렉토리 지정 | X |
테스트 메서드
@Test로 테스트 메서드 지정
- 이외에
@RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplate 등
라이프사이클 메서드
@BeforeAll(static), @AfterAll(static), @BeforeEach, @AfterEach
단언
- 단언 실패시 테스트 실패(
AssertionFailedError)
- 마지막 인자로 실패시 표시할
String 또는 Supplier<String> 전달 가능
- 부동 소수점 동등성 비교시
delta 값 지정 가능
- 검증할 수 있는 것:
true, false 여부 - assertTrue, assertFalse
null 여부 - assertNull, assertNotNull
- 동일성(identity) -
assertSame, assertNotSame
- 동등성(equality) -
assertEquals, assertNotEquals, assertArrayEquals, assertIterableEquals, assertLinesMatch
- 예외 발생 여부 -
assertThrows, assertDoesNotThrow
- 타임 아웃 -
assertTimeout, assertTimeoutPreemptively
- 여러 개의 단언문을 묶어서 한 번에 검증 -
assertAll
가정
- 가정 실패시 테스트 취소(
TestAbortedException)
true, false 여부에 따른 가정 - assumeTrue, assumeFalse, assumingThat
조건부 실행
- 운영체제 -
@EnabledOnOs, @DisabledOnOs
- 자바 런타임 버전 -
@EnabledOnJre, @DisabledOnJre, @EnabledForJreRange, @DisabledForJreRange
- 시스템 프로퍼티 -
@EnabledIfSystemProperty, @DisabledIfSystemProperty
- 환경 변수 -
@EnabledIfEnvironmentVariable, @DisabledIfEnvironmentVariable
- 사용자 지정 -
@EnabledIf, @DisabledIf
타임아웃
@Timeout으로 특정 시간이 지나면 테스트가 실패하도록 선언 가능
표시 이름 사용자화
@DisplayName으로 표시 이름 지정
- 또는,
@DisplayNameGeneration에 DisplayNameGenerator 지정 - Standard, Simple, ReplaceUnderScores, IndicativeSentences
태그
@Tag로 태그 지정 후 태그 표현식으로 특정 그룹의 테스트 필터링하여 실행 가능
테스트 실행 순서
@TestMethodOrder에 MethodOrderer 지정 - DisplayName, MethodName, OrderAnnotation, Random
테스트 인스턴스 라이프사이클
- 기본값: 테스트 메서드 실행마다 테스트 인스턴스가 새로 만들어진다.
@TestInstance에 라이프사이클 지정 - PER_METHOD, PER_CLASS
생성자 또는 메서드 파라미터 주입
@ExtendWith으로 ParameterResolver 지정
- 기본제공:
TestInfoParameterResolver: TestInfo 주입
RepetitionInfoParameterResolver: RepetitionInfo 주입
TestReporterParamterResolver: TestReporter 주입
ParameterResolver 또는 TypeBasedParameterResolver 구현하여 커스텀 파라미터 주입기 지정 가능
테스트 템플릿
@TestTemplate을 TestTemplateInvocationContextProvider와 함께 사용
- ex)
@RepeatedTest, @ParameterizedTest
반복 테스트
표시 이름 사용자화
@RepeatedTest의 name 속성으로 표시 이름 MessageFormat 패턴 지정 가능
{displayName}
{currentRepetition}
{totalRepetitions}
파라미터 테스트
@ParameterizedTest로 파라미터 소스로부터 테스트 실행
- 파라미터 순서:
- 인자 소스로부터 받을 파라미터
- 애그리게이션 파라미터
ParameterResolver로부터 주입 받을 파라미터
인자 소스
@ValueSource
@NullSource
@EmptySource
@NullAndEmptySource
@EnumSource
@MethodSource
Stream<Arguments> 리턴하는 정적 팩토리 메서드 지정 가능
@CsvSource
@CsvFileSource
@ArgumentsSource
Arguments.argument
ArgumentsProvider 구현하여 지정 가능
인자 변환
- 확장 변환(Widening Conversion): 제공된 인자에 대한 확장 변환 지원
- 묵시적 변환(Implicit Conversion): 제공된 문자열을 메서드 파라미터 타입으로 변환
- 문자열-객체 변환 폴백(Fallback String-to-Object Conversion): 팩토리 메서드나 팩토리 생성자를 호출하여 문자열을 객체로 변환
- 팩토리 메서드와 팩토리 생성자는 단일 문자열 인자를 받아 해당 객체를 리턴해야 함
- 명시적 변환(Explicit Conversion):
@ConvertWith으로 ArgumentConverter를 지정
ArgumentConverter, SimpleArgumentConverter, TypedArgumentConverter 구현하여 커스텀 인자 변환기 지정 가능
인자 애그리게이션
ArgumentAccessor로 여러 개의 인자를 하나의 인자로 받을 수 있음
- 또는
ArgumnetAggregator를 구현한 뒤 @AggregateWith로 애그리게이터 지정
표시 이름 사용자화
@ParameterizedTest의 name 속성으로 표시 이름 MessageFormat 패턴 지정 가능
{displayName}
{index}
{arguments}
{argumentsWithNames}
동적 테스트
@TestFactory 메서드로 런타임에 동적으로 테스트 생성
테스트 소스
TestSource
ClasspathResourceSource
DirectorySource
FileSource
MethodSource
UriSource
병렬 실행
@Execution으로 실행 모드 지정 가능 - SAME_THREAD, CONCURRENT
동기화
@ResourceLock으로 리소스에 대한 접근 동기화 - SYSTEM_PROPERTIES, SYSTEM_OUT, SYSTEM_ERR, LOCALE, TIME_ZONE
@Isolated로 특정 테스트를 다른 테스트로부터 격리하여 실행
익스텐션
@ExtendWith 또는 @RegisterExtension로 익스텐션 등록
- 또는 Java
ServiceLoader 메커니즘으로 자동 등록
- 기본 제공:
TempDirectory 익스텐션: @TempDir로 사용
인터페이스
TestInstanceFactory
TestInstancePostProcessor
ExtensionContext
ExecutionCondition
TestTemplateInvocationContextProvider
BeforeAllCallback
BeforeEachCallback
BeforeTestExecutionCallback
AfterTestExecutionCallback
AfterEachCallback
AfterAllCallback
TestInstancePreDestroyCallback
ParameterResolver
InvocationInterceptor
TestExecutionExceptionHandler
TestWatcher
유틸리티
- 애노테이션 지원 -
AnnotationSupport
- 클래스 지원 -
ClassSupport
- 리플렉션 지원 -
ReflectionSupport
- 접근제어자 지원 -
ModifierSupport
호출 순서
| 호출 순서 | 익스텐션 | 테스트 코드 |
|---|
| 1 | beforeAll | |
| 2 | interceptBeforeAllMethod | |
| 3 | | static 블럭 |
| 4 | | beforeAll |
| 5 | interceptTestClassConstructor | |
| 6 | | 테스트 클래스 생성자 |
| 7 | postProcessTestInstance | |
| 8 | beforeEach | |
| 9 | interceptBeforeEachMethod | |
| 10 | | beforeEach |
| 11 | beforeTestExecution | |
| 12 | interceptTestMethod | |
| 13 | | 테스트 메서드 |
| 14 | (예외 발생시) handleTestExecutionException | |
| 15 | afterTestExecution | |
| 16 | interceptAfterEachMethod | |
| 17 | | afterEach |
| 18 | afterEach | |
| 19 | preDestroyTestInstance | |
| 20 | testDisabled
testSuccessful
testAborted
testFailed | |
| 21 | interceptAfterAllMethod | |
| 22 | | afterAll |
| 23 | afterAll | |
테스트 설정 파일
- JUnit 플랫폼 설정 파일 경로:
src/test/resources/junit-platform.properties
기본
junit.jupiter.testmethod.order.default: 테스트 실행 순서 정렬 기본값 지정
junit.jupiter.testinstance.lifecycle.default: 테스트 인스턴스 라이프사이클 기본값 지정
junit.jupiter.displayname.generator.default: 표시 이름 생성기 기본값 지정
junit.jupiter.params.displayname.argument.maxlength: 인자 출력시 최대 길이 제한 설정
타임아웃
junit.jupiter.execution.timeout.default: 테스트 실행 타임아웃 기본값 설정
junit.jupiter.execution.timeout.mode: 타임 아웃 모드 설정
- 개별 세부 설정 가능
junit.jupiter.execution.timeout.testable.method.default
junit.jupiter.execution.timeout.test.method.default
junit.jupiter.execution.timeout.testtemplate.method.default
junit.jupiter.execution.timeout.testfactory.method.default
junit.jupiter.execution.timeout.lifecycle.method.default
junit.jupiter.execution.timeout.beforeall.method.default
junit.jupiter.execution.timeout.beforeeach.method.default
junit.jupiter.execution.timeout.aftereach.method.default
junit.jupiter.execution.timeout.afterall.method.default
병렬 실행
junit.jupiter.execution.parallel.enabled: 병렬 실행 활성화 여부 설정
junit.jupiter.execution.parallel.mode.default: 병렬 실행 모드 지정
junit.jupiter.execution.parallel.mode.classes.default: 테스트 클래스의 병렬 실행 모드 지정
junit.jupiter.execution.parallel.config.strategy: 병렬성 전략 지정
junit.jupiter.execution.parallel.config.dynamic.factor: dynamic 모드시 사용할 factor
junit.jupiter.execution.parallel.config.fixed.parallelism: fixed 모드시 사용할 병렬성 지정
junit.jupiter.execution.parallel.config.custom.class: custom 모드시 사용할 전략 지정
익스텐션
junit.jupiter.extensions.autodetection.enabled: 익스텐션 자동 감지 활성화 여부 설정
조건부 실행
junit.jupiter.conditions.deactivate: 비활성화할 조건 패턴 지정
표준 출력 및 에러 캡쳐
junit.platform.output.capture.stdout: 표준 출력 캡쳐 여부 설정
junit.platform.output.capture.stderr: 표준 에러 캡쳐 여부 설정
junit.platform.output.capture.maxBuffer: 캡쳐시 최대 버퍼 사이즈 지정