JUnit 5 (3)

들어가기 전에

공식 유저 가이드 의 3장, 어노테이션 소개 부분을 정리하였다.

어노테이션들

주피터JUnit Jupiter는 테스트 설정 및 프레임워크의 확장을 위해 다양한 어노테이션을 제공한다. 모든 어노테이션은 junit-jupiter-api 모듈의 org.junit.jupiter.api 패키지에서 정의하고 있다.

어노테이션 설명 JUnit 4에선
@Test 해당 메서드가 테스트 메서드임을 나타낸다. 주피터 환경에서의 확장 테스트는 자체적인 어노테이션 정의를 이용하여 동작하기 때문에, 이 어노테이션은 JUnit 4의 @Test 어노테이션과 달리, 추가적인 인자를 필요로(expected 등) 하지 않는다. 테스트 메서드는 오버라이드 되지 않는 한, 상속된다. @Test
@ParameterizedTest 해당 매서드가 인자를 제공받는 테스트Parameterized test 메서드임을 나타낸다. 테스트 메서드는 오버라이드 되지 않는 한, 상속된다.  
@RepeatedTest 해당 메서드가 반복 테스트Repeated test를 위한 템플릿임을 나타낸다. 테스트 메서드는 오버라이드 되지 않는 한, 상속된다.  
@TestFactory 해당 메서드가 동적 테스트Dynamic test 수행을 위한 팩토리Test Factory임을 나타낸다. 테스트 메서드는 오버라이드 되지 않는 한, 상속된다.  
@TestInstance 테스트 클래스의 생명주기 Test instance lifecycle를 설정하기 위해 사용한다. 이 어노테이션은 상속된다.  
@TestTemplate 해당 메서드가 공급자Provider에 의해 여러 번 호출될 수 있도록 설계된 테스트 케이스 템플릿임을 나타낸다. 공급자는 TestTemplateInvocationContextProvider 인터페이스를 상속하는 클래스로서, 스트림Stream을 사용하여 템플릿을 여러 번 호출할 수 있다. 메서드는 오버라이드 되지 않는 한, 상속된다.  
@DisplayName 테스트 클래스나 메서드를 디스플레이 상에서 어떤 이름으로 표시할지 정의한다. 이 어노테이션은 상속되지 않는다.  
@BeforeEach 현재 클래스에 속한 모든 테스트 메서드의 테스트 수행 전마다 해당 메서드를 실행해야 함을 나타낸다. 메서드는 오버라이드 되지 않는 한, 상속된다. @Before
@AfterEach 현재 클래스에 속한 모든 테스트 메서드가 테스트를 완료할 때마다 해당 메서드를 실행해야 함을 나타낸다. 메서드는 오버라이드 되지 않는 한, 상속된다. @After
@BeforeAll 현재 클래스의 어떤 테스트 메서드도 시작하지 않은 상태에서 해당 메서드를 실행해야 함을 나타낸다. 메서드는 숨겨져hidden 있거나 오버라이드 하지 않는 이상 상속되며, 클래스 단위 생명주기가 설정되지 않았다면 정적 메서드여야 한다. @BeforeClass
@AfterAll 현재 클래스의 모든 테스트 메서드를 완료한 이후 해당 메서드를 실행해야 함을 나타낸다. 메서드는 숨겨져 있거나 오버라이드 하지 않는 이상 상속되며, 클래스 단위 생명주기가 설정되지 않았다면 정적 메서드여야 한다. @AfterClass
@Nested 이 어노테이션은 해당 클래스가 다른 클래스 내부에 선언되어 있으며, 정적static 클래스가 아님을 나타낸다. @BeforeAll 또는, @AfterAll 을 가지는 메서드는 클래스 단위 인스턴스 수명주기가 사용되지 않는 이상, @Nested 표시된 클래스 내에서 사용할 수 없다. 이 어노테이션은 상속되지 않는다.  
@Tag 선별된 테스트filtering test에 사용할 태그를 지정하기 위해 클래스나 메서드 단위로 사용한다. 이 어노테이션은 클래스 단위로 사용하였을 경우 상속되나, 메서드 단위로 사용하였을 경우에는 그렇지 않다. TestNG 혹은 Categories의 테스트 그룹
@Disabled 이 테스트 클래스나 테스트 메서드를 사용하지 않음을 나타냅니다. 이 어노테이션은 상속되지 않는다. @Ignore
@ExtendWith 테스트 확장을 위해 사용. 이 어노테이션은 상속된다.  

어노테이션 조합

몇몇 어노테이션들은 메타-어노테이션의 역할 또한 가지기 때문에, 어노테이션들을 조합하여 새로운 어노테이션을 정의할 수 있으며, 이 신생 어노테이션은 자신을 구성하는 어노테이션들의 의미을 자동으로 상속받을 것이다.

예를 들어, 코드에 @Tag("fast") 를 복붙하는 대신, 새로운 @Fast 어노테이션을 생성하여 사용할 수 있는 것이다. 이렇게 생성된 @Fast 어노테이션은 @Tag("fast") 를 대체할 수 있다.

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.junit.jupiter.api.Tag;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
public @interface Fast {
}