본문 바로가기
부트캠프 개발일기/Spring MVC

55일차: 슬라이스 테스트

by shyun00 2023. 5. 1.

슬라이스 테스트란 특정 계층만 잘라서(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() 등을 이용해 결과를 검증한다