※ 본 포스트는 제가 작성한 JUnit 5 공식 가이드 문서 정리의 핵심만 간추린 문서입니다.
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
testImplementation(platform('org.junit:junit-bom:5.7.2'))
testImplementation('org.junit.jupiter:junit-jupiter')
}
test {
useJUnitPlatform()
}
애노테이션 | 대상 | 용도 | 상속 여부 |
---|---|---|---|
@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
, @AfterAll
, @BeforeEach
, @AfterEach
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 모드시 사용할 factorjunit.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
: 캡쳐시 최대 버퍼 사이즈 지정fail
fail(String|Supplier?, Throwable?)
Throwable
을 cause
로 넘길 수 있음assertTrue
assertTrue(boolean|BooleanSupplier, String|Supplier?)
true
인지 검사assertFalse
assertFalse(boolean|BooleanSupplier, String|Supplier?)
false
인지 검사assertNull
assertNull(Object, String|Supplier?)
:null
인지 검사assertNotNull
assertNotNull(Object, String|Supplier?)
null
이 아닌지 검사assertSame
assertSame(Object, Object, String|Supplier?)
assertNotSame
assertNotSame(Object, Object, String|Supplier?)
assertEquals
assertEquals(T, S, String|Supplier?)
assertNotEquals
assertNotEquals(T, S, String|Supplier?)
assertArrayEquals
assertArrayEquals(T[], T[], String|Supplier?)
assertIterableEquals
assertIterableEquals(Iterable, Iterable, String|Supplier?)
Iterable
(기댓값)이 두번째 Iterable
(실제값)과 동등한지 검사assertLinesMatch
assertLinesMatch(List, List, String|Supplier?)
assertAll
assertAll(String?, Executable...|Collection|Stream)
Executable
목록을 가변인자로 전달받아 각 Executable
을 모두 실행한 뒤, 모두 성공했는지 검사Executable
이 있다면, 실패한 검증 결과를 모아서 에러 메시지로 출력assertThrows
assertThrows(Class, Executable, String|Supplier?)
Executable
을 실행했을 때, 첫번째 인자로 명시한 타입의 예외가 발생하는지 검사assertDoesNotThrow
assertDoesNotThrow(Executable|ThrowingSupplier, String|Supplier?)
Executable
을 실행했을 때 예외가 발생하지 않는지 검사assertTimeout
assertTimeout(Duration, Executable|ThrowingSupplier, String|Supplier?)
Executable
또는 ThrowingSupplier
를 실행했을 때 지정 시간 내에 실행이 완료되는지 확인assertTimeoutPreemptively
assertTimeoutPreemptively(Duration, Executable|ThrowingSupplier, String|Supplier?)
Executable
또는 ThrowingSupplier
를 실행했을 때 명시한 시간 안에 실행이 완료되는지 확인assertTimeoutPreemptively
는 제공된 Executable
또는 ThrowingSupplier
를 다른 스레드에서 실행assertEquals
, assertNotEquals
, assertArrayEquals
의 타입이 부동 소수점 타입인 경우, 세 번째 파라미터로 delta
값(float|double
)을 전달 가능
단언이 실패하면 다음 코드를 실행하지 않고 바로 AssertionFailedError
예외를 발생
assumeTrue(boolean|BooleanSupplier, String|Supplier)
true
면 테스트를 이어서 진행, false
면 테스트를 취소assumeFalse(boolean|BooleanSupplier, String|Supplier)
false
면 테스트를 이어서 진행, true
면 테스트를 취소assumingThat(boolean|BooleanSupplier, Executable)
true
인 경우에만 Executable
을 실행ExecutionCondition
API를 이용해서 특정 조건에 따라 테스트를 실행 가능@EnabledOnOs
: 특정 운영체제에서만 테스트를 실행@DisabledOnOs
: 특정 운영체제에서 테스트를 비활성화@EnabledOnJre
: 특정 자바 런타임 버전에서만 테스트를 실행@DisabledOnJre
: 특정 자바 런타임 버전에서 테스트를 비활성화@EnabledForJreRange
: min
≤ 자바 런타임 버전 ≤ max
일 경우에만 테스트를 실행@DisabledForJreRange
: min
≤ 자바 런타임 버전 ≤ max
일 경우 테스트를 비활성화min
의 기본값은 JRE.JAVA_8
, max
의 기본값은 JRE.OTHER
@EnabledIfSystemProperty
: named
로 제공된 JVM 시스템 속성 값이 matches
정규식과 일치하면 테스트를 실행@DisabledIfSystemProperty
: named
로 제공된 JVM 시스템 속성 값이 matches
정규식과 일치하면 테스트를 비활성화@EnabledIfEnvironmentVariable
: named
로 제공된 운영체제 시스템의 환경 변수 값이 matches
정규식과 일치하면 테스트를 실행@DisabledIfEnvironmentVariable
: named
로 제공된 운영체제 시스템의 환경 변수 값이 matches
정규식과 일치하면 테스트를 비활성화@EnabledIf
: 명시된 조건 메서드의 boolean
리턴 값이 true
라면 테스트를 실행@DisabledIf
: 명시된 조건 메서드의 boolean
리턴 값이 true
라면 테스트를 비활성화ExtensionContext
타입의 단일 파라미터 선언 가능@DisplayName
으로 표시 이름 지정 가능@DisplayNameGeneration
으로 생성기 지정DisplayNameGenerator
를 구현해야 함DisplayNameGenerator.Standard.class
: 메서드 이름과 괄호를 그대로 표시 (기본값)DisplayNameGenerator.Simple.class
: 파라미터가 없다면, 메서드 이름 뒤의 괄호(()
)를 제거DisplayNameGenerator.ReplaceUnderScores.class
: 언더스코어(_
)를 공백(``)으로 치환DisplayNameGenerator.IndicativeSentences.class
: 테스트 클래스 이름과 테스트 이름을 이어서 표시@IndicativeSentencesGeneration
로 구분자 추가 명시 가능@Tag
로 태그 지정 가능!
, &
, |
연산자와 괄호 및 any()
와 none()
등을 조합하여 사용@TestMethodOrder
로 실행 순서 정렬기 지정 가능MethodOrderer
를 구현해야 함MethodOrderer.DisplayName.class
: 표시 이름으로 정렬MethodOrderer.MethodName.class
: 메서드 이름으로 정렬MethodOrderer.OrderAnnotation.class
: @Order
애노테이션으로 정렬MethodOrderer.Random.class
: 임의 정렬@TestInstance
로 테스트 인스턴스 라이프사이클 지정 가능PER_METHOD
@TestInstance(Lifecycle.PER_CLASS)
:테스트 클래스마다 하나의 인스턴스만 만든다.@Nested
지정 가능ParameterResolver
로 런타임에 파라미터를 주입 가능
기본제공:
TestInfoParameterResolver
: TestInfo
주입RepetitionInfoParameterResolver
: RepetitionInfo
주입TestReporterParamterResolver
: TestReporter
주입ParameterResolver
또는 TypeBasedParameterResolver
를 구현하여 사용자 지정 주입기 구현 가능
구현한 주입기는 @ExtendWith
으로 등록
@ExtendWith
과 @Tag
선언 가능default
) 메서드에 @Test
, @RepeatedTest
, @ParameterizedTest
, @TestFactory
, @TestTemplate
, @BeforeEach
, @AfterEach
등을 선언 가능@TestTemplate
: 테스트 케이스를 위한 템플릿@ParameterizedTest
, @RepeatedTest
TestTemplateInvocationContextProvider
익스텐션과 함께 사용되어야 함@RepeatedTest
로 반복 테스트 실행 가능@Test
메서드와 동일한 라이프사이클 콜백과 익스텐션을 지원RepetitionInfo
파라미터 주입 받을 수 있음name
속성으로 표시 이름 패턴 지정 가능@ParameterizedTest
로 파라미터 테스트 가능ParameterResolver
로 주입받을 파라미터@ValueSource
: 인자 값의 배열 지정@NullSource
: 단일 null
값 제공@EmptySource
: 단일 빈 값 제공@NullAndEmptySource
: @NullSource
+ @EmptySource
@EnumSource
value
: 파라미터로 사용할 enum
클래스, 명시하지 않으면 첫 번째 파라미터 타입이 사용됨names
: 사용할 enum
상수 (optional)mode
: names
로 명시한 값 처리 방법 (ex. EXLUDE
, MATCH_ALL
)@MethodSource
: 지정한 팩토리 메서드 리턴 값을 인자로 사용@CsvSource
: CSV 문자열로부터 인자 제공delimiter
: 구분자 (default = ,
)delimiterString
: 문자열 구분자 지정 (delimiter
와 동시 사용 불가)emptyValue
: 빈 문자열을 특정 문자열로 해석하도록 지정nullValue
: 특정 문자열들을 null
로 해석하도록 지정'
)를 사용''
)는 빈 문자열, 완전히 빈 값은 null
로 해석null
로 해석된 값의 타입이 원시형인 경우 ArgumentConversionException
예외 발생@CsvFileSource
: CSV 파일로부터 인자 제공#
문자로 시작하는 라인은 주석)delimiter
: 구분자 (default = ,
)delimiterString
: 문자열 구분자 지정 (delimiter
와 동시 사용 불가)emptyValue
: 빈 문자열을 특정 문자열로 해석하도록 지정nullValue
: 특정 문자열들을 null
로 해석하도록 지정"
)를 사용''
)는 빈 문자열, 완전히 빈 값은 null
로 해석null
로 해석된 값의 타입이 원시형인 경우 ArgumentConversionException
예외 발생@ArgumentsSource
: ArgumentsProvider
로부터 인자 제공@ConvertWith
으로 ArgumentConverter
를 지정ArgumentConverter
또는 TypedArgumentConverter
를 구현하여 제공ArgumentAccessor
로 여러 개의 인자를 하나의 인자로 받을 수 있음ArgumnetAggregator
를 구현한 뒤 @AggregateWith
로 애그리게이터 지정@ParameterizedTest
의 name
속성으로 표시 이름 MessageFormat
패턴 지정 가능@TestFactory
메서드로 런타임에 동적으로 테스트 생성@TestFactory
메서드는 하나의 DynamicNode
, Stream
, Collection
, Iterable
, Iterator
, 또는 DynamicNode
인스턴스의 배열을 리턴해야 함DynamicTest.dynamicTest(String, URI, Executable)
나 DynamicContainer.dynamicContainer(String, URI, Stream)
팩토리 메서드로 TestSource
생성 가능TestSource
구현체ClasspathResourceSource
: URI
가 classpath
스킴DirectorySource
: URI
가 파일 시스템의 디렉토리FileSource
: URI
가 파일 시스템의 파일MethodSource
: URI
가 method
스킴UriSource
: 그 외@Timeout
으로 특정 시간이 지나면 테스트가 실패하도록 선언 가능@TestTemplate
에 선언시 각 호출에 타임아웃 적용assertTimeout()
또는 assertTimeoutPreemptively()
를 사용SAME_THREAD
(기본값), CONCURRENT
(기본값 = SAME_THREAD
)dynamic
(기본값), fixed
, custom
custom
모드 사용시 ParallelExecutionConfigurationStrategy
구현하여 등록 필요@Execution
으로 실행 모드 지정 가능@ResourceLock
으로 특정한 공유 리소스에 대한 동기화된 접근을 보장SYSTEM_PROPERTIES
, SYSTEM_OUT
, SYSTEM_ERR
, LOCALE
, TIME_ZONE
, 또는 사용자 지정 이름@Isolated
로 특정 테스트를 다른 테스트로부터 격리하여 실행READ
, READ_WRITE
TempDirectory
익스텐션은 기본적으로 등록되어 있음@TempDir
선언하여 임시 디렉토리를 생성Path
또는 File
타입 제공해야 함 @ExtendWith
로 선언적으로 등록@RegisterExtension
로 프로그램적으로 등록ServiceLoader
메커니즘을 통해 자동 등록/META-INF/services
경로의 ExecutionCondition
: ExtensionContext
에 따른 조건부 실행TestInstanceFactory
: 테스트 클래스 인스턴스 생성TestInstanceFactory
를 구현한 익스텐션을 여러 개 등록하면 예외가 발생TestInstanceFactory
는 상속된다.TestInstanceFactory
가 등록되도록 해야 한다.TestInstancePostProcessor
: 테스트 인스턴스 후처리MockitoExtension
, SpringExtension
TestInstancePreDestroyCallback
: 테스트 인스턴스가 테스트에 사용된 후 소멸되기 전에 특정 처리를 수행ParameterResolver
: 런타임에 동적으로 파라미터를 결정ParameterContext
를 사용CustomTypeParameterResolver
, CustomAnnotationParameterResolver
, MapOfListsTypeBasedParameterResolver
TestWatcher
: 테스트 메서드 실행의 결과를 처리BeforeAllCallback
BeforeEachCallback
BeforeTestExecutionCallback
AfterTestExecutionCallback
AfterEachCallback
AfterAllCallback
SpringExtension
BeforeTestExecutionCallback
AfterTestExecutionCallback
BeforeEachCallback
AfterEachCallback
TestExecutionExceptionHandler
: 테스트 실행 도중 발생한 예외 처리LifecycleMethodExecutionExceptionHandler
: 라이프사이클 메서드에서 발생한 예외 처리InvocationInterceptor
: 테스트 코드에 대한 호출을 인터셉트함TestTemplateInvocationContextProvider
: @TestTemplate
메서드에 TestTemplateInvocationContext
인스턴스의 Stream
을 제공ExtensionContext
: 익스텐션의 상태를 유지하기 위한 Store
를 제공org.junit.platform.commons.support
패키지 참고AnnotationSupport
: 애노테이션을 가진 요소에 사용할 수 있는 정적 유틸리티 메서드 제공ClassSupport
: 클래스에 사용할 수 있는 정적 유틸리티 메서드 제공ReflectionSupport
: JDK 표준 리플렉션과 클래스 로딩 메커니즘과 관련된 정적 유틸리티 메서드 제공ModifierSupport
: 클래스 또는 멤버의 접근제어자와 관련된 정적 유틸리티 메서드 제공단계 | 타입 | 구분 | FQCN 및 설명 |
---|---|---|---|
1 | 인터페이스 | 익스텐션 | org.junit.jupiter.api.extension.BeforeAllCallback 컨테이너의 모든 테스트가 실행되기 전에 실행되는 코드 |
2 | 애노테이션 | 사용자 | org.junit.jupiter.api.BeforeAll 컨테이너의 모든 테스트가 실행되기 전에 실행되는 코드 |
3 | 인터페이스 | 익스텐션 | org.junit.jupiter.api.extension.LifecycleMethodExecutionExceptionHandler #handleBeforeAllMethodExecutionException @BeforeAll 메서드에서 발생한 예외를 처리하기 위한 코드 |
4 | 인터페이스 | 익스텐션 | org.junit.jupiter.api.extension.BeforeEachCallback 각 테스트가 실행되기 전에 실행되는 코드 |
5 | 애노테이션 | 사용자 | org.junit.jupiter.api.BeforeEach 각 테스트가 실행되기 전에 실행되는 코드 |
6 | 인터페이스 | 익스텐션 | org.junit.jupiter.api.extension.LifecycleMethodExecutionExceptionHandler #handleBeforeEachMethodExecutionException @BeforeEach 메서드에서 발생한 예외를 처리하기 위한 코드 |
7 | 인터페이스 | 익스텐션 | org.junit.jupiter.api.extension.BeforeTestExecutionCallback 테스트 실행 직전에 실행되는 코드 |
8 | 애노테이션 | 사용자 | org.junit.jupiter.api.Test 실제 테스트 메서드의 코드 |
9 | 인터페이스 | 익스텐션 | org.junit.jupiter.api.extension.TestExecutionExceptionHandler 테스트 중에 발생한 예외를 처리하기 위한 코드 |
10 | 인터페이스 | 익스텐션 | org.junit.jupiter.api.extension.AfterTestExecutionCallback 테스트 실행과 대응하는 예외 처리기 직후에 실행되는 코드 |
11 | 애노테이션 | 사용자 | org.junit.jupiter.api.AfterEach 각 테스트가 실행된 이후에 실행되는 코드 |
12 | 인터페이스 | 익스텐션 | org.junit.jupiter.api.extension.LifecycleMethodExecutionExceptionHandler #handleAfterEachMethodExecutionException @AfterEach 메서드에서 발생한 예외를 처리하기 위한 코드 |
13 | 인터페이스 | 익스텐션 | org.junit.jupiter.api.extension.AfterEachCallback 각 테스트가 실행된 이후 실행되는 코드 |
14 | 애노테이션 | 사용자 | org.junit.jupiter.api.AfterAll 컨테이너의 모든 테스트가 실행된 후 실행되는 코드 |
15 | 인터페이스 | 익스텐션 | org.junit.jupiter.api.extension.LifecycleMethodExecutionExceptionHandler #handleAfterAllMethodExecutionException @AfterAll 메서드에서 발생한 예외를 처리하는 코드 |
16 | 인터페이스 | 익스텐션 | org.junit.jupiter.api.extension.AfterAllCallback 컨테이너의 모든 테스트가 실행된 후 실행되는 코드 |
InvocationInterceptor
: 사용자 코드 메서드의 모든 호출을 인터셉트Extension1
이 등록된 후 Extension2
가 등록되었다고 가정하면:Extension1
의 모든 사전(before) 콜백은 Extension2
의 모든 사전 콜백 이전에 실행된다.Extension1
의 모든 사후(after) 콜백은 Extension2
의 모든 사후 콜백 이후에 실행된다.@BeforeAll
메서드는 자식(구현) 클래스의 @BeforeAll
메서드 이전에 실행된다.@BeforeEach
메서드는 자식(구현) 클래스의 @BeforeEach
메서드 이전에 실행된다.@AfterEach
메서드는 자식(구현) 클래스의 @AfterEach
메서드 이후에 실행된다.@AfterAll
메서드는 자식(구현) 클래스의 @AfterAll
메서드 이후에 실행된다.
junit5에 대해서 발표를 하기위해서 공부를 하고 있는데 많이 부끄럽네요...
공부는 이렇게 하는거군요 진짜 대단하십니다. 많이 깨닫게 되었습니다.