IT 정보

Spring Test 코드 작성하기

완기 2022. 3. 3. 01:00
728x90
반응형

Spring에서 JUnit5를 이용하여 테스트 코드를 작성하는 방법을 소개합니다.

 

개발환경은 spring boot 2.6.3이고

ide는 Intelli J를 사용했습니다.

 

 

일반적으로 인텔리제이에서 프로젝트를 생성하면 src -> test에 메인 클래스 이름 + Test가 붙은 테스트용 클래스가 제공된다.

 

일반적으로 이렇게 생성되어 있을 것이다.

클래스 위에

@SpringBootTest

어노테이션은 스프링을 실제 띄워서 컨테이너를 띄우거나 DI를 하여 스프링과 동일한 환경에서 테스트할 수 있고,

단순 자바 코드로서 테스트가 아닌 DB연동 등 통합 테스트에 자주 사용한다.

 

하지만 김영한님의 말을 따르면

테스트 코드에서 해당 어노테이션이 붙으면 테스트의 설계가 잘못될 가능성이 높다고 했다. (통합 테스트가 아닌 이상.)

 

그리고

 

메서드에 @Test 어노테이션이 붙어있다면 테스트를 위한 메서드를 선언한 것이다.

 

이 메서드를 그냥 왼쪽의 실행 버튼을 눌러 실행시키면 결과를 Run탭에서 확인할 수 있다.

 

 

Run탭에서 표시되는 이름은 기본적으론 함수 이름을 사용하고

@DisplayName어노테이션을 사용하면 이름을 바꿀 수 있다.

 

 

 

그리고 이제 테스트를 위한 메서드들을 소개하자면

 

Assertions를 입력하면 자동 완성으로 jupiter와 assertj가 있는데, 

사용 방법은 크게 다르지 않으나 본인이 편한 걸 사용하면 된다.

 

메서드들의 이름이 전부 직관적이라 차이가 있다 해도 사용엔 큰 무리가 없다.

 

난 개인적으론 jupiter가 더 편했다.

 

jupiter를 기준으로 소개하도록 한다.

 

이런식으로 assertTrue를 쓰면 인자 값이 true인지 테스트할 수 있다.

 

그리고 Assertions에서 opt + enter를 누르면static하게 import 하여 사용할 수 있다.

 

만약 안나오는 경우

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

 

assertEquals(flag,false,"flag는 false가 아닙니다.");

jupiter가 더 좋은 이유라고 생각하는 게 직관적으로 3번째 인자에 메시지를 넣을 수 있다는 점이 좋은 것 같다.

 

코드에서 flag는 true라고 했는데, 기대값이 false일 경우 테스트는 실패하고 3번쨰 문자열의 메시지를 출력한다.

 

위 이미지처럼 테스트가 실패했고 그에 해당하는 메시지를 출력하여 더욱 가시성있게 어떤 점이 실패인지 체크할 수 있다.

 

이런 식으로 assertNotEquals를 쓰면 값이 다른 지도 체크가 가능하다.

 

그리고 3번 째 인자는 단일 인터페이스이기 때문에 람다식으로 표현이 가능하다.

테스트가 실패할 때만 실행할 수 있도록 람다로 써주는 게 조금이나마 성능상 이점이 있다.

 

그리고 여러개의 테스트를 한 번에 해야 하는 경우가 있는데,

 

이럴 때 유용한 메서드가 있다.

 

바로 assertAll이다.

 

 

assertAll을 까 보면 Excutable을 인자를 여러 개 받을 수 있고,

Excutable은 FunctionalInterface이기 때문에 람다식으로 표현이 가능하다.

 

 

assertAll(
                () -> assertNotEquals(1, 2, () -> "1번 테스트 실패시 출력되는 메시지"),
                () -> assertEquals("message", "message", () -> "2번 테스트 실패시 출력되는 메시지"),
                () -> assertEquals(1, 2, () -> "3번 테스트 실패시 출력되는 메시지")
        );

 

이런 식으로 작성하면 한꺼번에 여러 테스트를 돌릴 수 있고, 실패 시 메시지를 출력한다.

 

 

 

그리고 특정 메서드 실행시 익셉션이 발생하는지 확인도 가능하다.

 

boolean isTrue(boolean flag) {
        if (flag) {
            return true;
        } else {
            throw new IllegalArgumentException("True가 아닙니다.");
        }
    }

 

간단하게 인자 값이 참인지 판별하는 메서드를 만들었다.

 

assertThrows(IllegalArgumentException.class, () -> isTrue(false), () -> "IllegalArgumentException를 발생시킵니다.");

와 같이 작성하면 인자가 false기 때문에 IllegalArgumentException를 던질 거고 테스트에서 IllegalArgumentException를 던지냐고 물었기 때문에 테스트가 성공한다.

 

 

assertThrows(NullPointerException.class, () -> isTrue(false), () -> "NPE를 발생시킬까?.");

로 익셉션을 바꾸면 에러가 발생한다.

 

728x90
728x90