Junit5로 단위 테스트 작성하기
기본적인 스프링부트에서 JUnit5를 사용해서 단위 테스트를 작성해보자
testImplementation 'org.springframework.boot:spring-boot-starter-test'
아마 Spring Intializer에서 스프링 부트 프로젝트를 만들었다면, gradle에 해당 내용이 포함되어 있을 것이고, test 폴더에 ApplicationTests.java 파일도 이미 생성되어 있을 것이다.
ApplicationTests.java 파일을 살펴 보자.
@SpringBootTest
class ApiApplicationTests {
@Test
void contextLoads() {
}
}
간단해보이지만, 의미가 있는 것들이다. intelliJ 개발환경을 가진다면 테스트 코드 왼쪽에서 ▶️ 버튼을 눌러 테스트 코드를 실행해 볼 수 있을 것이다.
@SpringBootTest Annotaion
해당 Annotation을 사용하게 되면, 테스트 전 스프링부트 프로젝트 package에 해당하는 모든 Component(Repository, Service, Controller) 및 Configuration을 로드하게 된다.
따라서, 기본적으로 존재하는 contextLoads 테스트는 스프링부트 프로젝트에 해당하는 모든 Bean을 제대로 생성하였는지, 이에 대한 요류가 없는 지에 대한 테스트였다.
정상적으로 빈이 로드 되었다면 Autowired를 사용하여 Component 기능들을 사용할 수도 있을 것이다.
@SpringBootTest
class ApiApplicationTests {
@Autowired
private MemberJpaRepo memberJpaRepo;
@Test
void contextLoads() {
Member member = memberJpaRepo.findById(1L).orElseThrow(CUserNotFoundException::new);
}
}
다음과 같이 memberJpaRepo를 Autowired를 통해 주입할 수 있고, 메소드를 사용할 수도 있다.
해당 ContextLoads Test에서는 ID가 1인 Member를 찾고, 존재하지 않을 경우 CUserNotFoundException이라는 Exception을 raise할 것이다.
즉, Member를 찾을 경우 성공, Member를 찾지 못하여 Exception이 발생할 경우 테스트 실패가 된다.
Assert 구문 사용하기
import static org.junit.jupiter.api.Assertions.*;
해당 import 구문을 추가하여 다양한 Assert 구문을 추가해보자.
@SpringBootTest
class ApiApplicationTests {
@Autowired
private MemberJpaRepo memberJpaRepo;
@Autowired
private PostJpaRepo postJpaRepo;
@Test
void checkTestDataEnabled(){
Member member = memberJpaRepo.findById(1L).orElseThrow(CUserNotFoundException::new);
assertEquals("나누기", member.getNickname());
assertTrue(member.getIsVerified());
assertEquals(26, postJpaRepo.findAll().size());
}
}
assertEquals 는 두 value값이 같은 지에 대해서 테스트한다.
assertTrue는 해당 Condition이 True인지에 대해서 테스트한다.
작성된 assert 구문중 통과하지 못하는 게 있다면 테스트 실패가 된다.
MockMvc 사용해서 Controller 테스트하기
그렇다면 Controller에 대한 테스트는 어떻게 할까?
해당 url로 get 요청을 한다던지, post 요청을 할 경우 특정 내용의 Json을 return한다던지와 같은 테스트 코드가 필요할 것이다.
이는 MockMvc 를 사용하여 테스트할 수 있다.
@AutoConfigureMockMvc
@SpringBootTest
class ApiApplicationTests {
@Autowired
private MockMvc mockMvc;
@Test
void findAllPosts() throws Exception {
mockMvc.perform(get("/v1/posts?page=0"))
.andExpect(status().isOk())
.andExpect(jsonPath("success").value(true))
.andExpect(jsonPath("data").hasJsonPath());
}
}
@AutoConfigureMockMvc 를 추가하여 @Autowired로 MockMvc를 주입 가능하게 하였다.
MockMvc를 사용하여 Controller 테스트 코드를 작성하여 Json 내용을 검증할 때는 다음과 같이 andExpect와 jsonPath를 사용할 수 있다.
개선점과 다음 이야기
그러나 @SpringBootTest 어노테이션을 사용하면, 모든 Component 및 Configuration 설정을 하기 때문에 다소 시간이 걸리는 편이다.
그래서 보통은 Jpa, Controller, Service 별로 따로 테스트 코드를 작성하고, Jpa 테스트를 동작시킬 때에는 Entity 관련 Bean만 생성하여 테스트를 하도록 만든다.
관련 내용은 다음 포스트에서 이어서 하겠다.
'프로젝트 > 개인 플젝' 카테고리의 다른 글
슬랙봇 개발기 ③ - 슬랙봇에게 말을 걸면 답장 보내기 (socket mode) (0) | 2022.12.15 |
---|---|
슬랙봇 개발기 ② - python slack sdk + flask 서버 구축 (0) | 2022.12.11 |
슬랙봇 개발기 ① - 소켓 모드란 무엇일까? (0) | 2022.12.11 |
[프로젝트] 1일 1커밋 실천할 수 있는 웹사이트 - 연속 커밋 횟수 보여주는 곳 (0) | 2021.07.18 |