본문 바로가기
DevOps/Tools

[JUnit] JUnit 5 vs JUnit 4, JUnit Version 4, 5 차이점

by breezyday 2022. 6. 9.

JUnit을 공부하고 나서 마지막으로 테스트하던 항목 가운데 Test Suites 부분에서 계속 오류가 발생해서 해결 방법을 찾다가 찾게 된 글입니다. JUnit Version 4와 Version 5의 차이점을 항목별로 비교해 놓았고, 제가 원하는 내용도 포함하고 있어서 읽어보다가 괜찮다는 생각이 들어 간단히 정리 겸 번역을 해두었습니다.


JUnit 5는 Java8 스타일의 코딩을 적용하고 JUnit 4 보다 강력하고 유연하게 만드는 것을 목표로 합니다. 이 글은 JUnit 5와 JUnit 4의 주요 차이점을 설명하고 있습니다.

 

1. Annotations 차이점

JUnit 4와 JUnit 5의 대부분의 Annotation은 동일하지만 몇 가지는 다릅니다.

아래 표에 두 버전 간에 달라진 점을 비교하였습니다. 

 

JUnit 4 JUnit 5 설명
@Test @Test 테스트 메소드 선언
@BeforeClass @BeforeAll 현재 클래스의 모든 테스트 메서드보다 먼저 실행
@AfterClass @AfterAll 현재 클래스의 모든 테스트 메서드 실행 후 실행
@Before @BeforeEach 각 테스트 메서드 전에 실행
@After @AfterEach 각 테스트 메서드 후에 실행
@Ignore @Disabled 테스트 메서드/클래스 비활성화
NA @TestFactory 동적 테스트를 위한 테스트 팩토리
NA @Nested 중첩 테스트
@Category @Tag 태깅(Tagging) 및 필터링(Filtering)
NA @ExtendWith 사용자 정의 확장 등록

 

2. JUnit 5와 JUnit 4의 차이점

2.1 Architecture

JUnit 4는 모은 것이 하나의 Jar 파일에 번들로 포함되어 있습니다.

JUnit 5JUnit Platform, JUnit Jupiter 그리고 JUnit Vintage3가지 하위 프로젝트로 구성됩니다. 

 

  • JUnit Platform
    - Platform에서 실행되는 새로운 테스트 프레임워크를 개발하기 위한 TestEngine API를 정의하고 있습니다.
  • JUnit Jupiter
    - 새로운 Annotation으로 작성된 테스트를 실행하기 위한 JUnit annotations와 TestEngine을 제공합니다.
  • JUnit Vintage
    - JUnit 5 플랫폼에서 JUnit 3, JUnit 4로 작성하고 실행할 수 있도록 지원합니다.

2.2 JDK 요구사항

  • JUnit 4 - Java5 이상
  • JUnit 5 - Java8 이상

2.3 Assertions

JUnit 4에서 org.junit.Assert 에는 예상 결과와 결과를 검증하는 모든 assert 메서드가 있습니다.

메서드에서 첫 번째 인수오류 메시지에 대한 추가 매개 변수를 사용할 수 있습니다.

 

public static void assertEquals(long expected, long actual)
public static void assertEquals(String message, long expected, long actual)

 

JUnit 5에서 org.junit.jupiter.Assertions 에는 asserrtThrows() assertAll()와 같은 추가 메서드와 함께 대부분의 assert() 메서드를 담고 있습니다. 그리고 오류 메시지에 대한 추가 매개변수는 마지막에 있습니다.

JUnit 5 assertion 메서드에는 테스트가 실패한 경우 인쇄할 구문 분석 오류 메시지를 지원하는 오버 로드된 메서드도 있습니다. 

 

public static void assertEquals(long expected, long actual)
public static void assertEquals(long expected, long actual, String message)
public static void assertEquals(long expected, long actual, Supplier messageSupplier)

 

2.4 Assumptions

JUnit 4에서 org.junit.Assume 에 테스트가 의미 있는 조건에 대한 가정을 명시하는 메서드가 포함되어 있습니다. 다음의 5가지 방법을 제공합니다.

 

  1. assumeFalse()
  2. assumeNoException()
  3. assumeNotNull()
  4. assumeThat()
  5. assumeTrue()

 

JUnit 5에서 org.junit.jupiter.api.Assumptions 에 테스트가 의미 있는 조건에 대한 가정을 명시하는 메서드가 포함되어 있습니다. 다음의 3가지 방법을 제공합니다.

 

  1. assumeFalse()
  2. assumingThat()
  3. assumeTrue()

2.5 Tagging and Filtering

  • JUnit 4 - @Category 사용
  • JUnit 5 - @Tag 사용

2.6 Test Suites

JUnit 4는, @RunWith와 @Suite를 사용합니다.

 

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
	TestJUnit1.class,
	TestJUnit2.class
})
public class JUnit4Example
{
}

 

JUnit 5는, @Suite, @SelectPackages@SelectClasses 사용합니다.

 

import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.runner.RunWith;

@Suite
@SelectPackages("com.mycom.junit5.examples")
public class JUnit5Example
{
}

 

import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.SuiteDisplayName;

@Suite
@SuiteDisplayName("My Suites Test")
@SelectClasses({
	TestJUnit1.class,
	TestJUnit2.class
})
public class JUnit5TestSuite {
}

 

2.7 Non-public Test Methods 허용

JUnit 5에서는 테스트 클래스테스트 메서드를 public으로 하지 않아도 됩니다. 이제 package protected로 만들 수 있습니다. JUnit은 내부적으로 리플렉션을 사용하여 테스트 클래스와 테스트 메서드를 찾습니다. 리플렉션은 가시성이 제한된 경우에도 이를 찾을 수 있으므로 public으로 설정할 필요가 없습니다.

 

JUnit의 테스트 클래스는 파라미터도 있는 non-public 생성자를 가질 수 있습니다. 즉 JUnit 5에서는 기본 생성자가 필수가 아닙니다.

 

class AppTest {
    private AppTest(TestInfo testInfo) {
        System.out.println("Working on test " + testInfo.getDisplayName());
    }

   @Test
    void test(){
        assertTrue(true);
    }
}

 

2.8 3rd Party Integration

JUnit 4에서는 타사 플러그인 및 IDE에 대한 통합 지원이 없습니다. 오직 Java Reflection을 사용할 수 있습니다.

 

JUnit 5에서는 이러한 목적을 위한 전용 하위 프로젝트, JUnit Platform을 사용합니다. 플랫폼에서 실행되는 테스트 프레임워크를 개발하기 위한 TestEngine API를 제공합니다. 

 

 

 

 

출처

https://howtodoinjava.com/junit5/junit-5-vs-junit-4/

 

 

 

 

 

댓글