※ 본 포스트는 제가 작성한 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, @AfterEachsrc/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.defaultjunit.jupiter.execution.timeout.test.method.defaultjunit.jupiter.execution.timeout.testtemplate.method.defaultjunit.jupiter.execution.timeout.testfactory.method.defaultjunit.jupiter.execution.timeout.lifecycle.method.defaultjunit.jupiter.execution.timeout.beforeall.method.defaultjunit.jupiter.execution.timeout.beforeeach.method.defaultjunit.jupiter.execution.timeout.aftereach.method.defaultjunit.jupiter.execution.timeout.afterall.method.defaultjunit.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, @RepeatedTestTestTemplateInvocationContextProvider 익스텐션과 함께 사용되어야 함@RepeatedTest로 반복 테스트 실행 가능@Test 메서드와 동일한 라이프사이클 콜백과 익스텐션을 지원RepetitionInfo 파라미터 주입 받을 수 있음name 속성으로 표시 이름 패턴 지정 가능@ParameterizedTest로 파라미터 테스트 가능ParameterResolver로 주입받을 파라미터@ValueSource: 인자 값의 배열 지정@NullSource: 단일 null값 제공@EmptySource: 단일 빈 값 제공@NullAndEmptySource: @NullSource + @EmptySource@EnumSourcevalue: 파라미터로 사용할 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, customcustom 모드 사용시 ParallelExecutionConfigurationStrategy 구현하여 등록 필요@Execution으로 실행 모드 지정 가능@ResourceLock으로 특정한 공유 리소스에 대한 동기화된 접근을 보장SYSTEM_PROPERTIES, SYSTEM_OUT, SYSTEM_ERR, LOCALE, TIME_ZONE, 또는 사용자 지정 이름@Isolated로 특정 테스트를 다른 테스트로부터 격리하여 실행READ, READ_WRITETempDirectory 익스텐션은 기본적으로 등록되어 있음@TempDir 선언하여 임시 디렉토리를 생성Path 또는 File 타입 제공해야 함 @ExtendWith로 선언적으로 등록@RegisterExtension로 프로그램적으로 등록ServiceLoader 메커니즘을 통해 자동 등록/META-INF/services 경로의 ExecutionCondition: ExtensionContext에 따른 조건부 실행TestInstanceFactory: 테스트 클래스 인스턴스 생성TestInstanceFactory를 구현한 익스텐션을 여러 개 등록하면 예외가 발생TestInstanceFactory는 상속된다.TestInstanceFactory가 등록되도록 해야 한다.TestInstancePostProcessor: 테스트 인스턴스 후처리MockitoExtension, SpringExtensionTestInstancePreDestroyCallback: 테스트 인스턴스가 테스트에 사용된 후 소멸되기 전에 특정 처리를 수행ParameterResolver: 런타임에 동적으로 파라미터를 결정ParameterContext를 사용CustomTypeParameterResolver, CustomAnnotationParameterResolver, MapOfListsTypeBasedParameterResolverTestWatcher: 테스트 메서드 실행의 결과를 처리BeforeAllCallbackBeforeEachCallbackBeforeTestExecutionCallbackAfterTestExecutionCallbackAfterEachCallbackAfterAllCallbackSpringExtensionBeforeTestExecutionCallbackAfterTestExecutionCallbackBeforeEachCallbackAfterEachCallbackTestExecutionExceptionHandler: 테스트 실행 도중 발생한 예외 처리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에 대해서 발표를 하기위해서 공부를 하고 있는데 많이 부끄럽네요...
공부는 이렇게 하는거군요 진짜 대단하십니다. 많이 깨닫게 되었습니다.