JUnit 5 Cheatsheet

Rudy Lee (이재훈)·2021년 6월 29일
0
post-thumbnail

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으로 표시 이름 지정
  • 또는, @DisplayNameGenerationDisplayNameGenerator 지정 - Standard, Simple, ReplaceUnderScores, IndicativeSentences

태그

  • @Tag로 태그 지정 후 태그 표현식으로 특정 그룹의 테스트 필터링하여 실행 가능

테스트 실행 순서

  • @TestMethodOrderMethodOrderer 지정 - DisplayName, MethodName, OrderAnnotation, Random

테스트 인스턴스 라이프사이클

  • 기본값: 테스트 메서드 실행마다 테스트 인스턴스가 새로 만들어진다.
  • @TestInstance에 라이프사이클 지정 - PER_METHOD, PER_CLASS

생성자 또는 메서드 파라미터 주입

  • @ExtendWith으로 ParameterResolver 지정
  • 기본제공:
    • TestInfoParameterResolver: TestInfo 주입
    • RepetitionInfoParameterResolver: RepetitionInfo 주입
    • TestReporterParamterResolver: TestReporter 주입
  • ParameterResolver 또는 TypeBasedParameterResolver 구현하여 커스텀 파라미터 주입기 지정 가능

테스트 템플릿

  • @TestTemplateTestTemplateInvocationContextProvider와 함께 사용
    • ex) @RepeatedTest, @ParameterizedTest

반복 테스트

  • @RepeatedTest로 테스트 반복 실행

표시 이름 사용자화

  • @RepeatedTestname 속성으로 표시 이름 MessageFormat 패턴 지정 가능
    • {displayName}
    • {currentRepetition}
    • {totalRepetitions}

파라미터 테스트

  • @ParameterizedTest로 파라미터 소스로부터 테스트 실행
  • 파라미터 순서:
    1. 인자 소스로부터 받을 파라미터
    2. 애그리게이션 파라미터
    3. 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로 애그리게이터 지정

표시 이름 사용자화

  • @ParameterizedTestname 속성으로 표시 이름 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
    • 접근 모드 - READ, READ_WRITE
  • @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

호출 순서

호출 순서익스텐션테스트 코드
1beforeAll
2interceptBeforeAllMethod
3static 블럭
4beforeAll
5interceptTestClassConstructor
6테스트 클래스 생성자
7postProcessTestInstance
8beforeEach
9interceptBeforeEachMethod
10beforeEach
11beforeTestExecution
12interceptTestMethod
13테스트 메서드
14(예외 발생시) handleTestExecutionException
15afterTestExecution
16interceptAfterEachMethod
17afterEach
18afterEach
19preDestroyTestInstance
20testDisabled
testSuccessful
testAborted
testFailed
21interceptAfterAllMethod
22afterAll
23afterAll

테스트 설정 파일

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

0개의 댓글