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를 발생시킬까?.");
로 익셉션을 바꾸면 에러가 발생한다.
'IT 정보' 카테고리의 다른 글
spring boot 리소스 캐싱 (0) | 2022.04.27 |
---|---|
Intelli J에서 AWS 아테나 및 DB 연결하기 (0) | 2022.04.11 |
AWS Lambda와 API Gateway 연결하기 (0) | 2022.02.24 |
GitHub actions을 이용한 람다 배포 자동화(ECR) (0) | 2022.02.07 |
M1 맥북 ECR 빌드 (0) | 2022.02.06 |
댓글