JUNIt5 통합 테스트로 초기화 처리
배경.
JUNIt5가 실시한 테스트에서 사용자 데이터 초기화 등의 목적을 위해 테스트 수행 전에 공동 처리를 수행하고자 할 때의 실시 방법을 조사하여 글로 보존하였다.
이루어지다
예를 들어 어떤 테스트반에서 실시한 테스트 방법 중 각 테스트를 실행하기 전에 공동 처리를 하고자 하는 경우 다음과 같이 많이 쓰일 것이라고 생각합니다.
public class SampleTest {
@BeforeEach
public void setUp(TestInfo info) {
System.out.println("beforeEach() executed before " + info.getDisplayName() + ".");
}
@Test
@DisplayName("テスト1")
public void test1(TestInfo info) {
System.out.println(info.getDisplayName() + " executed.");
}
}
이러한 경우@BeforeEach
가 수여한 방법은 각 테스트가 실행되기 전에 집행한다.단, 이 처리는 SampleTest
에서 실시한 테스트 방법에서만 실행되기 때문에 다른 종류의 정의된 방법을 실행할 때 이 처리를 실행하지 않습니다.그렇다면 모든 테스트 클래스가 테스트 실행 전에 같은 처리를 하기 위해서는 어떻게 해야 하나요?JUNIt5에는 Extension이라는 기능이 있어 테스트 기능을 확장할 수 있습니다.그리고 이 기능은 스스로 제작할 수 있고 테스트의 초기화 처리도 이 Extension을 사용하여 실현할 수 있다.
먼저 Extension을 구현하는 클래스부터 시작합니다.예를 들어 아까처럼 테스트 실행 전에 방법 이름을 표시하는 처리 Extension은 다음과 같다.
public class SampleExtension implements BeforeEachCallback {
@Override
public void beforeEach(ExtensionContext context) throws Exception {
System.out.println("beforeEach() executed before " + context.getDisplayName() + ".");
}
}
SampleExtension
는 BeforeEachCallback
의 설치 유형으로 설치beforeEach()
방법이 필요하다.따라서 Extension을 사용하는 테스트 클래스는 테스트가 실행되기 전에 여기에서 지정한 처리를 수행합니다.또 이번에는 테스트 수행 전 초기화 처리BeforeEachCallback
를 하기 위해 인터페이스를 실시했으나 수행하려는 시기에 따라 실시하는 인터페이스가 달라 목적에 맞는 인터페이스가 필요하다.그리고 또 어떤 인터페이스가 다음 자료에 기재되어 있습니까?JUnit 5 User Guide
다음은 테스트 클래스에서 이 Extension을 사용하는 설정을 추가해야 합니다.다음은 설치입니다.
@ExtendWith(SampleExtension.class)
public class SampleTest {
@Test
@DisplayName("テスト1")
public void test1(TestInfo info) {
System.out.println(info.getDisplayName() + " executed.");
}
}
@ExtendWith()
에서 SampleExtension
를 지정하면 방금 실시한 초기화 처리를 실행합니다.실행 결과는 다음과 같습니다.beforeEach() executed before テスト1.
テスト1 executed.
또한 각 테스트에 설정된 변수를 사용하는 초기화 처리를 실시하려면 어떻게 해야 합니까?예를 들어 사용@BeforeEach
의 실시 예는 다음과 같다.public class SampleTest01 {
private final String userName = "user01";
@BeforeEach
public void setUp(TestInfo info) {
System.out.println("beforeEach() executed before " + info.getDisplayName() + ". userName=" + this.userName);
}
@Test
@DisplayName("テスト1")
public void test1(TestInfo info) {
System.out.println(info.getDisplayName() + " executed.");
}
@Test
@DisplayName("テスト2")
public void test2(TestInfo info) {
System.out.println(info.getDisplayName() + " executed.");
}
}
아까처럼 Extension 레벨의 설치는 테스트 레벨별로 설정된 변수(이번에는userName
의 정보를 얻을 수 없기 때문에 신경을 써야 한다.이때 사용@RegisterExtension
하면 실현할 수 있다.먼저 Extension 클래스를 구현합니다.public class UserNameExtension implements BeforeEachCallback {
private final String userName;
public UserNameExtension(String userName) {
this.userName = userName;
}
@Override
public void beforeEach(ExtensionContext context) throws Exception {
System.out.println("beforeEach() executed before " + context.getDisplayName() + ". userName=" + this.userName);
}
}
다음에 테스트 클래스에 상기 Extension 클래스의 설정을 추가합니다.이번에 두 개의 시험반을 준비했다.SampleTest01.java
public class SampleTest01 {
private final String userName = "user01";
@RegisterExtension
private final UserNameExtension extension = new UserNameExtension(userName);
@Test
@DisplayName("テスト1")
public void test1(TestInfo info) {
System.out.println(info.getDisplayName() + " executed.");
}
@Test
@DisplayName("テスト2")
public void test2(TestInfo info) {
System.out.println(info.getDisplayName() + " executed.");
}
}
SampleTest02.javapublic class SampleTest02 {
private final String userName = "user02";
@RegisterExtension
private final UserNameExtension extension = new UserNameExtension(userName);
@Test
@DisplayName("テスト3")
public void test3(TestInfo info) {
System.out.println(info.getDisplayName() + " executed.");
}
@Test
@DisplayName("テスト4")
public void test4(TestInfo info) {
System.out.println(info.getDisplayName() + " executed.");
}
}
@ExtendWith
대신 @RegisterExtension
를 사용하면 모든 테스트 설정의 변수를 사용하여 초기화 처리를 할 수 있습니다.실행 결과는 다음과 같습니다.beforeEach() executed before テスト3. userName=user02
テスト3 executed.
beforeEach() executed before テスト4. userName=user02
テスト4 executed.
beforeEach() executed before テスト1. userName=user01
テスト1 executed.
beforeEach() executed before テスト2. userName=user01
テスト2 executed.
참고로 우리는 다음과 같은 @BeforeEach
와 @RegisterExtension
두 가지 상황에서의 집행 순서를 검증했다.public class SampleTest01 {
private final String userName = "user01";
@BeforeEach
public void setUp(TestInfo info) {
System.out.println("setUp() executed before " + info.getDisplayName() + ".");
}
@RegisterExtension
private final UserNameExtension extension = new UserNameExtension(userName);
@Test
@DisplayName("テスト1")
public void test1(TestInfo info) {
System.out.println(info.getDisplayName() + " executed.");
}
@Test
@DisplayName("テスト2")
public void test2(TestInfo info) {
System.out.println(info.getDisplayName() + " executed.");
}
}
실행 결과는 다음과 같습니다. Extension 클래스의 처리가 먼저 실행된 것 같습니다.beforeEach() executed before テスト1. userName=user01
setUp() executed before テスト1.
テスト1 executed.
beforeEach() executed before テスト2. userName=user01
setUp() executed before テスト2.
テスト2 executed.
참고 문헌
Reference
이 문제에 관하여(JUNIt5 통합 테스트로 초기화 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/empenguin/articles/a7aa1f666cfc8e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)