aseertEquals : 실제 값이 기대한 값과 같은지 확인

- 특정 기능을 실행했을경우 반환되는 값이 기대하는 값과 일치하는지 확인할 수 있는 메서드 이다.

    @Test
    @DisplayName("점심추천 만들기")
    void create_lunch() {
        Lunch lunch = new Lunch();
        assertNotNull(lunch); // lunch 가 null이 아닌지 체크
        assertEquals("Complete", lunch.getLunch(), "점심 만들기 성공시 Complete 여야한다."); // getLunch라는 메서드 실행시 Complete 가 반환되는지 체크
    }

- 위와같이 활용할 수 있으며, aseertEquals 사용시에 기대값, 실행함수 두 매개변수 위치가 서로 바뀌어도 동작하지만 API에서 받아주는 순서로는 (기대값, 실행함수, 메시지) 순서이니 유의하며 사용하자 반대로 사용시에 추후 유지보수하는 개발자에게 혼동을 줄 수 있기때문에

 

- 메세지 매개변수 항목에 람다식을 사용할수 있는데 람다식을 사용할 경우에는 문자열 연산을 해당 케이스가 실패했을경우만 하기 때문에 문자열 연산에 들어가는 비용을 최소한으로 줄일 수 있다. (람다식이 아닌 문자열을 그대로 넣어줄경우 실패여부와 관계없이 문자열 연산을 하기 때문에 비용이 많이 소모된다)

    @Test
    @DisplayName("점심추천 만들기")
    void create_lunch() {
        Lunch lunch = new Lunch();
        assertNotNull(lunch); // lunch 가 null이 아닌지 체크
        assertEquals("Complete", lunch.getLunch(), ()-> "점심 만들기 성공시 Complete 여야한다."); // 람다 사용을 통해 문자열 연산 리소스 줄여줌
    }

 

 

aseertTrue : 다음 조건이 참(True) 인지 확인

assertTrue(lunch.getLunch().equals("Complete"), () -> "실패시 메시지");

- 특정 조건이 참인지 확인하는 메서드 이다.

 

assertAll : 모든 구문 확인

    @Test
    @DisplayName("점심추천 만들기")
    void create_lunch() {
        Lunch lunch = new Lunch();
        assertNotNull(lunch); // lunch 가 null이 아닌지 체크
        assertEquals("Complete", lunch.getLunch(), "점심 만들기 성공시 Complete 여야한다."); // getLunch라는 메서드 실행시 Complete 가 반환되는지 체크
    }

- 이 테스트 케이스에서 assertNotNull이라는 메서드가 실패로 떨어질시 assertEquals는 동작하지않아서 정상적인지 유무를 체크할 수 없다. 이러한 현상을 막아줄수있는것이 assertAll 메서드 이다.

@Test
    @DisplayName("점심추천 만들기")
    void create_lunch() {
        Lunch lunch = new Lunch();
        
        assertAll( // 한 개의 테스트 케이스가 실패해도 두개 모두 동작하도록 해준다.
                () -> assertEquals("Complete", lunch.getLunch(),
                        () -> "점심 만들기 성공시 Complete 여야한다."), // getLunch라는 메서드 실행시 Complete 가 반환되는지 체크
                () -> assertNotNull(lunch) // lunch 가 null이 아닌지 체크
        );
        
        assertTrue(lunch.getLunch().equals("Complete"), () -> "실패시 메시지");
    }

- 위 코드 실행시 한개의 테스트 케이스가 실패하더래도 두 개의 메서드를 모두 실행해주기 때문에 정확한 확인이 가능하게 된다.

 

assertThrows : 예외 발생 확인

	// 예외를 던져주는지 확인
        IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,() -> lunch.getLunch("throw"));
        // 받아온 예외메시지가 원하는 예외 메세지와 동일한지까지 체크
        assertEquals("예외처리 확인", exception.getMessage());

- 해당 메서드에서 특정 조건시 예외가 발생하는지 확인하며, 그렇게 받아온 메시지까지 내가 원하는 메시지와 동일한지 체크해줄수 있다.

 

assertTimeout : 특정시간 안에 실행이 완료되는지 확인

	// 설정된 시간안에 동작하는지 확인
        assertTimeout(Duration.ofMillis(100), () -> {
            lunch.getLunch("test");
            Thread.sleep(300); // 300 밀리초 이상의 시간이 걸려서 실패한다.
        });

- 100 밀리초 라는 조건을 줬지만, 실제 실행시간은 Thread.sleep(300); 으로 인해 300 밀리초 이상이 걸리게되며 실패하게 된다.

- 주의할점은 이렇게 긴 시간이 소요되는 실행함수가 있을시 aseertTimeout은 모두 실행후에 시간을 계산하기 때문에 실제로 300 밀리초가 소모 된것을 확인할 수 있다.

- 이러한 현상을 방지하기 위해 assertTimeoutPreemptively 라는 메서드를 사용한다. 해당 메서드 사용시 100 밀리초가 벗어나게되면 테스트가 실패하면서 더이상 다른 동작을 실행하지 않는다. (테스트 코드도 양이 많아지게 되면 긴 시간이 소요되기때문에 이런 효율성을 고려하며 작성하자)

- 하지만 assertTimeoutPreemptively 메서드 사용시에 해당 실행 함수 중에 ThreadLocal을 사용하는 함수가 있다면 제대로 동작하지않을 수 있다는 junit 의 공식문서의 설명이 있으니 참고하도록 하자.

// 설정된 시간안에 동작하는지 확인
assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
    lunch.getLunch("test");
    Thread.sleep(300); // 300 밀리초 이상의 시간이 걸려서 실패한다.
});

 

# 이 글은 백기선님의 "더 자바, 애플리케이션을 테스트하는 다양한 방법"을 듣고 정리한 내용입니다. #