테스트 코드/JUnit5

JUnit 5?

JUnit 5?

JUnit : 자바를 위한 단위테스트 프레임워크

 

JUnit5은 세 가지의 하위 프로젝트, JUnit Platform + JUnit Jupiter + JUnit Vintage 로 구성됩니다.

런타임 시에 Java 8 이상의 버전이 필요하며, 이미 이전버전의 JDK로 컴파일된 코드는 테스트 가능합니다.

 

 

 

JUnit Platform

JVM에서 테스트 프레임워크를 동작시키기 위한 기반을 제공합니다. 

 

테스트 프레임워크를 실행시키기 위한 TestEngine API를 정의하고 있으며 추가적으로 Console Launcher JUnit 4 based Runner를 제공합니다.

 

Console Launcher : Command Line에서 동작하기 위함

JUnit 4 based Runner : JUnit4 기반의 환경에서 TestEngine을 실행하기 위함

 

 

유명 IDE들( IntelliJ IDEA, Eclipse, NetBeans )과 빌드 툴( Gradle, Maven, Ant ) 을 지원합니다.

 

 

JUnit Jupiter

JUnit5에서 테스트Extension들을 작성하기 위한 프로그래밍 모델Extension 모델로 이뤄져 있습니다.

platform에서 Jupiter기반의 테스트들을 동작시키기 위한 TestEngine을 제공합니다.

 

 

JUnit Vintage

JUnit3 JUni4기반의 테스트를 동작시키기 위한 TestEngine을 제공합니다.

 

 

 


 

 

Assertions

 

JUnit Jupiter는 org.junit.jupiter.api.Assertions의 static 메소드를 사용합니다.

Assertions은 테스트 내에서 개발자가 원하는대로 작동하는지 검증하기 위한 메소드들의 집합입니다.

만약 assertion이 실패한다면 AssertionFailedError가 발생하게 됩니다.

 

 

package me.ddings73.inflearnthejavatest;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.time.Duration;

import static org.junit.jupiter.api.Assertions.*;

public class AssertionsTest {

    static String name = "Wurt";

    static int[] arr = {10,20,30,50};

    @Test
    @DisplayName("assertTrue 테스트")
    void assertTrueTest(){
        assertTrue(true);
    }

    @Test
    @DisplayName("assertFalse 테스트")
    void assertFalseTest(){
        assertFalse(false, () -> "람다식을 이용한 메시지 작성을하면 자원을 아낄 수 있습니다.");
    }

    @Test
    @DisplayName("두 값이 동일한지 테스트")
    void assertEqualsTest(){
        long B = 10L;
        assertEquals(10L, B,"B는 10이어야 한다.");
    }

    @Test
    @DisplayName("배열에 대한 assertion 테스트")
    void assertArrayEqualsTest(){
        assertArrayEquals(new int[]{10,20,30,50}, arr,"배열 값은 10,20,30,50 이어야 합니다.");
    }

    @Test
    @DisplayName("다수의 assertion 테스트")
    void assertAllTest(){
        assertAll("assertAll Sample",
                () -> assertEquals("Wurt",name),
                () -> assertArrayEquals(new int[]{10,20,30,50}, arr)
        );
    }

    @Test
    @DisplayName("예외 테스트")
    void assertThrowsTest(){
        assertThrows(ArithmeticException.class, ()->{
            int operand = 255;
            int operator = 0;
            System.out.println(operand / operator);
        });
    }

    @Test
    @DisplayName("시간제한 테스트")
    void assertTimeoutTest(){
        assertTimeout(Duration.ofSeconds(2), ()->Thread.sleep(1000L));
    }

    @Test
    @DisplayName("null 테스트")
    void assertNullTest(){
        String str = null;
        assertNull(str);
        assertNotNull(name);
    }
}

 

더많은 메소드들은 관련문서를 참조해야합니다.

 

Assertions (JUnit 5.7.1 API)

Assert that all supplied executables do not throw exceptions. If any supplied Executable throws an exception (i.e., a Throwable or any subclass thereof), all remaining executables will still be executed, and all exceptions will be aggregated and reported i

junit.org

 

 

 


 

Assumption

 

Assumption은 Assertion와 다르게 검증이 실패하면 테스트 자체를 무시하고 넘어갑니다.

 

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class AssertionsTest {

    static String name = "Wurt";

    static int[] arr = {10,20,30,50};

    @Test
    @Order(1)
    void assumeTest(){
        assumeFalse("Wurt".equals(name), ()-> "Failed");

        assertSame("Wurt", name);
    }

    @Test
    @Order(2)
    void assertTest(){
        assertFalse("Wurt".equals(name));

        assertEquals("Wurt", name);
    }
}

 

 

assert의 경우 개발자가 현재 상황에서 수정을 통하여 검증을 통과할 수 있을 때 사용됩니다.

 

그에 반해 assume테스트 자체가 스킵되고, 어떻게 실패하였는지 자세하게 알려주지 않기 때문에 개발자가 현재 주어진 환경에서 해결할 수 없는 이유로 인하여 테스트를 실행하지 못할 때 사용합니다.