코드 커버리지(code coverage)는 소프트웨어의 테스트 수준이 충분하지를 표현하는 지표 중 하나이며 테스트를 진행했을 때 대상 코드가 실행됐는지 표현하는 방법으로도 사용된다.
이러한 커버리지를 확인하기 위한 다양한 커버리지 도구 중 가장 많이 사용되는 도구가 JaCoCo이다.
JaCoCo(Java Code Coverage)는 JUnit 테스트를 통해 애플리케이션의 코드가 얼마나 테스트됐는지 Line과 Branch를 기준으로 한 커버리지로 리포트한다. JaCoCo는 런타임으로 테스트 케이스를 실행하고 커버리지를 체크하는 방식으로동작하고, 리포트는 HTML, XML, CSV 같은 다양한 형식으로 확인할 수 있다.
JaCoCo 의존성 추가
pom.xml에 다음과 같이 추가한다.
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.7</version>
</dependency>
플러그인은 다음과 같이 추가할 수 있다.
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.7</version>
<configuration>
<excludes>
<exclude>**/ProductServiceImpl.class</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>jacoco-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>BUNDLE</element>
<limits>
<limit>
<counter>INSTRUCTION</counter>
<value>COVEREDRATIO</value>
<minimum>0.80</minimum>
</limit>
</limits>
<element>METHOD</element>
<limits>
<limit>
<counter>LINE</counter>
<value>TOTALCOUNT</value>
<maximum>50</maximum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
<configuration>
<excludes>
<exclude>**/ProductServiceImpl.class</exclude>
</excludes>
</configuration>
일부 클래스를 커버리지 측정 대상에서 제외시킨다. 위 코드에서는 ProductServiceImpl.class를 커버리지 측정 대상에서 제외하도록 설정됨을 확인할 수 있다.
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>jacoco-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>BUNDLE</element>
<limits>
<limit>
<counter>INSTRUCTION</counter>
<value>COVEREDRATIO</value>
<minimum>0.80</minimum>
</limit>
</limits>
<element>METHOD</element>
<limits>
<limit>
<counter>LINE</counter>
<value>TOTALCOUNT</value>
<maximum>50</maximum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
execution은 기본적으로 goal을 포함하고, 설정한 값에 따라 추가 설정이 필요한 내용은 configuration과 rule을 통해 작성한다.
execution에서 설정하는 goal의 속성값은 아래와 같다.
JaCoCo - Rule
Rule은 configuration 태그 안에서 설정하고 다양한 속성을 활용할 수 있다.
먼저 Element는 코드 커버리지를 체크하는 데 필요한 범위 기준을 설정한다. 여기서 사용 가능한 속성은 6가지이다.
기본값인 BUNDLE은 Element를 기준으로 limits 태그 내 counter와 value를 활용해 커버리지측정 단위와 방식을 설정한다.
counter는 커버리지를 측정하는 데 사용하는 지표이다. Counter에서 사용할 수 있는 커버리지 측정 단위는 6가지 이다.
마지막으로 Value 태그로는 커버리지 지표를 설정한다. 측정한 커버리지를 어떤 방식으로 보여주는지 설정하고 5가지 중 선택할 수 있다.
이 정보로 맨 위의 코드를 보면,
패키지 번들 단위로 바이트코드 명령 수를 기준으로 커버리지가 최소 80% 달성하는 것을 limit으로 설정했다.
메서드 단위로 전체 라인 수를 최대 50줄로 설정했다. 이 기준을 벗어나면 에러가 발생한다.
JaCoCo 테스트 커버리지 확인
JaCoCo 플러그인으로 테스트 커버리지를 측정하려면 메이븐의 테스트 단계가 선행되어야 한다. 따라서 JaCoCo는 test 단계 뒤에 있는 package 단계에서 실행할 수 있다.
package를 더블클릭하여 빌드를 진행하면, target 폴더 내 site - jacoco 폴더가 생성된다. 만약 정상 동작하지 않는다면 프로젝트 경로에 한글이 없는지 확인하기!