요즘 일하면서 내가 제일 신경 쓰고 있는 것은 히스토리를 잘 남기는 것이다
모든 일은 누구나 할 수 있다는 것을 깨달았지만
코드마다 있는 사연은... 그 사람밖에 알 수가 없다는 것이다 🥹
왜 그렇게 생각하게 됐냐구요? 저도 그러고 싶지 않았습니다
그래서!!
테스트 코드를 여느때와 다름없이 작성하던 중...
기존에는 JUnit4 버전으로 사용하고 있었는데
다른 담당자가 테스트 코드 실행 시 빠르게 내용을 파악하시면 좋겠다고 생각이 들었다
결론부터 먼저 말하자면..
테스트 코드를 실행했을 때 아 이런 테스트~를 쉽게 파악하길 원했다
그러기 위해서는 @DisplayName 같은 어노테이션 사용이 필요했고,
이를 사용하기 위해서는 JUnit 버전을 업그레이드 해야했다
1. JUnit5 의존성 추가
(1) build.gradle
dependencies {
// JUnit 5 의존성
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
// Mockito 의존성
testImplementation('org.mockito:mockito-core:3.12.4')
}
//...
test{
useJUnitPlatform()
}
(2) pom.xml
<!-- JUnit 5 의존성 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.1</version> <!-- 최신 버전으로 대체해야 합니다. -->
<scope>test</scope>
</dependency>
<!-- Mockito 의존성 -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.12.4</version> <!-- 최신 버전으로 대체해야 합니다. -->
<scope>test</scope>
</dependency>
2. JUnit4 vs JUnit5
https://junit.org/junit5/docs/current/user-guide/
JUnit 5 User Guide
Although the JUnit Jupiter programming model and extension model do not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and custo
junit.org
공식 문서가 정리가 잘 되어있어서 요녀석을 인용하려고 합니다
둘의 차이점은 크게 아래로 정리해볼 수 있다
Java 버전을 몇 부터 지원하는지?
구조가 어떻게 달라졌는지?
사용법이 어떻게 달라졌는지?
(1) Java 버전
Java 8 또는 그 이상을 써야한다고 되어있는데요, 테스트하는데는 이전 버전이어도 괜찮습니다
JUnit 5 requires Java 8 (or higher) at runtime. However, you can still test code that has been compiled with previous versions of the JDK.
🧚JUnit 5는 런타임 시 Java 8(또는 그 이상)이 필요합니다. 그러나 이전 버전의 JDK로 컴파일된 코드를 계속 테스트할 수 있습니다.
(2) 구차한..구조 차이
JUnit4는 올인원 토너 같은 녀석입니다.
근데 JUnit5는 플랫폼의 구성이 추가 됐습니다
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
JUnit Platform
JVM에서 테스트 프레임워크 실행하는 기본이 되는 녀석입니다
TestEngine API를 사용할 수 있도록 해줍니다
Console Lancher를 제공하는 것도 이 녀석입니다
IntelliJ 같은 IDE에서도 사용할 수 있습니다
JUnit Jupiter 🪐
(왜 목성 이모지는 없죠)
이 녀석은 확장팩 같은 친구입니다
JUnit 5에서 테스트를 작성하고 확장을 하기 위한
새로운 프로그래밍 모델과 확장 모델의 종합 세트입니다
JUnit Vintage
JUnit3과 JUnit4 기반 테스트를 실행하기 위한 TestEngine을 제공합니다
개인적으로 이름 되게 잘 지었다 생각함
(3) Annotation 사용
JUnit 4 | JUnit 5 | 설명 |
@Test | @Test | 나는야 테스트 메소드 |
N/A | @ParameterizedTest | 매개 변수화된 테스트 |
N/A | @RepeatedTest | 반복 테스트 시 사용 |
N/A | @TestFactory | 동적 테스트를 위한 테스트 팩토리 |
N/A | @TestTemplate | 컨텍스트 여러 개를 호출하여 여러 번 테스트할 수 있음 |
N/A | @TestClassOrder | 테스트할 클래스 순서 정할 수 있다 |
@FixMethodOrder | @TestMethodOrder | 메서드 실행 순서를 정할 수 있다 |
N/A | @TestInstance | 테스트 인스턴스 수명 주기를 설정 |
N/A | @DisplayName | 테스트 클래스나 메서드 보여질 이름 지정 |
N/A | @DisplayNameGeneration | 테스트 클래스의 보여질 이름 지정 |
@BeforeClass | @BeforeAll | 현재 클래스의 모든 테스트 메서드보다 먼저 실행 |
@AfterClass | @AfterAll | 현재 클래스의 모든 테스트 메서드 실행 후 실행 |
@Before | @BeforeEach | 각 테스트 메서드 전에 실행 |
@After | @AfterEach | 각 테스트 메서드 후에 실행 |
@Ignore | @Disabled | 테스트 메서드/클래스 비활성화 할 수 있츰 |
N/A | @TestFactory | 동적 테스트를 위한 테스트 팩토리 |
N/A | @Nested | 중첩 테스트 |
@Category | @Tag | 태깅(Tagging) 및 필터링(Filtering) |
N/A | @ExtendWith | 사용자 정의 확장 등록 |
N/A | @Timeout | 실행 지정 기간을 초과하는지 테스트할 수 있음 |
N/A | @RegisterExtension | 확장 등록 |
N/A | @TempDir | 임시 디렉터리 생성하는데 사용 |
3. 사용 예제
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@DisplayName("A special test case")
class DisplayNameDemo {
@Test
@DisplayName("Custom test name containing spaces")
void testWithDisplayNameContainingSpaces() {
}
@Test
@DisplayName("╯°□°)╯")
void testWithDisplayNameContainingSpecialCharacters() {
}
@Test
@DisplayName("😱")
void testWithDisplayNameContainingEmoji() {
}
}
이모지도 사용하는 이 녀석 제법 귀엽습니다
나머지 어노테이션도 JUnit 예제가 아주 잘 나와있다요
'BackEnd > Java&Spring' 카테고리의 다른 글
함수형 인터페이스 (Functional Interface) (2) | 2023.11.25 |
---|---|
NonNull 사랑...사...사...랑... 그냥 좋아합니다. (3) | 2023.11.07 |
Error) java: class, interface, or enum expected 해결 (0) | 2023.06.26 |
🌸 startsWith()/endWith() 문자열의 시작과 끝 (0) | 2023.04.04 |
@JsonProperty와 @JsonNaming (0) | 2023.03.17 |