Spring Boot Test - JUnit5 Test 설정
1) 테스트 클래스 인스턴스 생명 주기 설정
테스트 생명주기를 class 단위로 할지, method 단위로 할지 설정한다.
기본 값은 method 단위
특정 테스트 클래스에 적용
- 테스트 클래스에
@TestInstance(value = Lifecycle)
어노테이션 사용 - Lifecycle
PER_CLASS
: class 단위로 설정1 2
@TestInstance(TestInstance.Lifecycle.PER_CLASS) class UserRepositoryTest {
PER_METHOD
: method 단위로 설정1 2
@TestInstance(TestInstance.Lifecycle.PER_METHOD) class UserRepositoryTest {
- 테스트 클래스에
전체 테스트 클래스에 적용
/test/resource
경로에junit-platform.properties
파일 생성 후 작성junit.jupiter.testinstence.lifecycle.default = Lifecycle
형태로 사용- Lifecycle
PER_CLASS
: class 단위로 설정1
junit.jupiter.testinstence.lifecycle.default = per_class
PER_METHOD
: method 단위로 설정1
junit.jupiter.testinstence.lifecycle.default = per_method
2) 테스트 실행 순서 설정
@Nested 클래스 순서 설정
- 특정 테스트 클래스가 가지고 있는
@Nested class
에 대해 실행 순서를 지정할 때 사용한다. - 테스트 클래스에
@TestClassOrder(value = ClassOrderer 구현체)
어노테이션 사용 - ClassOrderer 구현체
Random.class
- 설정 기본 값
- 랜덤 실행
1 2
@TestClassOrder(ClassOrderer.Random.class) class ApiControllerTest {
OrderAnnotation.class
@Order(index)
어노테이션으로 순서 지정- springframework 제공이 아닌 org.junit.jupiter.api 제공 Order를 사용해야 한다.
1 2 3 4 5 6
@TestClassOrder(ClassOrderer.OrderAnnotation.class) class ApiControllerTest { @Order(1) @Nested class NestedClassTest{
ClassName.class
- class 이름 기준으로 알파벳 순 실행
1 2
@TestClassOrder(ClassOrderer.ClassName.class) class ApiControllerTest {
- class 이름 기준으로 알파벳 순 실행
DisplayName.class
- DisplayName 기준으로 알파벳 순 실행
1 2
@TestClassOrder(ClassOrderer.DisplayName.class) class ApiControllerTest {
- DisplayName 기준으로 알파벳 순 실행
- 특정 테스트 클래스가 가지고 있는
클래스 순서 설정
- 전체 테스트에 적용
/test/resource
경로에junit-platform.properties
파일 생성 후 작성junit.jupiter.testclass.order.default = ClassOrderer구현체
형태로 사용- ClassOrderer 구현체
Random.class
- 설정 기본 값
- 랜덤 실행
1 2
junit.jupiter.testclass.order.default= \ org.junit.jupiter.api.ClassOrderer$Random
OrderAnnotation.class
- class에
@Order(index)
어노테이션으로 순서 지정1 2
junit.jupiter.testclass.order.default= \ org.junit.jupiter.api.ClassOrderer$OrderAnnotation
- class에
ClassName.class
- class 이름 기준으로 알파벳 순 실행
1 2
junit.jupiter.testclass.order.default= \ org.junit.jupiter.api.ClassOrderer$ClassName
- class 이름 기준으로 알파벳 순 실행
DisplayName.class
- DisplayName 기준으로 알파벳 순 실행
1 2
junit.jupiter.testclass.order.default= \ org.junit.jupiter.api.ClassOrderer$DisplayName
- DisplayName 기준으로 알파벳 순 실행
특정 테스트 클래스의 메서드 순서 설정
- 특정 테스트 클래스 인스턴스에 속하는 메서드의 실행 순서를 지정할 때 사용한다.
- 테스트 클래스에
@TestMethodOrder(value = MethodOrderer 구현체)
어노테이션 사용 - MethodOrderer 구현체
Random.class
- 설정 기본 값
- 랜덤 실행
1 2
@TestMethodOrder(MethodOrderer.Random.class) class ApiControllerTest {
OrderAnnotation.class
- class에
@Order(index)
어노테이션으로 순서 지정1 2
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) class ApiControllerTest {
- class에
- Alphanumeric.class (Deprecated)
- Junit 5.7 부터 Dprecated 되었다.
- Alphanumeric 대신 MethodName 또는 DisplayName 사용
MethodName.class
- method 이름 기준으로 알파벳 순 실행
1 2
@TestMethodOrder(MethodOrderer.MethodName.class) class ApiControllerTest {
- method 이름 기준으로 알파벳 순 실행
DisplayName.class
- DisplayName 기준으로 알파벳 순 실행
1 2
@TestMethodOrder(MethodOrderer.DisplayName.class) class ApiControllerTest {
- DisplayName 기준으로 알파벳 순 실행
전체 테스트 클래스의 메서드 순서 설정
/test/resource
경로에junit-platform.properties
파일 생성 후 작성junit.jupiter.testmethod.order.default = MethodOrderer구현체
형태로 사용- MethodOrderer 구현체
Random.class
- 설정 기본 값
- 랜덤 실행
1 2
junit.jupiter.testmethod.order.default= \ org.junit.jupiter.api.MethodOrderer$Random
OrderAnnotation.class
- class에
@Order(index)
어노테이션으로 순서 지정1 2
junit.jupiter.testmethod.order.default= \ org.junit.jupiter.api.MethodOrderer$OrderAnnotation
- class에
- Alphanumeric.class (Deprecated)
- Junit 5.7 부터 Dprecated 되었다.
- Alphanumeric 대신 MethodName 또는 DisplayName 사용
MethodName.class
- method 이름 기준으로 알파벳 순 실행
1 2
junit.jupiter.testmethod.order.default= \ org.junit.jupiter.api.MethodOrderer$MethodName
- method 이름 기준으로 알파벳 순 실행
DisplayName.class
- DisplayName 기준으로 알파벳 순 실행
1 2
junit.jupiter.testmethod.order.default= \ org.junit.jupiter.api.MethodOrderer$DisplayName
- DisplayName 기준으로 알파벳 순 실행
3) 확장 팩 등록
@Extention
어노테이션을 이용한 선언적 접근 방법과 @RegisterExtention
어노테이션을 사용한 프로그래밍적인 등록 방법이 있다.
@Extention
- Junit 5에서 사용하는 확장 모델
(Junit 4에서는@RunWith(Runner), @TestRule, @MethodRule
을 사용) - 다음의 경우에 실행되도록 사용
- 테스트 인스턴스 후처리 (로깅 등)
- 조건부 테스트 실행 - ExecutionCondition 구현
- 라이프사이클 콜백 - 해당 콜백 인스턴스 구현
참고
라이프 사이클 순서- BeforeAllCallback
- BeforeAll
- BeforeEachCallback
- BeforeEach
- BeforeTestExecutionCallback
- Test
- AfterTestExecutionCallback
- AfterEach
- AfterEachCallback
- AfterAll
- AfterAllCallback
- 매개변수 해결 - ParameterResolver 구현
- 예외 처리 - TestExecutionExceptionHandler 구현
@RegisterExtention
- 이 어노테이션을 통하면 extention을 확장할 수 있다.
- 확장하는 extention 변수는 static으로 선언해야 한다.
- ex
1 2 3 4 5 6 7 8 9
class RepositoryTest { @RegisterExtension static EmployeeDatabaseSetupExtension DB = new EmployeeDatabaseSetupExtension( "jdbc:h2:mem:AnotherDb;DB_CLOSE_DELAY=-1", "org.h2.Driver", "sa", "" ); }
- ex
4) 확장 팩 자동 감지
- 설정 기본 값은 false 이므로, 이 기능을 사용하려면 true 값을 주어야 한다.
이 기능을 활성화하면 테스트 실행 중 클래스 경로에 있는 확장을 자동으로 감지하여 실행해주기 때문에 수동으로 @Extends 등을 이용하여 등록할 필요가 없다.
1
junit.jupiter.extensions.autodetection.enabled = true
참고한 사이트
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.