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
: 캡쳐시 최대 버퍼 사이즈 지정