2021년 07월 30일 TIL
오늘은 팀원들에게 단위테스트를 공부한 내용에 대해 배포했다.
단위테스트의 정의
단위 테스트(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;
이렇게 자동으로 세팅할 수도 있다. 원하는 방식을 선택하면 된다.