개발 낙서장

[TIL] 내일배움캠프 60일차 - 통합 테스트 본문

Java/Sparta

[TIL] 내일배움캠프 60일차 - 통합 테스트

권승준 2024. 3. 22. 23:09

오늘의 학습 키워드📚

통합 테스트

테스트 코드는 모든 서비스에서 정말 반드시 필요하다. 테스트의 방법, 시기 등 테스트 자체에 대한 중요도는 규모가 크면 클수록 더더욱 중요해진다.

출처(클릭) :  [기고] 왜 임베디드 소프트웨어 테스트가 중요한가

위 그림은 개발 시간이 늘어나면 늘어날 수록 테스트의 비용이 증가하고 서비스의 유지보수 비용이 기하급수적으로 증가한다는 의미의 그래프이다.

테스트의 단계도 나눠져있는데 각각의 기능들을 테스트하는 단위 테스트, 기능들 간의 흐름을 파악하는 통합 테스트, 전체 서비스를 테스트하는 E2E(End to End) 테스트가 있다.

그 중에서 오늘은 통합 테스트를 진행했다.

@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2, replace = AutoConfigureTestDatabase.Replace.ANY)
@TestPropertySource("classpath:application-test.properties")

테스트 클래스에 해당 어노테이션들을 달았다.

  • SpringBootTest : SpringBoot에서 제공하는 어노테이션으로 스프링에서의 테스트 라이브러리들을 사용할 수 있게 해준다.
  • AutoConfigureMockMvc : MockMvc에 대한 설정을 자동으로 해주는 어노테이션이다.
  • AutoConfigureTestDabase, TestPropertySource : 실제 DB 대신 테스트 DB를 사용하기 위한 테스트 H2 임베디드 DB 환경을 설정하는 어노테이션이다.

기존 Controller 단위 테스트에서 진행했던 것처럼 Security 관련 Mock 객체들을 설정해주고 필요한 Bean들을 @AutoWired 어노테이션을 통해 주입 받으면 준비 완료다.

    @Test
    public void createColumn() throws Exception {
        // given
        CreateColumnRequest request = CreateColumnRequest.builder().columnName("컬럼").sequence(1000L)
            .build();

        String postInfo = objectMapper.writeValueAsString(request);

        // when-then
        mockMvc.perform(
                post("/api/v1/boards/{boardId}/columns", board.getBoardId())
                    .content(postInfo)
                    .contentType(MediaType.APPLICATION_JSON)
                    .accept(MediaType.APPLICATION_JSON)
                    .principal(principal))
            .andExpect(status().isCreated())
            .andExpect(jsonPath("$.data.columnName").value(request.getColumnName()))
            .andDo(print());
    }

방식은 Controller 테스트와 비슷하다. API에 필요한 정보들을 생성해 MockMvc로 요청을 보내는 방식이다.

기존 Controller 단위 테스트와 다른 점은 단위 테스트에서는 요청이 의도한 대로 동작하는지에 대해서만 테스트했다면
통합 테스트에서는 요청이 의도한 대로 동작하고 응답에 대한 값이 일치하는지까지 검증하는
'요청 - 서비스 - DB - 반환 - 응답' 모든 과정을 통합으로 테스트하는 것이다.

이렇게 실제 요청을 보내고 받은 것처럼 테스트할 수 있고 json 형태로 데이터가 넘어오기 때문에 jsonPath를 사용해 값을 검증할 수 있다.


오늘의 회고💬

여전히 쿼리 최적화에서 많이 헤맨 것 같다. 그래도 테스트 코드까지는 끝내놔서 조금씩 더 공부하면서 찾아보면 될 것 같다.

 

내일의 계획📜

우선 주말이긴 하니까 설렁설렁 하겠지만.... 그래도 최대한 하는 방향으로!!

Comments