2021년 07월 30일 TIL

1 minute read

오늘은 팀원들에게 단위테스트를 공부한 내용에 대해 배포했다.

단위테스트의 정의

단위 테스트(Unit Test)는 하나의 모듈을 기준으로 독립적으로 수행되는 가장 작은 단위의 테스트라고 정의되어있다. 여기서의 모듈을 애플리케이션에서 작동하는 하나의 기능 / 메소드로 이해한다면, 로그인 메소드에 대한 독립적인 테스트가 하나의 단위 테스트가 될 수 있다.

또한 FIRST라는 5가지 규칙을 명심하며 코드를 작성할 필요가 있다.

  • Fast: 테스트는 빠르게 동작하여 자주 돌릴 수 있어야 한다.

  • Independent: 각각의 테스트는 독립적이며 서로 의존해서는 안된다.

  • Repeatable: 어느 환경에서도 반복 가능해야 한다.

  • Self-Validating: 테스트는 성공 또는 실패로 bool 값으로 결과를 내어 자체적으로 검증되어야 한다.

  • Timely: 테스트는 적시에 즉, 테스트하려는 실제 코드를 구현하기 직전에 구현해야 한다.

따라서 단위테스트를 진행하기 위해서 메소드별로 테스트를 진행해야한다고 생각했고,

각각의 Controller와 Service에 테스트를 진행하기로 결론 내렸다.

Fast의 원칙에 따라 테스트는 가능한 한 빠르게 동작해야하고, Controller 테스트에 있어서 가장 적합한 것은 @WebMvcTest라고 보았다.

따라서 Controller 단의 테스트에는 @WebMvcTest를, Service Layer의 테스트에는 @ExtendWith(MockitoExtension.class)를 사용할 예정이다.

(어노테이션에 대한 설명은 하지 않겠습니다.)

@ExtendWith(RestDocumentationExtension.class) // JUnit 5 사용시 문서 스니펫 생성용
@WebMvcTest(controllers = UserApiController.class, excludeFilters = {
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = SecurityConfig.class)}
)
@MockBean(JpaMetamodelMappingContext.class) // @EnableJPaAuditing 사용시 추가해야하는 어노테이션
@AutoConfigureRestDocs

이것은 Test 환경설정을 위해 사용하는 어노테이션이다.

@AutoConfigureRestDocs는 Spring Rest docs을 사용하기 위한 MockMvc 설정을 해주는 어노테이션인데,

@ExtendWith(RestDocumentationExtension.class) 
@WebMvcTest(UserApiController.class)  
@ActiveProfiles("test") 
@MockBean(JpaMetamodelMappingContext.class) 
class UserApiControllerTest {

    private MockMvc mockMvc;

    @BeforeEach
    public void setup(WebApplicationContext webApplicationContext,
        RestDocumentationContextProvider restDocumentation) {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
            .apply(documentationConfiguration(restDocumentation))
            .apply(sharedHttpSession())
            .build();
    }
}

이와같이 수동으로 설정해주는 방법도 있고,

@ExtendWith(RestDocumentationExtension.class) 
@WebMvcTest(UserApiController.class)  
@ActiveProfiles("test") 
@MockBean(JpaMetamodelMappingContext.class) 
@AutoConfigureRestDocs 
class UserApiControllerTest {

    @Autowired
    private MockMvc mockMvc;

이렇게 자동으로 세팅할 수도 있다. 원하는 방식을 선택하면 된다.

Categories:

Updated: