3.8.2 Test - Slice

yeonseong Jo·2023년 7월 11일
0

SEB_BE_45

목록 보기
42/47
post-thumbnail

이전에도 말했듯
회사에 입사하기 위해
과제전형을 한 적이 있는데,
그 때 테스트 코드를 같이 제출했었다.

당시에는 테스트 코드를 짜본적이 없었기에
급하게 django에서 제공하는 test 모듈을 썼었고
그랬기에 Unit test만 작성하여 제출했었다.

이번에 spring에서 test를 학습하면서
slice test도 있다는 것을 알게되었고,
그래서 학습 내용을 정리하고자 한다.


Slice Test

단위 테스트는
최대한 독립적인 것이 좋고,
최대한 작은 단위인 것이 좋다고 했었다.

하지만 이 단위 테스트는 가장 작은 단위로
구분하여 케이스를 작성하기 때문에

계층별로 잘 작동하는지는 알기 어렵다.

그래서 특정 계층만 slice해서 테스트하는 것을
Slice Test라고 한다.

API 계층 test

MockMvc를 사용해 테스트를 진행한다.

  • MockMvc는 서블릿 컨테이너 없이
    DispatcherServlet을 호출하기 때문에
    실제 서버를 실행하지 않고도 Controller를 테스트 할 수 있는 환경을 지원하는
    (테스트용)Spring MVC 프레임워크이다.
@SpringBootTest
@AutoConfigureMockMvc
class APITest{
	@Autowired
    private MockMvc mockMvc;
    
    @Test
    void testCase1() throws Exception {
    	//given
        ...
        // when
        ResultActions action = mockMvc.perform(
        						...
                                );
       // then
       actions.
       		   andExpect(...
               
    }
}

@SpringBootTest를 사용하여 테스트 클래스를 생성

@AutoConfigureMockMvc를 사용하면
테스트 대상 계층에서 필요한 Dependency를 찾아
알아서 등록한다.

MockMvc를 주입받고,
목적에 따라 given을 설정
mockMvc.perform(...)을 통해 when을 설정
perform의 결과를 통해 then을 설정

데이터 엑세스 계층 test

@DataJpaTest
public class DataAcessTest {
	@Autowired
    private EntityRepository entityRepository;
    
    @Test
    public void testCase1() {
    	// given
        ...
        // when
        Entity entity = entityRepository.save(...);
        // then
        assertTrue(...
    }
}

DataJpaTest를 사용해 테스트를 진행한다.

  • DataJpaTest에는 Transactional annotation이 있기 때문에 repository를 통해 save를 하더라도
    persist context에만 반영이 되기 때문에
    DB에 변경사항이 저장되지 않는다.

Mockito를 사용한 test

Mockito는 계층별 test에 필요한 Dependency를
mock 객체로 대체하여 진행하기 때문에
테스트 대상에만 집중할 수 있다.

import static org.mockito.BDDMockito.given;

@SpringBootTest
@AutoConfigureMockMvc
class APITest{
	@Autowired
    private MockMvc mockMvc;
    
    @MockBean
    private EntityService service;
    ...
    
    @Test
    void testCase1() throws Exception {
    	// given
        ...
        given(service.createEntity(Mockito.any(Entity.class)).willReturn(entity);
        // when
        ResultActions actions = mockMvc.perform(...
        // then
        action.andExpect(...
    }
}

@MockBean을 통해 해당 계층에 필요한
Dependency를 가짜로 생성하여 테스트를 진행한다

  • 진짜 가짜이기 때문에 실제 객체의 필드나 메서드만 가져와
    사용하고, Mockito의 given static 메서드를 통해
    "어떠한 메서드를 실행" 했을 때
    .willReturn()에 들어오는 값을 return한다는 의미이다.
  • MockBeanMock이 있는데,
    어느 한 객체를 선언할 때, 해당 객체가
    실제 서비스에서
    Bean으로 등록된 객체라면 MockBean
    아니라면 Mock annotaion을 사용해 선언한다.

Slice Test에 대해 학습을 해보니
내가 이전에 면접을 위해 제출했던 과제에 작성한
테스트는 Unit Test보다는 Slice Test에 가까웠던거 같다.

Mockito를 사용한 test 작성법이
독특해서 기억에 남는거 같다.

profile
뒤(back)끝(end)있는 개발자

0개의 댓글