Posts Jacoco를 이용한 코드 커버리지 관리
Post
Cancel

Jacoco를 이용한 코드 커버리지 관리

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

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

코드 커버리지란?

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

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

1
2
3
4
5
6
7
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 추가 ```xml
    org.jacoco jacoco-maven-plugin 0.8.7 **/*com/my/toyproject/*Application.class prepare-agent reporttest report org.apache.maven.plugins maven-surefire-plugin 2.22.2 true

    ```

  • 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
    • 각 패키지별로 코드 커버리지가 나온다!!
This post is licensed under CC BY 4.0 by the author.