슬라이스 테스트란 특정 계층만 잘라서(Slice) 테스트하는것을 의미한다.
❯ API 계층 테스트
API 계층 테스트 대상은 클라이언트 요청을 받아들이는 Controller 라고 할 수 있다.
크게 두가지 애너테이션을 사용해 테스트 코드를 작성할 수 있다.
- @SpringBootTest: 스프링 부트 기반 애플리케이션 테스트를 위한 Application context를 생성한다.
- @AutoConfigureMockMvc: Controller 테스트를 위한 자동 구성작업을 해준다.
MockMvc 객체를 사용가능하게하며 MockMvc를 통해 Controller의 메서드를 호출할 수 있다.
// Controller 테스트 클래스 기본 구조
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
@SpringBootTest
@AutoConfigureMockMvc
public class ControllerTestDefaultStructure {
@Autowired
private MockMvc mockMvc;
@Test
public void postMemberTest() {
// given
// when
// then
}
}
위의 테스트 컨트롤러 기본구조에서 처럼 MockMvc 객체를 주입받아 사용하게 된다.
테스트 코드 내부 구조를 보면 given / when / then 으로 구성되어있는것을 알 수 있다.
- given: 이때까지는 Postman을 통해 데이터를 전달해주었는데, 테스트 코드에서 바로 데이터를 전달해줄 수 있다.
RequestBody를 적절한 형태(JSON 등)로 변경하여 데이터로 넘겨줄 수 있다. - when: MockMvc 객체의 perform( ) 메서드를 통해 컨트롤러의 메서드를 호출한다. 메서드 리턴타입은 ResultActions이다.
perform( ) 내부에는 테스트 대상 HTTP 메서드(post, get 등)와 URL, 클라이언트 데이터 타입,
given에서 정의된 RequestBody 등이 포함된다. - then: 리턴된 ResultActions 객체를 통해 request에 대한 검증을 수행한다.
andExpect( ) 등의 메서드를 통해 예상되는 기대결과를 검증한다.
❯ 데이터 액세스 계층 테스트
데이터 액세스 계층 테스트를 할때 주의할 점은 테스트를 하고난 뒤 데이터베이스의 상태가 테스트 이전과 동일해야한다는 점이다.
(테스트를 한 뒤 데이터베이스가 변경되지 않아야한다.)
현재 데이터를 Spring Data JPA를 통해 사용하고 있으므로, 관련된 테스트 방법에 대해 학습하였다.
- @DataJpaTest: Repository 기능을 정상적으로 사용하기 위한 Configuration을 스프링이 자동으로 해준다.
@Transactional 애너테이션을 포함하므로 테스트가 종료되면 저장된 데이터는 다시 자동으로 rollback된다.
// 데이터 액세스 계층 테스트 클래스 기본 구조
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import static org.junit.jupiter.api.Assertions.*;
@DataJpaTest
public class SampleRepositoryTestDefaultStructure {
@Autowired
private SampleRepository sampleRepository;
@Test
public void saveSampleTest() {
// given
// when
// then
}
}
위 기본구조를 보면 테스트하려는 Repository를 DI 받아서 사용하게 된다.
- given: 테스트를 수행하기 위해 필요한 기본 데이터를 준비한다.
- when: 테스트 하려는 기능을 수행한다. ex. sampleRepository.save(sample)
- then: JUnit의 assertNotNull(), assertTrue() 등을 이용해 결과를 검증한다
'부트캠프 개발일기 > Spring MVC' 카테고리의 다른 글
57일차: API 문서화 (0) | 2023.05.03 |
---|---|
56일차: Mockito (0) | 2023.05.02 |
54일차: 테스팅(단위테스트, JUnit) (0) | 2023.04.28 |
53일차: @Async 비동기처리와 Spring Event (+ Transaction) (0) | 2023.04.27 |
52일차: Transaction(트랜잭션) (0) | 2023.04.26 |