1. 개요
이번에는 테스트 커버리지를 인텔리제이를 통해 확인해보고, 검증하지 않은 코드에 대한 테스트를 작성해보고자 한다. 그 전에 하나 짚고 넘어가야 할 것이 있다.
테스트 커버리지가 높아야, 극단적으로 100%여야만 좋은 테스트임을 나타내는 것은 아니다.
이 포스트는 단순히 커버리지를 확인하고, 이를 채우는 방법을 찾는 과정에 불과하다. 필자는 아직 좋은 테스트를 작성하는 기준을 세우지 못했기에 가장 쉽게 잡을 수 있는 기준인 커버리지를 활용하는 것 뿐이다.
2. 방법

간단하다. 테스트 코드를 실행할 때 with Coverage를 클릭하면 테스트를 실행함과 동시에 커버리지를 계산하여 보여준다.


위와 같이 클래스, 라인, 메서드 별로 커버리지가 얼마인지 계산하여 준다. 위 내용은 서비스 계층의 단위 테스트에 대한 커버리지를 나타낸 것이다.

테스트 대상 객체 중 일부인 ReportService 중 일부이다. 해당 코드가 검증이 되었는지 안 되었는지 확인할 수 있다.(해당 색상은 테마에 따라 다를 수 있음)

해당 코드의 좌측을 클릭하면 테스트를 진행하는 동안 코드의 hit 수를 확인 할 수 있다.

이와 같이 조건 커버리지가 100%이 아닌 경우 다른 색상으로 표기해 주기도 한다.
3. 예시

현재 76%의 라인 커버리지를 가지고 있다.

신고 기능 코드의 일부이다. 회원을 찾지 못했을 때의 예외 처리에 대한 테스트 코드를 작성하지 않았다.
@Test
@DisplayName("신고 - 회원을 찾지 못했을 경우 예외 처리를 해야 함")
void failToReportIfMemberNotFound() {
//given
CreateReportDto createReportDto = CreateReportDto.builder()
.reportContentId(1L)
.reportType("story")
.reportReason("스팸홍보")
.build();
Member testWriter = createActiveTestMember();
Member testReporter = createActiveTestMember2();
Story testStory = createStory(testWriter, "title", "city");
UserPrincipal principal = new UserPrincipal(testReporter);
//when, then
assertThatThrownBy(() -> reportService.save(createReportDto, principal))
.isInstanceOf(NotValidMemberException.class)
.hasMessageContaining(StatusCode.INVALID_MEMBER.getCustomMessage());
}
이를 커버하기 위해 테스트를 작성해주었다. 현재 memberRepository는 mock 객체이다. given으로 동작을 지정해주지 않았으므로 어떤 메서드를 실행하든 null에 준하는 결과를 반환하게 된다. 이를 확인하는 코드이다.


해당 테스트를 작성한 후 라인 커버리지가 2% 상승한 것을 확인할 수 있었다.
4. 여담
현재는 사이드 프로젝트에 불과하지만 실무에 들어간다면 규모가 더 커질 것이고, 테스트 커버리지를 한 눈에 확인하는 것은 확실히 좋은 기능이다. 하지만 좋은 테스트를 작성하는 것은 별개의 문제이다. 커버리지를 높이는 데 비용을 들여 생산성이 오히려 떨어질 수도 있다는 생각이 들었다. 테스트를 작성하는 습관을 들이면서 좋은 테스트가 무엇인지 끊임없이 고민할 필요가 있다.
'Test Code' 카테고리의 다른 글
| WebClient 사용 코드에서 단위 테스트 작성하기 - MockWebServer (1) | 2025.04.17 |
|---|