JUnit 5 (JUnit 4와 비교)
Clean Software/Testing

JUnit 5 (JUnit 4와 비교)

728x90
반응형

JUnit5 란?

JUnit이란?

더보기

JUnit은 자바 프로그래밍 언어용 유닛 테스트 프레임워크이다. JUnit은 테스트 주도 개발 면에서 중요하며 SUnit과 함께 시작된 XUnit이라는 이름의 유닛 테스트 프레임워크 계열의 하나이다.
JUnit은 컴파일 타임에 JAR로서 링크된다. 프레임워크는 JUnit 3.8 이하의 경우 junit.framework 패키지 밑에 상주하며, JUnit 4 이상의 경우 org.junit 패키지 밑에 상주한다.
깃허브에 호스팅된 10,000개 자바 프로젝트를 대상으로 한 2013년 수행된 연구 조사에 따르면 JUnit(slf4j-api과 연결된)은 가장 흔히 포함시킨 외부 라이브러리였다. 각 라이브러리는 프로젝트 가운데 30.7%에 사용되었다.

(위키백과 참고)

 

JUnit 5에서는 테스트 작성자를 위한 API 모듈과 테스트 실행을 위한 API가 분리되어 있습니다. 
예를 들어, JUnit Jupiter는 테스트 코드 작성에 필요한 junit-jupiter-api 모듈과 테스트 실행을 위한 junit-jupiter-engine 모듈로 분리되어 있습니다. 

 

 


Supported Java Version

JUnit4 JUnit5
Java 5 이상 Java 8 이상
(Android Gradle Plugin 3.2.0 , Gradle 4.7 이상)

 

 


Architecture

JUnit4 JUnit5
All in one JUnit Platform
JUnit Jupiter
JUnit Vintage

 

 

JUnit 5 
= JUnit Platform JUnit JupiterJUnit Vintage

출처: Architectural building blocks of JUnit 5 책


JUnit 플랫폼

  • JVM에서 테스트 프레임 워크를 시작하기위한 기반 역할을합니다. 또한 플랫폼에서 실행되는 테스트 프레임 워크를 개발하기위한 TestEngine API를 정의합니다.
  • 명령 줄에서 플랫폼을 시작하는 Console Launcher와 JUnit 4 기반 환경의 플랫폼에서 모든 TestEngine을 실행하기위한 JUnit 4 기반 Runner를 제공합니다.
  • JUnit 플랫폼에 대한 최고 수준의 지원은 인기있는 IDE (IntelliJ IDEA, Eclipse, NetBeans 및 Visual Studio Code 참조) 및 빌드 도구 (Gradle, Maven 및 Ant 참조)에도 있습니다.

JUnit Jupiter 

  • JUnit 5에서 테스트 및 확장을 작성하기위한 새로운 프로그래밍 모델과 확장 모델의 조합입니다.
  • Jupiter 하위 프로젝트는 플랫폼에서 Jupiter 기반 테스트를 실행하기위한 TestEngine을 제공합니다.

JUnit Vintage

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

lifecycle call-back annotations

JUnit4 JUnit5
@BeforeClass @AfterClass @BeforeAll @AfterAll
@Before @After @BeforeEach @AfterEach
@Ignore @Disable
@Catefory @Tag

@Before (JUnit 4) / @ BeforeEach (JUnit 5) 

  • 테스트 클래스의 각 테스트 메서드를 실행하기 전에 실행됩니다.
  • 이 주석은 각 테스트를 시작하기 직전에 리소스 또는 테스트 데이터를 설정하려는 경우에 사용할 수 있습니다.
  • 예를 들어, JUnit 테스트 클래스에 5 개의 테스트 케이스가있는 경우 @ Before / @ BeforeEach로 주석이 달린 메소드는 각 테스트 케이스가 실행되기 전에 5 번 실행됩니다.

@After (JUnit 4) / @ AfterEach (JUnit 5) 

  • 테스트 클래스의 각 테스트 메소드가 실행 된 후에 실행됩니다.
  • 이 주석은 각 테스트 케이스가 실행 된 후 사용 된 리소스 또는 테스트 데이터를 해제해야 할 때 사용할 수 있습니다.
  • 예를 들어 JUnit 테스트 클래스에 5 개의 테스트 케이스가있는 경우 @ After / @ AfterEach로 주석이 달린 메소드는 테스트 케이스가 실행 된 후 5 번 실행됩니다.

@BeforeClass (JUnit 4) / @ BeforeAll (JUnit 5) 

  • 테스트 클래스의 모든 테스트 메서드가 실행되기 전에 실행됩니다.
  • 이 주석은 리소스를 설정하거나 클래스 수준에서 데이터를 테스트하려는 경우에 사용할 수 있습니다.
  • 이 메서드는 @ BeforeClass / @ BeforeAll로 주석 처리되므로 테스트 클래스에 대해 한 번만 실행되고 메서드의 복사본은 클래스 전체에서 공유되며 메서드는 정적으로 지정 되어야합니다 .
  • 예를 들어, JUnit 테스트 클래스에 5 개의 테스트 케이스가있는 경우 @ BeforeClass / @ BeforeAll로 주석이 달린 메소드는 테스트 케이스가 시작되기 전에 테스트 클래스 당 한 번 실행됩니다.

@AfterClass (JUnit 4) / @ AfterAll (JUnit 5)

  • 테스트 클래스의 모든 테스트 메서드가 실행 된 후에 실행됩니다.
  • 이 주석은 사용 된 리소스 또는 테스트 데이터를 클래스 수준에서 해제하려는 경우에 사용할 수 있습니다.
  • 이 메서드는 @ AfterClass / @ AfterAll로 주석 처리되어 테스트 클래스에 대해 한 번만 실행되고 메서드의 복사본이 클래스 전체에서 공유되므로 메서드는 정적으로 지정 되어야합니다 .
  • 예를 들어, JUnit 테스트 클래스에 5 개의 테스트 케이스가있는 경우 @ AfterClass / @ AfterAll로 주석이 달린 메소드는 모든 테스트 케이스가 실행을 완료 한 후 테스트 클래스 당 한 번씩 실행됩니다.

@Test (JUnit 4 및 JUnit 5)

  • @Test 어노테이션은 JUnit 4와 JUnit 5에 공통입니다. 어노테이션이있는 메소드는 클래스의 테스트 케이스를 나타냅니다.
  • JUnit 클래스에서 각각 @Test로 주석이 달린 여러 메소드가있을 수 있습니다. 이는 클래스에 여러 테스트 케이스가있을 수 있음을 의미합니다.
  • 테스트 할 수있는 여러 속성 또는 매개 변수가 있습니다. 테스트 케이스에 대한 강제 제한 시간을 추가하거나 예외를 추가 할 수 있습니다. 이에 대해서는 별도의 자습서에서 자세히 다룹니다.
  • 어노테이션이있는 메소드는 개인용이거나 정적 일 수 없으며 값을 리턴 할 수 없습니다.
  • @Test 메소드는 JUnit 4에서 public으로 선언되어야하며 Junit 5는 기본적으로 'no access modifier'를 'public'으로 간주하므로 액세스 수정 자 'public'없이 정의 된 테스트 케이스를 허용합니다.

 

 

 

 

 

커피 자판기를lifecycle call-back annotations를 적용하여 테스팅 하는 예시

 

아래와 기능들이 있다고 가정했을 때

machineReady() 기계를 켜기 전에 물, 우유 및 커피 원두를 사용할 수 있는지 확인 하는 함수
startMachine()은 기계에 새 종이컵을 넣고 기계를 키는 함수
HotWater()옵션 을 확인하는 TEST CASE
Capuccino()옵션 을 확인하는 TEST CASE
ExpressoCoffee()옵션 을 확인하는 TEST CASE
throwCup () 사용한 컵을 쓰레기통에 버리는 또 다른 함수
throwTrashandSwitchOff ()트레이에서 넘쳐나는 폐액을 대야로 버리고 기계를 끄는 함수

 

위 기능들을 lifecycle에 따라 정리하면 다음과 같습니다. 

  • startMachine()함수는 모든 TEST CASE(HotWater(), Capuccino() 및 ExpressoCoffee())가 실행되기 전에 실행
  • throwCup() 함수는 각각의 모든 TEST CASE가 실행된 후에 실행
  • machineReady()와 throwTrashandSwitchOff() 딱 한 번만 실행되는 클래스 수준의 함수 : machineReady () 클래스가 실행을 시작시 한번, throwTrashandSwitchOff ()함수는 모든 테스트 케이스가 실행을 완료 한 후 한 번 실행

 


추가 Annotations 설명

@TestMethodOrder & @Order
(JUNIT 4 : @FixMethodOrder)

  • 테스트 클래스 내에서 메서드의 실행 순서를 선택할 수 있습니다.


@ExtendWith
(JUNIT 4 : @Rule & @ClassRule)

  • @Rule – 주석은 테스트 케이스에 특정 규칙을 적용하는 데 도움이되는 TestRule 클래스에서 확장됩니다.
  • 예 : 테스트 케이스 실행 전 임시 폴더 생성 및 실행 후 폴더 삭제는 Rule을 통해 설정할 수 있습니다.
  • @Rule은 JUnit 5 Vintage에서 사용할 수있는 JUnit 4에서만 사용할 수 있지만 @ExtendWith는 JUnit 5에 더 가까운 기능을 제공합니다 . 마찬가지로 @Rule을 사용하여 글로벌 타임 아웃을 설정할 수 있습니다.


@TestFactory
(JUNIT 4 : x)

  • JUnit 5에서만 지원되며 동적 또는 런타임 테스트 생성에 도움이됩니다.
  • 데이터 스트림을 컬렉션으로 반환하며 수명주기 콜백 주석을 사용할 수 없습니다

 

@Nested
(JUNIT 4 : x)

  • JUnit Jupiter에서만 지원됩니다.
  • 중첩 된 테스트 케이스를 생성하는 데 도움이됩니다.
  • 예를 들어, 테스트 케이스 1이있는 클래스 1에는 테스트 케이스 2가있는 @Nested 클래스 2가있을 수 있습니다. 이렇게하면 테스트 케이스 2가 테스트 케이스 1에 대한 중첩 테스트 케이스가됩니다. 따라서 테스트 케이스 1이 실행 된 다음 테스트 케이스 2가 실행됩니다.
  • @Nested 주석을 사용하지 않으면 중첩 된 클래스가 실행되지 않습니다.


@Tag
(JUNIT 4 : @Category)

  • 테스트에 태그를 지정하고 필터링하는 데 도움이됩니다.
  • 실행할 테스트를 포함하거나 해당 카테고리에 따라 필터링하여 제외 할 수 있습니다.


@ParameterizedTest and @ValueSource
(JUNIT 4 : @RunWith(Parameterized.class)@Parameterized  .Parameters)

  • 테스트 데이터 변형이있는 메소드를 여러 번 실행하는 데 사용됩니다.
  • JUnit 4는 @RunWith 및 @Parameters를 지원하는 반면 JUnit 5 Jupiter는 @ValueSource와 함께 @ParameterizedTest를 지원합니다.


@RepeatedTest
(JUNIT 4 : x)

  • JUnit 5는 @RepeatedTest 주석을 사용하여 일정 횟수 동안 테스트 메서드의 반복 실행을 지원합니다.


@DisplayName
(JUNIT 4 : x)

  • 사용자 정의 이름을 표시 목적으로 테스트 메서드 또는 클래스에 지정할 수 있습니다.


@TestInstance (LifeCycle.PER_CLASS) and @TestInstance (LifeCycle.PER_METHOD)

(JUNIT 4 : x)

  • JUnit 5는 테스트 라이프 사이클 구성을 지원합니다.
  • JUnit 4와 5는 모두 기본 메소드 라이프 사이클 콜백을 따르며 클래스 별 구성도 수행 할 수 있습니다.

Assertions

 

JUnit4 JUnit5
- Assert Class
- Optional assertion message is the first parameter
- Assertions class
- Optional assertion message is the last parameter
- assertThat method 없음
- New methods : assertAll, assertThrows

 


gradel 설정

 

buildscript {
    dependencies {
        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.1'
    }
}
plugins {
    id 'org.junit.platform.gradle.plugin'
}
...
android {
 ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

}
...
dependencies {
    // for junit5
    // (Required) Writing and executing Unit Tests on the JUnit Platform
    testImplementation "org.junit.jupiter:junit-jupiter-api:5.5.2"
    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.5.2"
    // (Optional) If you need "Parameterized Tests"
    testImplementation "org.junit.jupiter:junit-jupiter-params:5.5.2"
    // (Optional) If you also have JUnit 4-based tests
    testImplementation "junit:junit:4.12"
    testRuntimeOnly "org.junit.vintage:junit-vintage-engine:5.5.2"


}

 

 

 

 


My First JUnit5 Test code

 

 

 

 

 

 

 

참고

Junit 5 User Guide(영어) 공식문서

www.softwaretestinghelp.com/junit-annotations-tutorial/

www.luxoft-training.com/news/junit-5-usage-and-first-test/

 

 

 

728x90
반응형