본문 바로가기
📕 Spring Framework/Spring Project

「테스트 코드 & Spring REST Docs」

by GroovyArea 2022. 6. 20.
개인 프로젝트는 완성이 되었다. 이제는 세부적인 디테일에 신경을 쓰며 리팩터링과 그에 필요한 개념 정리를 하며 프로젝트에 적용시키고 있다.
REST API를 처음 설계해 보았는데, 부족한 점이 많았지만 신선한 경험이고 짧은 기간 내에 배운 것이 많은 설계 과정이었다. 
API를 설계하면 그에 맞는 명세가 필요한데, 보통 Swagger나 Spring REST Docs 프레임워크를 이용한다고 한다.
Swagger를 사용하면 애노테이션을 이용해 편하게 문서를 작성할 순 있지만, 프로젝트의 확실성과 정확성을 뒷받침하기 위해서는 테스트 코드 작성이 필수라고 생각하기 때문에 Spring REST Docs를 이용하기로 생각하며 적용해보았다. 

테스트 코드

크게 단위 테스트와 통합 테스트가 있다. 

 

통합 테스트

단위 테스트보다 더 큰 동작을 달성하기 위해 여러 모듈들을 모아 의도대로 협렵하는지 확인하는 테스트

주로 @SpringBootTest 애노테이션을 사용하여 통합 테스트 환경을 생성한다.

 

단위 테스트

가능한 가장 작은 소프트 웨어를 실행하여 예상대로 동작하는지 확인하는 테스트

=> TDD 진행 시 유용하다

자바는 주로 Junit을 사용하여 테스트한다. 

 

나의 경우는 스프링 프로젝트이므로 의존성에 테스트 모듈이 자동 추가 되었으므로 그대로 사용하면 된다.

testImplementation 'org.springframework.boot:spring-boot-starter-test'

 

여기서 Mock Object를 이용한 Mockito Framework를 이용하여 단위 테스트를 진행하기로 결정했다. 

 

그중 컨트롤러의 단위 테스트를 진행하기로 했다. 

사용하는 애노테이션은 @WebMVCTest과 @AutoConfigureRestDocs를 이용하여 Spring REST Docs를 동시에 진행했다.

 

User API 테스트

@BeforeEach
public void setUp(RestDocumentationContextProvider restDocumentationContextProvider) {
    mockMvc =
            MockMvcBuilders.standaloneSetup(new UserController(userService))
                    .apply(documentationConfiguration(restDocumentationContextProvider))
                    .addFilters(new CharacterEncodingFilter("utf-8", true))
                    .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())))
                    .build();
}

@Test
@DisplayName("회원 디테일 조회 테스트")
void detailActionTest() throws Exception {
    Mockito.when(userService.findById(userDTO.getUserId())).thenReturn(userDTO);
    this.mockMvc
            .perform(get("/api/users/{userId}", userDTO.getUserId()).accept(MediaType.APPLICATION_JSON)
                    .header("Authorization", "Bearer ${AUTH_TOKEN}"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.data.userId", is(userDTO.getUserId())))
            .andExpect(jsonPath("$.data.userMainAddress", is(userDTO.getUserMainAddress())))
            .andExpect(jsonPath("$.message", is("권한 : BASIC_USER")))
            .andDo(document("detailUser", preprocessRequest(prettyPrint()),
                    preprocessResponse(prettyPrint())))
    ;
}

 

@ExtendWith({RestDocumentationExtension.class, SpringExtension.class})
@WebMvcTest(UserController.class)
@Import(value = {AuthorizationExtractor.class, JwtTokenProvider.class})
@AutoConfigureRestDocs
class UserControllerTest {

테스트 클래스에 붙인 애노테이션들

 

테스트가 완료 되면 snipets 파일들이 생성된다. 이를 통해 문서화할 수 있다.

이렇게 생성이 됨.

 

.adoc 파일을 통해 문서를 작성할 수 있다. 이때 아까 생성된 snippets 파일들을 삽입해 작성 가능하다.

 

간단히 초기 버전을 작성했다.

이제 장바구니, 주문, 관리자 API를 추가해야겠다. 

 

 

반응형