JUnit 5 (3)
들어가기 전에
- < 이전 포스트 : JUnit 5 (2)
- 모든 소스코드는 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 {
}