본문 바로가기
Spring/junit5 테스트

junit 테스트 코드(4/5) - 통합테스트

by 옹알이옹 2023. 8. 1.

 

 


 1. 통합 테스트 역할

Contoller 계층 - Service 계층 -  Repository 계층을 한번에 테스트를 진행한다.
간단히 생각하면 PostMan을 통해 하나의 API를 호출하고 성공 실패를 확인하는 것을 하는것이다.
정리하자면 다음과 같다.
  1. HTTP 요청과 응답에 대한 동작 검증 
  2. 요청 매핑 검증 : 매개변수나 경로 변수가 올바른지 
  3. 응답 데이터 검증
  4. 요청에 대한 전체적인 동작 검증
HTTP 요청,응답에 대한 것은 Controller 계층에서 따로 해도 되지만, 현재는 코드가 간단하므로 통합 테스트에서 진행.

 2. 통합 테스트 진행 방법

단위 테스트의 경우 Mock 객체를 사용하거나 @DataJpaTest 를 사용하여 계층별로 테스트를 진행하였지만
통합 테스트는 모든 로직에 대한 검증을 해야하므로 Spring Container의 도움을 받아 모든 빈을 등록하고 의존성을
주입하여 실제 구동 환경과 유사한 환경에서 테스트를 진행 해야한다.

✅ 통합 테스트 환경 구성을 위한 어노테이션 및 객체

@SpringBootTest : 어플리케이션 전체가 로드되므로 모든 빈과 구성이 테스트에 포함된다

MockMvc

  • 브라우저나 포스트맨에서 요청을 날리는 것과 같은 Http 통신을 가능하게 해준다.
  • 해당 통신에 대한 환경( contentType이나 content 등의 속성) 을 지정할 수 있다.
  • 통신의 응답값에 대한 검증을 할 수 있다.

@AutoConfigureMockMvc : 위의 MockMvc 객체를 의존 주입받을 수 있게 해준다. 실제 주입은 @Autowired를 통해 진행

 

테스트 실행 실제 스프링 컨테이너가 올라가는 것을 확인할 수 있다.

이미지 없음

 

 

🔽 실제 사용 예시는 아래에서 확인


 3. 코드 작성 예시

@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@AutoConfigureMockMvc
public class BoardIntegrationTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    private Board board;

    static private Member savedMember;
    @Autowired
    private BoardRepository boardRepository;
    @Autowired
    private MemberRepository memberRepository;

    @BeforeEach
    void setUp(){
        Member member = Member.builder()
                .memberId("tester23")
                .firstNm("t")
                .lastNm("ester")
                .password("!23")
                .email("test@naver.com")
                .build();

        savedMember = memberRepository.save(member);

        board = Board.builder()
                .boardNm("board1")
                .useAt("Y")
                .comCode(null)
                .member(member)
                .build();

    }

    @Test
    @DisplayName("게시판 등록 - 통합 테스트")
    @Transactional
    void createBoardTest() throws Exception {

        // given
        BoardCreateDto boardCreateDto = BoardCreateDto.builder()
                .boardNm("통테")
                .memberNo(savedMember.getMemberNo())
                .build();

        String param = objectMapper.writeValueAsString(boardCreateDto);


        // when
        ResultActions resultActions = mockMvc.perform(post("/board")
                .contentType(MediaType.APPLICATION_JSON)
                .content(param))
                .andDo(print());

        // then
        resultActions
                .andExpect(status().isOk())
                .andExpect(content().string("게시판 등록 완료"));
    }

}

given : 등록 테스트를 위한 파라미터 세팅 및 obejctMapper를 통한 Json 변환.

 

when :  MockMvc를 통해  contentType지정 및 파라미터를 담아준 뒤 post /board 라는 endPoint로 요청을 보낸다

 

then : 해당 요청에 대한 응답객체의 상태값으로 200을 기대하며, content 내용은 "게시판 등록 완료"를 기대한다.

 

위의 코드는 매우 기본적인 예시를 통해 작성하긴 하였지만, 문법이 조금 낯선 것을 빼고는 실제 코드와 
비슷하게 진행되므로 이해가 어렵지는 않다.
하지만 말했다시피 매우 기본적인 예시를 들었으며, 추가로 예외 테스트도 작성해야한다.
예외 테스트는 학습과 실습을 통해 작성한 뒤 정리할 예정이다.

반응형