@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)publicclassJUnitJupiterTemplateTests{
@BeforeAllvoidbeforeAll(){ // 1회성 전처리
log.trace("beforeAll() invoked.");
// TODO here.
} // beforeAll@BeforeEachvoidbeforeEach(){ // 매번 수행되는 전처리
log.trace("beforeEach() invoked.");
// TODO here.
} // beforeEach@AfterAllvoidafterAll(){ // 1회성 후처리
log.trace("afterAll() invoked.");
// TODO here.
} // afterAll@AfterEachvoidafterEach(){ // 매번 수행되는 후처리
log.trace("afterEach() invoked.");
// TODO here.
} // afterEach// ------------------------------------------------@Disabled@Tag("fast")@Test@Order(1)@DisplayName("contextLoads")@Timeout(value = 500L, unit = TimeUnit.MILLISECONDS)voidcontextLoads(){ // 단위 테스트 메서드
log.trace("contextLoads() invoked.");
} // contextLoads
} // end class
복사한 코드를 Maven Project의 빌드 설정 파일인 pom.xml에 paste합니다.
<dependencies><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.10.0</version><scope>test</scope></dependency><!-- 기타 의존성 --></dependencies>
- <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칸씩 공백을 두어 가독성을 높입니다.
추가된 의존성은 Maven Project 내부에 Maven Dependencies에서 확인할 수 있습니다.
자세한 의존성 정의 방법은 추후에 다루겠습니다.
저는 junit5와 lombok 의존성을 추가하였습니다.
<dependencies><!-- 테스트 코드 api --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!-- 추가된 롬복 의존성 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><!-- 의존성의 버전 --><version>1.18.28</version><!-- scope의 provided는 컴파일에 필요하며 Runtime일 때 제거한다는 의미 --><!-- scoop 태그를 삭제하면 default가 compile --><!-- 롬복은 런타임 시에도 필요하므로 scope 태그 제거 --><!-- <scope>provided</scope> --></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.20.0</version></dependency></dependencies>
의존성이 잘 정의됐는지 Dependency Hierarchy로 계층 구조를 확인합니다.
Dependency Hierarchy
log4j-core 의존성을 추가하면 log4j-api는 자동으로 추가됩니다.
마지막으로 <build> 태그를 정의합니다.
<build> 태그는 eclipse의 기능을 확장시키는 <plugin> 태그를 사용하기 위함입니다.
만약 웹앱 프로젝트로 생성하였다면 war 플러그인도 추가합니다.
<build><finalName>/</finalName><plugins><!-- 웹앱 프로젝트 추가 플러그인 --><!-- <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.4.0</version>
</plugin> --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-eclipse-plugin</artifactId><version>2.10</version><configuration><downloadSources>true</downloadSources><!-- <downloadJavadocs> == 자바 공식문서 다운로드 결정 --><downloadJavadocs>false</downloadJavadocs></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><release>${java-version}</release></configuration></plugin></plugins></build></project>
pom.xml을 단 1글자라도 수정하면 Maven project를 무조건 업데이트해야 합니다.