본문 바로가기

JUnit (Test)

JUnit5 이 무엇입니까?

 

JUnit

  • JUnit4 로 작성된 테스트코드가 5에서 안돌아가면 이상할 것이다. 그래서 vintage-engine 을 만들어 JUnit4 로 작성한 코드를 돌릴 수 있다.
  • jupiter-api : JUnit5 로 작성할 수 있는 테스트들의 API 가 들어 있다.
  • jupiter-engine : jupiter 기반으로 작성된 테스트 케이스를 JUnit Platform 에서 실행시키기 위한 테스트 엔진
  • JUnit Platform : JVM 테스팅 프레임워크를 실행시키기 위한 기반 모듈. 테스트를 발견하고 테스트 계획을 생성하는 인터페이스를 정의하고 있다. 그 구현체가 engine 들 이다.

의존설정

  • 자세한 의존설정 방법은 인터넷에 많이 나와 있으니 생략
  • 모듈들을 불러오기 위해 의존설정을 해줘야 한다.
  • Springboot 프로젝트를 생성할 때, spring-boot-starter-test 의존성에는 JUnit5 를 포함해서 AssertJ, Mockito, Hamcrest 등 테스트 모듈이 포함되어 있기 때문에 JUnit5 를 사용 가능하다.

각 의존성의 아티펙트 아이디에 대한 정보는

awayday.github.io/2017-10-29/junit5-02/

 

이분이 정말 정리를 잘 해 놓으신 것 같다. 읽어보면 좋다.

 

어노테이션

어노테이션 설명 JUnit 4 와 대응
@Test 해당 메서드가 테스트 메서드임을 표현. JUnit4와 달리 인자를 필요로 하지 않는다.
다음부터 나올 자체적인 어노테이션이 존재하기 떄문이다.
 
@ParameterizedTest 해당 메서드가 인자를 제공받는 테스트 메서드임을 나타낸다.  
@RepeatedTest 해당 메서드가 반복 테스트를 위한 템플릿임을 나타낸다.  
@TestFactory 해당 메서드가 동적 테스트수행을 위한 팩토리임을 나타낸다.  
@TestInstance 테스트 클래스의 생명주기 를 설정하기 위해 사용한다.  
@DisplayName 클래스나 메서드에 붙인다. 보여질 이름을 설정할 수 있다.  
@BeforeEach 현재 클래스에 속한 모든 테스트 메서드의 테스트 시행 전마다  해당 메서드를 실행. @Before
@AfterEach 현재 클래스에 속한 모든 테스트 메서드의 테스트 시행 후마다  해당 메서드를 실행. @After
@BeforeAll 현재 클래스의 어떤 메서드도 실행하지 않은 상태에서 해당 메서드를 실행. 클래스 단위 생명주기가 설정되지 않았다면 정적 메서드여야 한다. @BeforeClass
@AfterAll 현재 클래스의 모든 메서드를 실행한 후 해당 메서드를 실행. 클래스 단위 생명주기가 설정되지 않았다면 정적 메서드여야 한다. @AfterClass
@Nested 해당 클래스가 다른 클래스 내부에 선언되어 있으며, 정적 클래스가 아님을 뜻함.  
@Tag 클래스나 메서드에 사용할 태그를 지정하기 위한 어노테이션  
@Disabled 이 테스트를 사용하지 않음을 나타냄 @Ignore
@ExtendWith 테스트를 확장하기 위해 사용  

 

 

Assertion

assertTrue(boolean condition) { /* compiled code */ }

assertTrue(boolean condition, java.util.function.Supplier<java.lang.String> messageSupplier) { /* compiled code */ }

assertTrue(java.util.function.BooleanSupplier booleanSupplier) { /* compiled code */ }

assertTrue(java.util.function.BooleanSupplier booleanSupplier, java.lang.String message) { /* compiled code */ }

assertTrue(boolean condition, java.lang.String message) { /* compiled code */ }

assertTrue(java.util.function.BooleanSupplier booleanSupplier, java.util.function.Supplier<java.lang.String> messageSupplier) { /* compiled code */ }

외에도 수많은 오버로딩 함수들이 있다.

 

    @DisplayName("람다테스트")
    @Test
    public void test() {
        int sum = Arrays.asList(1, 2, 3).stream()
            .mapToInt(integer -> integer)
            .sum();
        assertEquals(sum , 5);
    }

  • assertTrue
  • assertFalse
  • assertNull
  • assertNotNull
  • assertEquals
  • assertNotEquals
  • assertArrayEquals

 

오버로딩된 함수들을 보면 Supplier<String> messageSupplier 인수를 가진 메서드들이 있는데, 인수에

() -> "~" 형식으로 하면 테스트 실패 시에 로그에 그 문자열을 출력한다. 처음 알았다.

 

 

예외 테스트

    @Test
    public void 예외_테스트() {
        assertThrows(NumberFormatException.class, () -> Integer.valueOf(""));
    }

만약 사용자 설정 예외이고, 예외 메세지를 설정하였고, 메세지도 테스트하고 싶다면 다음과 같이 한다.

    public void throwException() {
        throw new IllegalArgumentException("Not available");
    }

    @Test
    void shouldThrowException() {
        Exception exception = assertThrows(IllegalArgumentException.class, () -> throwException());
        assertEquals(exception.getMessage(), "Not available");
    }

 

 

 

 

참고:

javacan.tistory.com/entry/JUnit-5-Intro

awayday.github.io/2017-11-11/junit5-04/

kils-log-of-develop.tistory.com/349

'JUnit (Test)' 카테고리의 다른 글

@TestMethodOrder  (0) 2021.01.31
JUnit 의 @TestInstance  (0) 2021.01.31
JUnit 5 새로 배운 것  (0) 2021.01.30
Exception 테스트하기  (0) 2020.12.06
private 메소드 테스트  (0) 2020.12.06