통합 테스트란?
- 각 모듈들이 서로 상호작용이 잘 이루어지는지 검증하는 테스트 과정으로, 모듈을 통합하는 과정에서 발생하는 오류들을 발견할 수 있다.
- 스프링 부트에서 통합테스트는 Controller -> Service -> Repositorty에 거친 하나의 API에 대해서 각 모듈들이 잘 연결되어 있는지 체크할 수 있다.
- 블랙박스 테스팅(E2E(end to end), 실제 사용자의 환경과 거의 동일한 환경에서 테스팅)을 가능하게 한다.
장, 단점
장점 : UI 없이 테스팅 가능, 모든 빈을 컨트롤러에 올려 테스트하기에 실제와 유사한 환경 제공
단점 : 모든 빈을 올리기에 시간이 오래걸리며, 특정 빈이나 계층에서 발생하는 오류를 디버깅하기가 까다롭다.
설정
1. @SpringBootTest
-> Context에 필요한 빈들을 올리기위해 사용되는 애너테이션, 제어의 역전을 제공해준다.
2. @Transactional
-> 테스트 메서드가 실행될때마다 데이터베이스를 롤백 처리, 이를 원치않는 메서드 존재 시, 테스트 메서드 위에 @Rollback(false) 작성
3. @AutoConfigureMockMvc
-> API 테스트를 위해 해당 클래스에 MockMvc 클래스를 주입시켜준다. 이 후, 필드를 만들고 사용하여 API를 테스팅한다.
4. @Order + @TestMethodOrder(OrderAnnotation.class)
-> 테스트의 순서지정.
5. @ActiveProfiles("파일명")
-> 테스트 코드에서 실제 DB사용이 아닌 H2등을 사용하고 싶다와 같이 다른 설정을 사용하는 경우에 파일 생성 후 사용
예시 코드
@SpringBootTest
@ActiveProfiles("test")
@AutoConfigureMockMvc
@Transactional
@TestMethodOrder(OrderAnnotation.class)
class MemberAPITest {
@Autowired
protected MockMvc mvc;
@Test
@Order(1)
@DisplayName("MemberAPI : Register Member")
public void testRegisterMember() throws Exception {
// given
MemberDTO sample = MemberDTO.sample();
String response = "success";
// when
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post("/member")
.with(csrf()).contentType(MediaType.APPLICATION_JSON).content(new Gson().toJson(sample)));
// then
resultActions.andExpect(status().isOk())
.andExpect(MockMvcResultMatchers.content().string(equalTo(response)));
}
}
- BDD(Given - When - Then) 과정을 준수한 테스트 코드
- 해당 코드는 회원 가입 API 테스트로 나머지 API에 대한 테스트 코드도 작성하면 된다.
'Server Development > Testing' 카테고리의 다른 글
UNIT TEST - JUNIT5, Mockito (0) | 2023.07.16 |
---|---|
Apache Jmeter (0) | 2023.05.15 |
Test Coverage with Jacoco (0) | 2023.04.02 |
Unit Test with MVC (0) | 2023.04.02 |
Swagger (0) | 2023.04.01 |