본문 바로가기
IT 정보

Spring Test 코드 작성하기

by 완기 2022. 3. 3.
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

댓글