@TestInstance : 각각의 단위 테스트 메서드를 수행할 때, 안전한 결과를 얻어내기 위해 테스트 클래스로부터 테스트 객체를 어떠한 기준으로 생성할 지 결정하는 어노테이션입니다. 해당 어노테이션의 속성은 'PER_CLASS'와 'PER_METHOD'가 이며 defualt는 'PER_CLASS'입니다.
- PER_METHOD(기본값) : 단위 테스트 메서드마다 테스트 객체 생성 후 테스트 메서드를 수행합니다. - PER_CLASS : 하나의 테스트 객체만 생성 후, 모든 단위 테스트 메서드를 수행합니다.
다만 PER_METHOD는 메모리에 부담을 주기 때문에 개발환경을 고려하여 설정해야 합니다.
@TestMethodOrder : 모든 단위 테스트 메서드의 실행순서의 기준과 방법을 설정합니다. 다양한 속성이 있지만, 주로 OrderAnnotation(@Order, 서수)을 사용합니다.
테스트 클래스 블록 어노테이션
전처리 어노테이션
@BeforeAll : 단위 테스트 메서드 수행 시, 오직 한 번만 수행되는 전처리입니다.
@BeforeEach : 단위 테스트 메서드 수행 시 매번 수행되는 전처리입니다.(JUnit4의 @Before와 동일)
@AfterAll: 단위 테스트 메서드 수행 시, 오직 한 번만 수행되는 후처리입니다.
@AfterEach: 단위 테스트 메서드 수행 시 매번 수행되는 후처리입니다.(JUnit4의 @Before와 동일)
후처리 어노테이션
@Disabled : 단위테스트 메서드를 제외시킵니다.
@Tag: 단위 테스트의 성격(fast,normal, slow)을 표시합니다.
@Test: 메서드가 단위 테스트용임을 표시합니다.
@Order: 단위 테스트 메서드의 수행 순서를 결정합니다.
@DisplayName: 테스트 도구에 표시되는 단위 테스트의 이름입니다. JUnit View에서 해당 어노테이션으로 설정한 이름으로 보여줍니다.
@Timeout: JUnit4에서는 @Test의 속성이었습니다. 하지만, JUnit5에서는 다양한 시간 단위로 테스트의 임계 소요 시간을 정의할 수 있도록 분리하여 사용합니다. 속성으로 value와 unit이 있습니다.
예를 들어, 0.5초 안에 테스트를 종료해야 한다면 다음과 같이 코드를 작성할 수 있습니다. @Timeout(value = 500L, unit = TimeUnit.MILLISECONDS)
다음은 간단한 JUnit5 테스트 코드 작성법입니다.
@Log4j2
@NoArgsConstructor
// 1. 타입 선언부에 적용해야할 JUnit Jupyter Annotations입니다.
@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JUnitJupiterTemplateTests {
@BeforeAll
void beforeAll() { // 1회성 전처리
log.trace("beforeAll() invoked.");
// TODO here.
} // beforeAll
@BeforeEach
void beforeEach() { // 매번 수행되는 전처리
log.trace("beforeEach() invoked.");
// TODO here.
} // beforeEach
@AfterAll
void afterAll() { // 1회성 후처리
log.trace("afterAll() invoked.");
// TODO here.
} // afterAll
@AfterEach
void afterEach() { // 매번 수행되는 후처리
log.trace("afterEach() invoked.");
// TODO here.
} // afterEach
// ------------------------------------------------
@Disabled
@Tag("fast")
@Test
@Order(1)
@DisplayName("contextLoads")
@Timeout(value = 500L, unit = TimeUnit.MILLISECONDS)
void contextLoads() { // 단위 테스트 메서드
log.trace("contextLoads() invoked.");
} // contextLoads
} // end class
- <name> 태그 아래의 <url>은 프로젝트의 주소를 입력하는 곳인데 일반적으로 잘 사용하지 않습니다.
<properties> 태그는 속성을 정의합니다.
<properties> 가 감싸고 있는 부분은 자바 버전, 자바의 환경변수를 세팅합니다.
태그의 이름은 사용자가 임의로 지을 수 있습니다.
<!-- 현재 프로젝트에 필요한 속성을 정의하는 태그-->
<properties>
<java-version>17</java-version>
<java-home>${env.JAVA_HOME}</java-home>
<!-- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> defualt -->
</properties>
그리고 <properties> 태그 위 아래로 두 칸씩, 사용자 정의 속성과 Encoidng은 1칸씩 공백을 두어 가독성을 높입니다.