JaCoCo 활용 및 테스트 커버리지 확인

휘Bin·2023년 6월 23일
0
post-thumbnail

코드 커버리지(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 설정

<configuration>
                    <excludes>
                        <exclude>**/ProductServiceImpl.class</exclude>
                    </excludes>
</configuration>

일부 클래스를 커버리지 측정 대상에서 제외시킨다. 위 코드에서는 ProductServiceImpl.class를 커버리지 측정 대상에서 제외하도록 설정됨을 확인할 수 있다.

executions 설정

<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의 속성값은 아래와 같다.

  • help : jacoco-maven-plugin에 대한 도움말을 보여준다.
  • prepare-agent : 테스트 중인 애플리케이션에 VM인수를 전달하는 JaCoCo 런타임 에이전트의 속성을 준비하고, 에이전트는 maven-surefire-plugin을 통해 테스트한 결과를 가져오는 역할을 수행한다.
  • prepare-agent-integration : prepare-agent와 유사하지만 통합 테스트에 적합한 기본값을 제공한다.
  • merge : 실행 데이터 파일 세트(.exec)를 단일 파일로 병합한다.
  • report : 단일 프로젝트 테스트를 마치면 생성되는 코드 검사 보고서를 다양한 형식 중에서 선택 할 수 있게 한다.
  • report-integration : report와 비슷하지만 통합 테스트에 적합한 기본값을 제공한다.
  • report-aggregate : Reactor 내의 여러 프로젝트에서 구조화된 보고서를 생성한다. 보고서는 해당 프로젝트가 의존하는 모듈에서 생선된다.
  • check : 코드 커버리지의 메트릭 충족 여부를 검사한다. 메트릭은 테스트 커버리지를 측정하는 데 필요한 지표를 의미힌다. 메트릭은 check가 설정된 executrion 태그 내에서 rele을 통해 설정한다.
  • dump : TCP 서버 모드에서 실행 중인 JaCoCo 에이전트에서 TCP/IP를 통한 덤프를 생성한다.
  • instrument : 오프라인 측정을 수행하는 명령이다. 테스트를 실행한 후 restore-instrumented-classes Goal로 원본 클래스 파일들을 저장해야 한다.
  • restore-instrumented-class : 오프라인 측정 전 원본 파일을 저장하는 기능을 수행한다.

JaCoCo - Rule

Rule은 configuration 태그 안에서 설정하고 다양한 속성을 활용할 수 있다.

먼저 Element는 코드 커버리지를 체크하는 데 필요한 범위 기준을 설정한다. 여기서 사용 가능한 속성은 6가지이다.

  • BUNDLE(기본값) : 패키지 번들(프로젝트 내 모든 파일)
  • PACKAGE : 패키지
  • CLASS : 클래스
  • GROUP : 논리적 번들 그룹
  • SOURCEFILE : 소스 파일
  • METHOD : 메서드

기본값인 BUNDLE은 Element를 기준으로 limits 태그 내 counter와 value를 활용해 커버리지측정 단위와 방식을 설정한다.

counter는 커버리지를 측정하는 데 사용하는 지표이다. Counter에서 사용할 수 있는 커버리지 측정 단위는 6가지 이다.

  • LINE : 빈 줄을 제외한 실제 코드의 라인 수
  • BRANCH : 조건문 등의 분기 수
  • CLASS : 클래스 수
  • METHOD : 메서드 수
  • INSTRUCTION(기본값) : 자바의 바이트코드 명령 수
  • COMPLEXITY : 복잡도, 복잡도는 맥케이브 순환 복잡도 정의를 따른다.

마지막으로 Value 태그로는 커버리지 지표를 설정한다. 측정한 커버리지를 어떤 방식으로 보여주는지 설정하고 5가지 중 선택할 수 있다.

  • TOTALCOUNT : 전체 개수
  • MISSEDCOUNT : 커버되지 않는 개수
  • COVEREDCOUNT : 커버된 개수
  • MISSEDRATIO : 커버되지 않은 비율
  • COVEREDRATIO(기본값) : 커버된 비율

이 정보로 맨 위의 코드를 보면,

  • 패키지 번들 단위로 바이트코드 명령 수를 기준으로 커버리지가 최소 80% 달성하는 것을 limit으로 설정했다.

  • 메서드 단위로 전체 라인 수를 최대 50줄로 설정했다. 이 기준을 벗어나면 에러가 발생한다.

JaCoCo 테스트 커버리지 확인

JaCoCo 플러그인으로 테스트 커버리지를 측정하려면 메이븐의 테스트 단계가 선행되어야 한다. 따라서 JaCoCo는 test 단계 뒤에 있는 package 단계에서 실행할 수 있다.

package를 더블클릭하여 빌드를 진행하면, target 폴더 내 site - jacoco 폴더가 생성된다. 만약 정상 동작하지 않는다면 프로젝트 경로에 한글이 없는지 확인하기!

profile
One-step, one-step, steadily growing developer

0개의 댓글