Notepad
article thumbnail
Published 2020. 11. 22. 22:35
JUnit 5 dev/기타

JUnit5 개발 배경

  • 오픈 소스 테스트 프레임워크인 JUnit4는 돈을 받지 않는 오픈 소스 특성상 결함도 많이 쌓여 있고
  • Java 8의 기능 지원이 언제 된다는 희망이 안보임
  • 결국 JUnit 핵심 커미터들과 몇 명의 개발자들이 뭉처 크라우드 펀딩과 함께 JUnit5 개발에 대해 제안함

JUnit4의 문제점

  • 테스트 클래스에 하나의 Runner만을 가질 수 있음(확장성 떨어짐)
  • 모든 테스트 케이스가 사전에 알려저야 하기에 동적인 테스트 테스트 케이스 생성이 불가
  • IDE와 빌드 툴이 JUnit의 내부와 밀접하게 연결되어 있고 JUnit의 변경에 따라 IDE도 변경되어야 하는 강한 결합도를 가짐

JUnit5의 비전

  • 테스트 정의 및 프로비저닝에서 테스트 실행 및 보고를 분리
  • JUnit의 확장성 재검토
  • 더 나은 Assertion과 테스트 케이스 생성, 테스트 계층 구조화, 비동기 코드 테스트 및 기타 항목 등을 위해
    람다와 스트림, deafult Method와 같은 Java8 기능 사용

JUnit5

이름을 Jupiter로 지은 이유?

  • JUnit4와 구분하기 위한 이름으로 태양계의 5번째 행성인 목성(Jupiter)에서 창안

JUnit5 구조

  • JUnit 5는 이전의 버전과 다르게 3개의 하위 프로젝트 모듈들로 조합
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

1) JUnit Platform(테스트 엔진)

  • JVM에서 테스트 프레임워크를 시작하기 위한 기반 역할
  • 플랫폼에서 실행되는 테스트 프레임워크를 개발하기 위한 TestEngine API를 정의

2) JUnit Jupiter(JUnit5)

  • JUnit 5의 테스트 작성과 확장에 대한 새로운 프로그래밍 모델과 확장 모델의 조합
  • Jupiter를 기반으로 테스트 실행을 위한 테스트엔진 제공

3) JUnit Vintage(이전 버전 호환성 제공)

  • 플랫폼에서 JUnit 3와 JUnit 4 기반 테스트를 실행하기 위한 TestEngine을 제공

JUnit5 기본 어노테이션

  1. @BeforeAll(before : @BeforeClass)
    테스트 클래스 테스트 시작 시 1회 실행
  2. @AfterAll(before : @AfterClass)
    테스트 클래스 테스트 종료 시 1회 실행
  3. @BeforeEach(before : @Before)
    각각의 테스트 케이스의 시작 전 실행
  4. @AfterEach(before : @After)
    각각의 테스트 케이스의 완료 후 실행
  5. @Tag(before : @Category)
    테스트 필터링을 위한 태그 선언
  6. @Disabled(before : @Ignore)
    테스트 클래스 또는 메서드를 비활성화
  7. @DisplayName
    테스트 클래스나 테스트 메서드에 대한 테스트 시 노출될 이름 정의

JUnit5 feature

  • 한글과 스페이스, 이모지, 특수문자도 사용 가능
  • Class와 Method Level 선언이 가능
  • JUnit4는 Test 작성 시 Public으로 작성했어야 하는데 JUnit5에서는 private만 아니면 됨
  • @DisplayNameGeneration을 활용하면 표기 방법을 변경할 수 있음
  • @Nested : 계층 구조의 테스트 작성 가능
  • @ParameterizedTest
    • 여러 개의 테스트 데이터를 매개변수 형태로 쉽고 간편하게 사용 가능
    • 최소 하나의 Source Annotation이 필요
      (Null, Empty, Value, Csv, Enum, Method 등 사용한 형태의 Source 제공)
  • Dynamic Test
    • 기존의 테스트는 컴파일 시점으로 제한 되었지만 런타임 환경으로 생성 및 수행됨
    • 이를 통해 외부 자원을 활용하거나, 랜덤 데이터를 생성하여 활용할 수 있음
  • Parall Execution
    • Class, Method로 테스트 병렬 실행이 가능
    • 설정값을 통해 테스트의 실행에 대한 전략 변경 가능
    • 실제 데이터 동기화는 되지 않고, 각각의 테스트 실행 시점을 조율

JUnit5 & Spring

1) JUnit4 & Spring

  • 하나의 @Runwith만 사용 가능하여 그외의 추가는 @Rule로 확장
  • Spring에서 SpringClassRule과 SpringMethodRule을 제공

2) JUnit5 & Spring

  • @Rule 대신 @ExtendWith을 추가하여 쉽게 사용 가능
  • Spring Framework 5.0 이후로 JUnit5가 통합됨
  • Spring boot 2.2.0 이후로 JUnit5가 기본으로 변경됨

참고 자료 및 출처

https://junit.org/junit5/docs/current/user-guide/

https://github.com/junit-team/junit5-samples

https://docs.gradle.org/current/userguide/java_testing.html#using_junit5

www.indiegogo.com/projects/junit-lambda

if.kakao.com/session/108

profile

Notepad

@Apio

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!