본문 바로가기
Tech/Test

Jacoco를 이용해 테스트 커버리지 관리해보자

반응형

코드 커버리지 관리의 필요성

  • 테스트 코드를 열심히 작성하고 있었는데 하필 딱! 실수로 테스트 코드가 작성되지 않은 로직에 대한 변경이 발생했고, 이 변경으로 인해 부작용이 발생한다면?
  • 코드 커버리지를 관리하게되면 이러한 불안감을 해소해준다.

 

코드 커버리지란?

  • 테스트 케이스가 얼마나 충족 되었는지를 나타내는 지표
  • 즉 테스트를 진행하였을 때 코드 자체가 얼마나 실행되었느냐는 내용

 

커버리지 계산 ( 대표, 구문 커버리지 )

void test(int num) {
    system.out.println(“a line”); // 1
    if (num < 0) { // 2
        system.out.println(“b line”); // 3
    }
    system.out.println(“c line”); // 4
}
  • 코드 한 줄이 한 번 이상 실행된다면 충족된다.
  • 즉 num을 양수(0이상)만 테스트를 한다면 if문 안의 구문 “b line”은 실행되지 않으므로 코드 커버리지는 3/4 * 100 = 75% ( 3번줄은 실행되지 않았으니까 )

 

자바 코드 커버리지 분석 도구 :: Jacoco

  • 자바 코드 커버리지를 체크하는 데에 사용되는 오픈소스 라이브러리
  • 선정 이유
    • 레퍼런스가 많다.
    • 사용방법이 간단하다
  • 적용하기
    • Maven plugin 추가
    <plugin>
      <groupId>org.jacoco</groupId>
      <artifactId>jacoco-maven-plugin</artifactId>
      <version>0.8.7</version>
      <configuration>
        <excludes>
          <!-- Exclude class from test coverage -->
          <exclude>**/*com/my/toyproject/*Application.class</exclude>
        </excludes>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>prepare-agent</goal>
          </goals>
        </execution>
        <execution>
          <id>report</id>
          <phase>test</phase>
          <goals>
            <goal>report</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <!-- 테스트 실패시에도 mvn 커맨드가 실패 처리되지 않도록 설정 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.22.2</version>
      <configuration>
        <testFailureIgnore>true</testFailureIgnore>
      </configuration>
    </plugin>

 

  • Jacoco Execution Goal
    • help: jacoco-maven-plugin의 도움말을 보여주는 명령입니다.
    • prepare-agent: 테스트 중인 어플리케이션에서 인수를 전달하는 JaCoCo Runtime Agent에 대한 property를 준비하는 명령입니다.
    • prepare-agent-integration: prepare-agent와 같은 기능을 하지만 integration test에 대해서 기본 설정 값들을 제공하는 명령입니다.
    • merge: 여러 개의 실행 데이터 파일들을 하나의 파일들로 통합하는 명령입니다.
    • report: 하나의 프로젝트의 테스트에 대한 code coverage 리포트를 생성하는 명령입니다.
    • report-integration: report와 같은 기능을 하지만 integration test에 대해서 기본 설정 값들을 제공하는 명령입니다.
    • aggregate: reacter 안에 있는 여러 프로젝트로부터 code coverage 리포트를 생성하는 명령입니다.
    • check: code coverage metric이 충돌하는지 확인하는 명령입니다.
    • dump: TCP 서버 모드에서 실행중인 JaCoCo Agent로부터 TCP/IP 덤프(dump)를 요청하는 명령입니다.
    • instrument: 오프라인 측정을 수행하는 명령. 테스트 실행 후 ‘restore-instrumented-classes’ 명령으로 원본 클래스 파일들을 저장해야 합니다.
    • restore-instrumented-class: 오프라인 측정 이전에 원본 파일들을 저장하는 명령입니다.

 

  • Maven Jacoco lifecycle
    • validate > compile > test > package > install > deploy
    • test, phase 이후에 JaCoCo 플러그인에 의해 테스트 커버리지 측정이 가능하므로, package 이상부터 가능합니다.

 

  • Jacoco 분석 결과
    • /target/site/jacoco/index.html
    • 각 패키지별로 코드 커버리지가 나온다!!
728x90
반응형

'Tech > Test' 카테고리의 다른 글

Embedded MySQL를 이용해 테스트 환경 구축해보기  (0) 2021.09.29
JsonPath란?  (0) 2021.09.06
JUnit 5 공식 레퍼런스  (0) 2021.08.25
Mockito vs BDDMockito  (0) 2021.08.12