300===Dev Framework/Junit

🧪JUnit 5 - 소프트웨어 품질 보증의 핵심 도구

블로글러 2024. 5. 28. 22:54
  _______       _   _         _____
 |__   __|     | | (_)       |  __ \
    | |  _   _ | |_ _  _ __  | |  | |  __ _  _ __
    | | | | | || __|| || '_ \ | |  | | / _` || '__|
    | | | |_| || |_ | || | | || |__| || (_| || |
    |_|  \__,_| \__||_||_| |_||_____/  \__,_||_|

 

코드를 짜는 것만큼이나 중요한 테스트 코드 작성, 다들 어떻게 하고 계신가요? 저도 JUnit 4로 테스트를 시작했지만, 반복되는 보일러플레이트 코드와 제한적인 기능에 아쉬움을 느낄 때가 많았습니다. "더 깔끔하고 강력하게 테스트를 짤 순 없을까?" 하는 고민 끝에 JUnit 5를 만났고, 그야말로 신세계를 경험했습니다.

왜 다들 JUnit 5를 '차세대 표준'이라고 부를까요? 이 글을 다 읽고 나면 여러분도 그 이유를 명확히 알게 될 겁니다.

 

TL;DR

  • JUnit 5는 모듈식 구조로 필요한 기능만 조합해 유연성과 확장성을 극대화했습니다[7].
  • Java 8+의 최신 기능을 활용하여 더 직관적이고 강력한 테스트 코드 작성이 가능합니다[4][7].

목차

  1. 배경: 왜 JUnit 5인가?
  2. 핵심 개념: JUnit 5를 구성하는 세 기둥
  3. 실습: JUnit 5 기본 테스트 작성하기
  4. 모범 사례: JUnit 5 제대로 활용하기
  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.xmljunit-jupiter-apijunit-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줄 요약

  1. JUnit 5는 Platform, Jupiter, Vintage의 모듈식 구조로 분리되어 유연하고 확장 가능한 테스트 환경을 제공한다[5][7].
  2. Java 8+의 기능을 적극 활용하며, @DisplayName, @Nested 등 표현력 높은 어노테이션으로 가독성 좋은 테스트를 작성할 수 있다[7].
  3. @ExtendWith라는 일관된 확장 모델을 통해 서드파티 라이브러리 통합과 커스텀 기능 구현이 매우 용이해졌다[7].

🚀 실제 프로젝트 적용 팁

기존 JUnit 4 프로젝트를 마이그레이션할 때, JUnit Vintage 엔진 덕분에 기존 테스트를 그대로 유지한 채 새로운 JUnit 5 테스트를 점진적으로 추가할 수 있습니다. 부담 없이 지금 바로 시작해보세요[3][5]!

 

이 글이 여러분의 테스트 코드 퀄리티를 한 단계 높이는 데 도움이 되었기를 바랍니다.

❤️ 하트와 댓글은 더 좋은 글을 쓰는 데 큰 힘이 됩니다!


참고자료

  • 공식 문서: JUnit 5 User Guide [5]
  • 샘플 레포: JUnit 5 GitHub Repository [11]
  • 추가 읽을거리
    1. JUnit 5 공식 홈페이지 [1][12]
    2. Spring Boot 환경에서 JUnit 5 이해하기 [4]
    3. 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

728x90
반응형