본문 바로가기

Test Code

Intellij - 테스트 커버리지 확인하기

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. 여담

 현재는 사이드 프로젝트에 불과하지만 실무에 들어간다면 규모가 더 커질 것이고, 테스트 커버리지를 한 눈에 확인하는 것은 확실히 좋은 기능이다. 하지만 좋은 테스트를 작성하는 것은 별개의 문제이다. 커버리지를 높이는 데 비용을 들여 생산성이 오히려 떨어질 수도 있다는 생각이 들었다. 테스트를 작성하는 습관을 들이면서 좋은 테스트가 무엇인지 끊임없이 고민할 필요가 있다.