JUNIt5 통합 테스트로 초기화 처리

27574 단어 Javajunit5tech

배경.


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() + ".");
    }
}
SampleExtensionBeforeEachCallback의 설치 유형으로 설치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.java
public 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.

참고 문헌

  • JUnit 5 User Guide
  • 좋은 웹페이지 즐겨찾기