kotlin.test.Test vs jupiter.api.Test Backend/Spring, ETC2025. 10. 25. 23:44
Intro
: 어느 날 Unit Test를 작성하던 중에, 사용하고 있던 Test Annotation에 궁금증이 생겼습니다. kotlin.test.Test와 org.junit.jupiter.api.Test 모두 @Test Annotation을 제공하는데 각각 어떤 차이가 있는 것일까요? 그리고 둘중 하나를 선택해서 쓰는 이유는 무엇일까요? 내가 사용하는 기술 셋에 대해, 사용 목적조차 모르고 있었다는 것에 반성하며 정리해 보았습니다.
kotlin.test.Test
: kotlin.test.Test는 kotlin의 표준 Test annotation이고, 언어 차원에서 제공하며 특정 Framework/Platform에 의존적이지 않은 Test Annotation입니다(kotlin 표준 library에 포함돼 있음 - kotlin.test package).
이 annotation이 붙은 test 실행은 Platform에 따라 차이가 있어요.
- JVM에서는 JUnit으로 Mapping되어 실행됨.
- Kotlin Native에서는 kotlin/native test runner로 Mapping되어 실행됨.
저의 경우는 JVM에서 돌아가는 app을 개발하고 있었으니, kotlin.test.Test annotation을 붙이더라도 JUnit test와 별반 차이가 없었습니다. 다만 JUnit의 기능인 @BeforeEach 같은 것은 지원하지 않는다고 하네요.
org.junit.jupiter.api.Test
: JUnit에서 제공하는 Test annotation입니다. annotation 자체에는 별 속성같은 것도 없지만, JUnit에서 annotation을 인식하여 test를 실행합니다.
※ kotlin.test.Test annotation과 JUnit의 기능을 같이 쓰면...?
: 만약에 @Test annotation에 대한 의존성을 잘못 추가하여, kotlin.test.Test annotation과 JUnit의 기능을 함께 사용하도록 test code를 작성하면 어떻게 될까요(예를들면 아래와 같은 code)?
import org.junit.jupiter.api.BeforeEach
import kotlin.test.Test
class AddUseCaseTestMultipleCase {
lateinit var addUseCase: AddUseCase
@BeforeEach
fun setUp() {
addUseCase = AddUseCase()
}
@Test
fun 1 + 2 = 3() {
val result = addUseCase.add(1, 2)
assertEquals(result, 3)
}
@Test
fun -1 + 2 = 1() {
val result = addUseCase.add(-1, 2)
assertEquals(result, 1)
}
}
다행히도 문제없이 @BeforeEach annotation이 개별 test가 실행되기 전에 실행됩니다.
kotlin.test.Test는 어떤 Framework/Platform에서도 실행될 수 있도록, 다른 Test framework로 Mapping됩니다(JVM 환경이라면, kotlin.test.Test -> org.junit.jupiter.api.Test로 Mapping). 그래서 각 @Test는 JUnit의 Test annotation과 동일하게 처리되고, @BeforeEach도 개별 test가 실행되기 전에 호출됩니다.
Conclusion
: 당장은 kotlin.test.Test annotation을 사용하더라도 문제가 되지 않을 수 있지만, 지금 문제없이 동작한다고 다가 아닌 것 같아요. 제가 의도한대로 code를 작성했느냐가 중요하다고 생각합니다. 그런 관점에서 kotlin.test.Test를 사용하는 것은 제가 의도한 바가 아니고, 그걸 확인하는 과정에서 JUnit의 Test Annotation과 비교해본 것은 의미가 있었던 것 같습니다.
