Dev 달팽이 @_''

Java - JUnit 5 본문

Java - JUnit 5

JUnit 5

  • 자바 개발자가 가장 많이 사용하는 테스팅 프레임워크
  • 자바 8 이상 필요
  • 대체제 : TestNG, Spock, ...

  • JUnit Platform : 테스트를 실행해주는 런치 제공. TestEngine API 제공.
  • Jupiter : TestEngine API 구현체로 JUnit 5를 제공.
  • Vintage : JUnit 4와 3을 지원하는 TestEngine 구현체

기본 애노테이션

  • @Test

Delivery.java

public class Delivery {

    private DeliveryStatus status = DeliveryStatus.DRAFT;
    private int limitArea;


    public Delivery() {
    }
    public Delivery(int limitArea) {
        this.limitArea = limitArea;
    }

    public DeliveryStatus getStatus() {
        return status;
    }

    public int getLimitArea() {
        return limitArea;
    }
}

DeliveryStatud.java

public enum DeliveryStatus {
    DRAFT, RIDING,COMPLETED
}

DeliveryTest.java

@Test
void delivery_test(){
	Delivery delivery = new Delivery();
	assertNotNull(delivery);
}

  • BeforeAll/AfterAll
    • 모든 테스트가 실행하기 전에 딱 한번만 호출
    • 반드시 static으로 선언하고, return type이 존재하면 안됨
    • static void
    @Test
    void delivery_test(){
        Delivery delivery = new Delivery();
        assertNotNull(delivery);
    }

    @Test
    void delivery_test2(){
        Delivery delivery = new Delivery();
        assertNotNull(delivery);
    }

    @BeforeAll
    static void beforeAll(){
        System.out.println("beforeAll");
    }

    @AfterAll
    static void afterAll(){
        System.out.println("afterAll");
    }

  • BeforeEach/AfterEach
    • 모든 테스트를 실행할 때 한번씩 실행
    • 반드시 static일 필요없음
    @BeforeEach
    void beforeEach(){
        System.out.println("beforeEach");
    }

    @AfterEach
    void afterEach(){
        System.out.println("afterEach");
    }

  • Disabled
    • 테스트하고 싶지 않을 경우 사용
    @Test
    void delivery_test(){
        Delivery delivery = new Delivery();
        assertNotNull(delivery);
    }

    @Test
    @Disabled
    void delivery_test2(){
        Delivery delivery = new Delivery();
        assertNotNull(delivery);
    }

테스트 이름 표기

  • @DisplayNameGeneration
    • Method와 Class 레퍼런스를 사용해서 테스트 이름을 표기하는 방법 설정
    • 기본 구현체로 ReplaceUnderscores 제공
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class DeliveryTest {

    @Test
    void delivery_test(){
        Delivery delivery = new Delivery();
        assertNotNull(delivery);
    }

    @Test
    void delivery_test2(){
        Delivery delivery = new Delivery();
        assertNotNull(delivery);
    }

  • @DisplayName
    • 어떤 테스트인지 테스트 이름을 보다 쉽게 표현할 수 있는 방법을 제공하는 어노테이션
    • @DisplayNameGeneration 보다 우선순위가 높다
    @Test
    @DisplayName("배달 테스트1")
    void delivery_test(){
        Delivery delivery = new Delivery();
        assertNotNull(delivery);
    }

    @Test
    @DisplayName("배달 테스트2")
    void delivery_test2(){
        Delivery delivery = new Delivery();
        assertNotNull(delivery);
    }

Assertion

  • assertEquals(expected,actual)
    • 실제 값이 기대한 값과 같은지 확인
    @Test
    @DisplayName("배달 테스트1")
    void delivery_test(){
        Delivery delivery = new Delivery();
        assertEquals(DeliveryStatus.DRAFT,delivery.getStatus());
    }

  • assertTrue(boolean)
    • 다음 조건이 참인지 확인
    @Test
    @DisplayName("배달 테스트1")
    void delivery_test(){
        Delivery delivery = new Delivery(-10);
        assertTrue(delivery.getLimitArea()>0,"배달 거리는 0이상 이어야합니다.");
    }

  • 그 밖에
    • assertAll(executables...) : 모든 확인 구문 확인
    • assertThrows(expectedType, executable) : 예외 발생 확인
    • assertTimeout(duration, executable) : 특정 시간 안에 실행이 완료되는지 확인
  • 마지막 매개변수로 Supplier<String> 타입의 인스턴스를 람다 형태로 제공할 수 있음
    • 복잡한 메시지를 생성해야 하는 경우 사용하면 실패한 경우에만 해당 메시지를 만들게 할 수 있음
  • AssertJ, Hemcrest, Trust 등의 라이버리를 사용할 수도 있음.