_______ _ _ _____
|__ __| | | (_) | __ \
| | _ _ | |_ _ _ __ | | | | __ _ _ __
| | | | | || __|| || '_ \ | | | | / _` || '__|
| | | |_| || |_ | || | | || |__| || (_| || |
|_| \__,_| \__||_||_| |_||_____/ \__,_||_|
코드를 짜는 것만큼이나 중요한 테스트 코드 작성, 다들 어떻게 하고 계신가요? 저도 JUnit 4로 테스트를 시작했지만, 반복되는 보일러플레이트 코드와 제한적인 기능에 아쉬움을 느낄 때가 많았습니다. "더 깔끔하고 강력하게 테스트를 짤 순 없을까?" 하는 고민 끝에 JUnit 5를 만났고, 그야말로 신세계를 경험했습니다.
왜 다들 JUnit 5를 '차세대 표준'이라고 부를까요? 이 글을 다 읽고 나면 여러분도 그 이유를 명확히 알게 될 겁니다.
⚡ TL;DR
- JUnit 5는 모듈식 구조로 필요한 기능만 조합해 유연성과 확장성을 극대화했습니다[7].
- Java 8+의 최신 기능을 활용하여 더 직관적이고 강력한 테스트 코드 작성이 가능합니다[4][7].
목차
- 배경: 왜 JUnit 5인가?
- 핵심 개념: JUnit 5를 구성하는 세 기둥
- 실습: JUnit 5 기본 테스트 작성하기
- 모범 사례: JUnit 5 제대로 활용하기
- 마치며 & 참고자료
1. 배경: 왜 JUnit 5인가?
JUnit 4는 오랫동안 Java 진영의 표준 테스트 프레임워크였지만, 모든 기능이 하나의 거대한 Jar 파일에 담겨 있어 유연성이 떨어지는 등 구조적인 문제점을 안고 있었습니다[6][7]. JUnit 5는 이러한 문제들을 해결하고, 개발자 중심의 현대적인 테스트 환경을 제공하기 위해 탄생했습니다[1][6].
✅ 관련 용어 정리
- 단위 테스트(Unit Test): 소프트웨어의 가장 작은 단위(메서드, 클래스 등)를 개별적으로 분리하여 정확성과 신뢰성을 검증하는 테스트입니다[4]. 버그를 조기에 발견하고 코드 변경 시 안정성을 확보하는 데 매우 유용합니다[4].
- JUnit: Java 언어용 단위 테스트 프레임워크입니다[4]. 개발자가 테스트 코드를 쉽게 작성하고 실행할 수 있도록 다양한 기능과 어노테이션을 제공합니다.
2. 핵심 개념: JUnit 5를 구성하는 세 기둥
JUnit 5는 JVM에서 테스트를 실행하는
Platform
과 새로운 테스트 모델인Jupiter
, 그리고 하위 호환성을 위한Vintage
라는 세 가지 독립적인 서브 프로젝트의 조합입니다[2][3][5].
이 모듈식 아키텍처는 JUnit 4와 가장 큰 차이점으로, 각 모듈이 명확한 책임을 갖습니다[7].
구성 요소 | 설명 |
---|---|
JUnit Platform | JVM에서 테스트 프레임워크를 실행하기 위한 기반을 제공합니다. 다양한 테스트 엔진을 실행하고 결과를 보고하는 런처 역할을 합니다[2][5][8]. |
JUnit Jupiter | JUnit 5의 새로운 프로그래밍 모델과 확장 모델입니다. @Test , @DisplayName 등 새로운 어노테이션과 테스트 실행을 위한 자체 TestEngine을 포함합니다[3][5][7]. |
JUnit Vintage | JUnit 3 및 4로 작성된 기존 테스트 코드를 JUnit 5 플랫폼에서 그대로 실행할 수 있도록 지원하는, 하위 호환성을 위한 TestEngine입니다[3][5][7]. |
이러한 구조 덕분에 개발자는 필요한 모듈만 선택적으로 사용할 수 있고, 다른 테스트 프레임워크와의 통합도 용이해졌습니다.
3. 실습: JUnit 5 기본 테스트 작성하기
백문이 불여일견이죠. 간단한 JUnit 5 테스트 코드를 작성해보겠습니다.
① 의존성 추가 (Maven 기준)pom.xml
에 junit-jupiter-api
와 junit-jupiter-engine
의존성을 추가합니다.
org.junit.jupiter
junit-jupiter-api
5.10.1
test
org.junit.jupiter
junit-jupiter-engine
5.10.1
test
② 기본 테스트 코드 작성
JUnit 4와 달리 테스트 클래스나 메서드를 public
으로 선언할 필요가 없습니다[7].
// Calculator.java
class Calculator {
int add(int a, int b) {
return a + b;
}
}
// CalculatorTest.java
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
// public이 아니어도 됩니다!
class CalculatorTest {
@Test
@DisplayName("덧셈 기능 테스트 ➕") // 테스트의 의도를 명확하게 보여줍니다.
void testAdd() {
// given
Calculator calculator = new Calculator();
int a = 5;
int b = 3;
// when
int result = calculator.add(a, b);
// then
assertEquals(8, result, "5 + 3은 8이어야 합니다.");
}
}
@Test
: 이 메서드가 테스트 메서드임을 알립니다.@DisplayName
: 테스트 이름에 이모지나 공백을 포함한 문자열을 사용할 수 있어 가독성을 높여줍니다.assertEquals(expected, actual, message)
: 기대값과 실제값을 비교하여 테스트 성공 여부를 판단합니다.
③ 주요 어노테이션 활용
JUnit 5는 기존 어노테이션의 이름을 직관적으로 바꾸고 새로운 기능을 추가했습니다[7].
JUnit 4 | JUnit 5 | 설명 |
---|---|---|
@BeforeClass |
@BeforeAll |
클래스의 모든 테스트 실행 전 한 번 실행 (static 메서드여야 함) |
@AfterClass |
@AfterAll |
클래스의 모든 테스트 실행 후 한 번 실행 (static 메서드여야 함) |
@Before |
@BeforeEach |
각 테스트 메서드 실행 전에 실행 |
@After |
@AfterEach |
각 테스트 메서드 실행 후에 실행 |
@Ignore |
@Disabled |
특정 테스트를 비활성화 |
@Category |
@Tag |
테스트를 그룹화하고 필터링 |
@RunWith / @Rule |
@ExtendWith |
확장 기능을 등록하는 통합된 방식 |
4. 모범 사례: JUnit 5 제대로 활용하기
패턴 | 장점 | 주의점 |
---|---|---|
모듈식 아키텍처 활용 | Vintage 엔진 제외 등 불필요한 의존성을 줄여 가볍고 빠른 테스트 환경 구축 가능. 유연성과 유지보수성 향상[6][7]. |
JUnit 4에 비해 초기 설정이 조금 더 복잡하게 느껴질 수 있음. |
public 접근 제어자 생략 |
테스트 코드가 외부에 노출될 필요가 없으므로 더 깔끔하고 캡슐화된 코드 작성이 가능함[7]. | JUnit 4 방식에 익숙한 팀원에게는 컨벤션 공유가 필요함. |
확장 모델 @ExtendWith 사용 |
@RunWith , @Rule 로 분산되어 있던 확장 기능을 일관된 방식으로 관리. 서드파티 라이브러리(Mockito, Spring 등) 통합이 명확하고 강력해짐[7]. |
새로운 확장 모델 API에 대한 학습이 필요함. |
5. 마치며
JUnit 5는 단순한 버전 업그레이드를 넘어, 테스트 패러다임의 전환을 이끌고 있습니다.
✨ 오늘 배운 점 3줄 요약
- JUnit 5는
Platform
,Jupiter
,Vintage
의 모듈식 구조로 분리되어 유연하고 확장 가능한 테스트 환경을 제공한다[5][7]. - Java 8+의 기능을 적극 활용하며,
@DisplayName
,@Nested
등 표현력 높은 어노테이션으로 가독성 좋은 테스트를 작성할 수 있다[7]. @ExtendWith
라는 일관된 확장 모델을 통해 서드파티 라이브러리 통합과 커스텀 기능 구현이 매우 용이해졌다[7].
🚀 실제 프로젝트 적용 팁
기존 JUnit 4 프로젝트를 마이그레이션할 때, JUnit Vintage
엔진 덕분에 기존 테스트를 그대로 유지한 채 새로운 JUnit 5 테스트를 점진적으로 추가할 수 있습니다. 부담 없이 지금 바로 시작해보세요[3][5]!
이 글이 여러분의 테스트 코드 퀄리티를 한 단계 높이는 데 도움이 되었기를 바랍니다.
❤️ 하트와 댓글은 더 좋은 글을 쓰는 데 큰 힘이 됩니다!
참고자료
- 공식 문서: JUnit 5 User Guide [5]
- 샘플 레포: JUnit 5 GitHub Repository [11]
- 추가 읽을거리
- JUnit 5 공식 홈페이지 [1][12]
- Spring Boot 환경에서 JUnit 5 이해하기 [4]
- JUnit 5 vs JUnit 4 주요 차이점 비교 [7]
[1] https://junit.org
[2] https://wecandev.tistory.com/168
[3] https://donghyeon.dev/junit/2021/04/11/JUnit5-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/
[4] https://adjh54.tistory.com/341
[5] https://junit.org/junit5/docs/current/user-guide/
[6] https://delftswa.gitbooks.io/desosa-2017/content/junit5/chapter.html
[7] https://dev-handbook.tistory.com/54
[8] https://kangyb.tistory.com/32
[9] https://velog.io/@jaehoonlee/JUnit-5-%EA%B3%B5%EC%8B%9D-%EA%B0%80%EC%9D%B4%EB%93%9C-%EB%AC%B8%EC%84%9C-%EC%A0%95%EB%A6%AC
[10] https://gmlwjd9405.github.io/2019/11/26/junit5-guide-basic.html
[11] https://github.com/junit-team/junit5
[12] https://junit.org/junit5/
[13] https://junit.org/junit5/docs/5.10.1/user-guide/junit-user-guide-5.10.1.pdf
[14] https://www.youtube.com/watch?v=qKz9wvgcaOs
[15] https://www.youtube.com/watch?v=AHeQntGPCHE
[16] https://github.com/junit-team/junit5/milestone/68?closed=1
[17] https://www.youtube.com/watch?v=JnR2VoTw-sY