그날그날메모

@Before 대 @BeforeClass 대 @BeforeEach 대 @BeforeAll

Java

@Before 대 @BeforeClass 대 @BeforeEach 대 @BeforeAll

그날그날메모 2021. 4. 18. 19:20

1. 소개

이 짧은 예제에서, 우리는 차이점을 설명하는거야 @Before , @BeforeClass , @BeforeEach@BeforeAll 을 사용하는 방법에 대한 실제 예제와 함께 -의 JUnit 4와 5에 어노테이션을.

또한 @After 보완 어노테이션에 대해서도 간략히 설명합니다.

JUnit 4부터 시작하겠습니다.

2. @ 전

@Before 어노테이션이 있는 메소드  는 각 테스트 전에 실행됩니다. 이것은 테스트를 실행하기 전에 일반적인 코드를 실행하고자 할 때 유용합니다.

List을 초기화하고 값을 추가하는 예를 살펴 보겠습니다.

@RunWith(JUnit4.class)
public class BeforeAndAfterAnnotationsUnitTest {

    // ...

    private List<String> list;

    @Before
    public void init() {
        LOG.info("startup");
        list = new ArrayList<>(Arrays.asList("test1", "test2"));
    }

    @After
    public void teardown() {
        LOG.info("teardown");
        list.clear();
    }
}

또한 각 테스트를 실행 한 후 List을 지우기 위해 @After 어노테이션이 달린 또 다른 메서드를 추가했습니다 .

그 후 List의 크기를 확인하기 위해 몇 가지 테스트를 추가해 보겠습니다.

@Test
public void whenCheckingListSize_thenSizeEqualsToInit() {
    LOG.info("executing test");
    assertEquals(2, list.size());

    list.add("another test");
}

@Test
public void whenCheckingListSizeAgain_thenSizeEqualsToInit() {
    LOG.info("executing another test");
    assertEquals(2, list.size());

    list.add("yet another test");
}

이 경우 테스트 실행 시마다 List이 수정되므로 각 테스트를 실행하기 전에 테스트 환경이 제대로 설정되었는지 확인하는 것이 중요합니다 .

로그 출력을 살펴보면 initteardown 메서드가 테스트 당 한 번씩 실행 되었는지 확인할 수 있습니다 .

... startup
... executing another test
... teardown
... startup
... executing test
... teardown

3.  @BeforeClass

각 테스트 전에 비용이 많이 드는 일반적인 작업 을 실행하려면 @BeforeClass를 사용하여 모든 테스트를 실행하기 전에 한 번만 실행하는 것이 좋습니다 . 일반적으로 비용이 많이 드는 작업의 몇 가지 예는 데이터베이스 연결 생성 또는 서버 시작입니다.

데이터베이스 연결 생성을 시뮬레이션하는 간단한 테스트 클래스를 만들어 보겠습니다.

@RunWith(JUnit4.class)
public class BeforeClassAndAfterClassAnnotationsUnitTest {

    // ...
    
    @BeforeClass
    public static void setup() {
        LOG.info("startup - creating DB connection");
    }

    @AfterClass
    public static void tearDown() {
        LOG.info("closing DB connection");
    }
}

통지 이러한 방법이 정적 일하기 가 클래스의 테스트를 실행하기 전에 실행됩니다, 그래서.

이전에했던 것처럼 간단한 테스트도 추가해 보겠습니다.

@Test
public void simpleTest() {
    LOG.info("simple test");
}

@Test
public void anotherSimpleTest() {
    LOG.info("another simple test");
}

이번에는 로그 출력을 살펴보면 setuptearDown 메서드가 한 번만 실행 되었는지 확인할 수 있습니다 .

... startup - creating DB connection
... simple test
... another simple test
... closing DB connection

4.  @BeforeEach@BeforeAll

@BeforeEac의 H 및 @BeforeAll는 의 JUnit을 5 당량이다 @Before@BeforeClass . 이러한 어노테이션은 혼동을 피하기 위해 더 명확한 이름으로 이름이 변경되었습니다.

@BeforeEach  및 @AfterEach 어노테이션으로 시작하여 이러한 새 어노테이션을 사용하여 이전 클래스를 복제 해 보겠습니다 .

@RunWith(JUnitPlatform.class)
class BeforeEachAndAfterEachAnnotationsUnitTest {

    // ...
    
    private List<String> list;
    
    @BeforeEach 
    void init() {
        LOG.info("startup");
        list = new ArrayList<>(Arrays.asList("test1", "test2"));
    }

    @AfterEach
    void teardown() {
        LOG.info("teardown");
        list.clear();
    }

    // ...
}

우리가 로그를 확인하면, 우리는이와 같은 방식으로 작동하는지 확인할 수 있습니다 @Before@After 어노테이션 :

... startup
... executing another test
... teardown
... startup
... executing test
... teardown

마지막으로 @BeforeAll  및 @AfterAll 어노테이션이 작동 하는지 확인하기 위해 다른 테스트 클래스에 대해서도 동일하게 수행해 보겠습니다 .

@RunWith(JUnitPlatform.class)
public class BeforeAllAndAfterAllAnnotationsUnitTest {

    // ...
    
    @BeforeAll
    public static void setup() {
        LOG.info("startup - creating DB connection");
    }

    @AfterAll
    public static void tearDown() {
        LOG.info("closing DB connection");
    }

    // ...
}

출력은 이전 어노테이션과 동일합니다.

... startup - creating DB connection
... simple test
... another simple test
... closing DB connection

5. 결론

이 문서에서는, 우리는 사이의 차이를 보여 주었다  @Before , @BeforeClass , @BeforeEach@BeforeAll 어노테이션의 JUnit에서 때 그들 각각이 사용되어야한다.

항상 그렇듯이 예제의 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .

참고
  • https://docs.spring.io/spring-framework/docs/current/reference/html
  • https://www.baeldung.com/junit-before-beforeclass-beforeeach-beforeall