웹 설문조사 어플리케이션 개발 중에 JPA 페이징에 대한 테스트를 작성하던 도중 다음과 같은 문제가 발생했다.
😢 오류 발생 상황
TEST
RESULT
"No tests were found"
Nested class 내부에 작성한 테스트를 인식하지 못하는 문제였다.
따라서, JUnit 테스트에서 문제가 발생했을 때 조치해야할 부분에 대해서 찾아보게 되었고, 방법은 크게 두 가지였다.
1. build.gradle에 다음 코드 추가.
test {
useJUnitPlatform()
}
2. File -> Settings -> Build, Execution.. -> Build Tools -> Gradle 탭에서 Run tests using을 Gradle에서 Intellij로 변경
사실 1번은 이미 되어있었고, 2번도 프로젝트를 처음 생성할 때 설정을 해놨었다. 프로젝트 빌드, 실행, 테스트할 때 Gradle 보다 Intellij 프로세스를 이용하는 것이 성능에서 유리하다는 것을 알았기 때문이다.
근데 Intellij의 문제인지, 아니면 다른 문제인지 모르겠지만 해당 설정들이 다시 default (Gradle)로 되어있었다. 따라서 다시 변경해주고 다시 Test를 시도해봤지만 문제는 해결되지 않았다...
💡 해결
그렇게 구글의 도움을 받아 해결 방법을 찾아보던 중, 다음의 글을 발견했다.
해당 게시물의 답변 중, JUnit5 부터 @Test 어노테이션을 사용할 때 import org.junit.Test 이 아닌 import org.junit.jupiter.api.Test 라이브러리를 사용해야 한다는 내용이 있다.
해결 방법은 jupiter api의 @Test를 사용해야 한다는 것이다.
내 코드를 확인해 본 결과, 나도 org.junit.Test 의 @Test 어노테이션 코드를 사용하고 있었다. 웃긴 건 나머지 AfterEach나 Nested 같은 어노테이션들은 jupiter api를 사용하고 있었다.
외부 라이브러리의 코드를 사용할 때 주의해야겠다는 생각이 들었고 패키지 임포트 경로를 org.junit.jupiter.api.Test 로 바꿔주니 테스트가 성공적으로 수행되었다.
💡 Jupiter ??
JUnit 5의 구조는 다음과 같다.
- Platform : 테스트를 실행해주는 런처 제공. TestEngine API 제공
- Jupiter : JUnit 5를 지원하는 TestEngine API 구현체
- Vintage : JUnit 4, 3를 지원하는 TestEngine API 구현체
JUnit 5는 이전 버전과는 달리 모듈화 되어있다. JUnit5의 세부 모듈은 그림에서와 같이 크게, Platform, Jupiter, Vintage 로 구성되어있다.
- Platform 은 JUnit 으로 작성한 테스트 코드를 실행해주는 런처를 제공합니다.
- Jupiter, Vintage는 JUnit 플랫폼이 제공하는 TestEngine api 구현체다.
- Jupiter는 JUnit 5를 지원 / Vintage는 JUnit 4,3를 지원하는 구현체이다.
따라서, JUnit 5 환경에서 테스트하기 위해선 jupiter api를 사용해야 하는 것이다.
DisplayName이 적용이 안된다거나, After... , Before... 등 테스트에 있어 문제가 생긴다면,
@Test 어노테이션이 jupiter api의 것인지 확인해보자.
최근, 개인 프로젝트를 진행하면서 테스트 코드에 대한 중요성을 크게 느끼고 있다. 기존에는 내가 작성한 코드의 동작을 확인하기 위해 프로젝트를 구동하고 직접 일일이 눈으로 확인했었는데, Debug 하기에도 쉽지 않았고 코드를 검증하는 데에 많은 시간이 소요되었다.
반면 테스트 코드는 내가 작성한 코드에 대한 피드백을 빠르게 받을 수 있다. 또한 여러 개의 테스트 케이스를 작성함으로써, 어떠한 상황에서 예외가 발생하는지 검증할 수 있고 문제가 발생했을 때 어느 부분을 수정해야 할지 더욱 명확하게 알 수 있다. 또한 Debug 사용하기에도 용이하다.
앞으로 기능 구현을 마치고 난 뒤에 테스트 코드를 통해 검증하는 연습을 지속할 것이며 테스트하기 좋은 코드에 대한 고민과 TDD 도 도전해보아야겠다는 생각이 들었다.