@BeforeEach와 @BeforeAll의 차이
@BeforeEach와 @BeforeAll는 실행 시점에 차이가 있다. 둘 모두 테스트 시작 전에 실행되는 것은 같지만, @BeforeEach는 개별 테스트 실행 전에 실행되며, @BeforeAll은 모든 테스트 실행 전에 한 번만 실행된다.
@BeforeEach 사용해보기
예를 들어 다음과 같은 SimpleTest 테스트 코드를 살펴보자.
class SimpleTest {
@BeforeEach
fun setUp() {
println("Before Each")
}
@Test
fun test1() {
}
@Test
fun test2() {
}
}
SimpleTest 테스트는 @BeforeEach가 붙은 setUp 함수에서 Before Each를 출력하며, 두 개의 테스트를 가진다. 이 테스트를 실행해보면 다음과 같은 결과가 나오는 것을 볼 수 있다.
Before Each가 두 번 출력되었다. 두 개의 테스트 실행 전에 setUp 함수가 실행되었기 때문이다.
@BeforeAll 사용해보기
@BeforeAll은 @BeforeEach와 사용 방법이 조금 다르다. @BeforeAll은 정적으로 만들어져야 하기 때문에 companion object 내부에 함수를 생성해야 하며, @JVMStatic을 붙여 static 함수가 될 수 있도록 만들어야 한다.
class SimpleTest {
@Test
fun test1() {
}
@Test
fun test2() {
}
companion object {
@JvmStatic
@BeforeAll
fun setUp(): Unit {
println("Before All")
}
}
}
이렇게 만들어진 테스트를 실행해보면 다음과 같은 결과가 나온다.
테스트는 2개가 실행되었는데, Before All은 하나만 출력된 것을 볼 수 있다.
@BeforeEach의 한계와 @BeforeAll의 사용처
@BeforeEach는 테스트간의 독립성을 위해 매 테스트마다 초기화되어야 하는 클래스 등을 설정하기 위해 사용한다. 하지만, 테스트 이전의 작업을 위해 BeforeEach는 부족하다. 만약 모든 테스트에 한 번만 로딩되어야 하는 데이터가 있으면, @BeforeEach에서 로딩을 하면, 테스트가 많아질 수록 중복된 작업에 의해 테스트 시간이 더 오래 걸리기 때문이다. 좋은 테스트는 시간이 오래 걸리지 않아야 하므로, 이런 경우 한 번만 로딩하는 것이 좋다.
@BeforeAll는 이런 경우에 사용된다. @BeforeAll을 사용하면 함수가 한 번만 실행되므로, 모든 테스트에 한 번만 로딩되어야 하는 데이터를 로딩할 때 혹은 테스트에 설정될 불변값이 로딩되어야 하는 경우 사용된다.