Backend/Java

JaCoCo 설정하기

Seyun(Marco) 2020. 9. 23. 00:52
728x90

Jacoco 설정하기

예제코드

Jacoco란?

  • Java 코드의 커버리지를 체크하는 라이브러리다.
  • 커버리지 결과를 눈으로 보기 좋도록 html, xml, csv 같은 report로 생성한다.
  • 또한 테스트 결과가 내가 설정한 커버리지 기준을 만족하는지 확인하는 기능도 있다.

JaCoCo 플러그인 추가

apply plugin: 'jacoco'

jacoco {
    toolVersion = '0.8.6' // 현재 최신 버전
}
  • 버전을 명시하면 jaCoCo를 사용할 수 있다.
  • 이걸 추가하고 gradle 새로고침을 실행하면 아래와 같이 jaCoCo Task가 생성된다.

jacoco-basic-1

JaCoCo Gradle Task

jacocoTestReport

  • 커버리지 결과를 사람이 읽기 좋은 형태의 리포트(html, csv, xml)로 저장한다.
jacocoTestReport {
  reports {
    html.enabled true
    xml.enabled false
    csv.enabled false

        html.destination file("$buildDir/jacocoHtml")
        xml.destination file("$buildDir/jacoco.xml")
        csv.destination file("$buildDir/jacoco.csv")
  }
}
  • enabled를 이용해 원하는 결과물을 켜는 것과 끌수 있다.
  • 또한 destination을 이용해 저장 경로를 설정할 수 있다.
  • default 값은 아래와 같다.
  • build/reports/jacoco/test/html // html 파일
  • build/reports/jacoco/test // csv, xml 파일

jacoco-basic-2

jacocoTestCoverageVerification

  • 내가 원하는 커버리지 기준을 만족하는지 확인한다.
jacocoTestCoverageVerification {
violationRules {
        rule {
            enabled = true
            element = 'BUNDLE'

            limit {
                counter = 'LINE'
                value = 'COVEREDRATIO'
                minimum = 0.70
            }

            excludes = []
        }
}
  • 위와 같이 커버리지 만족하는 기준을 설정할 수 있다.
  • element
    • 커버리지 체크의 기준을 설정한다.
    • BUNDLE (default), PACKAGE, CLASS , SOURCEFILE, METHOD
  • counter
    • 어느 기준을 가지고 계산을 할지를 설정한다.
    • LINE, BRANCH(조건문 등 분기 수), CLASS, METHOD, INSTRUCTION(default, Java 바이트 명령 수), COMPLEXITY(복잡도)
  • value
    • 어느 비율 및 개수로 기준을 정할지 설정한다.
    • TOTALCOUNT, MISSDCOUNT, COVEREDCOUNT, MISSEDATIO, COVERDRATIO(default)
  • minimum
    • 최솟값
  • maximum
    • 최댓값
  • excludes
    • 제외할 패키지 및 클래스를 설정한다.
  • 따라서 위에서 설정한 값은 BUNDLE를 기준으로 라인 코드 커버리지가 70% 이상이 되어야 설정이 가능하다라는 의미이다.
  • 또한 특징은 커버리지 수치는 자동으로 BigDecimal 설정이 된다. 즉, 내가 0.80을 사용한다면 결과가 0.42라고 했을 때 0.42라고 출력이 되고 0.8을 사용하면 0.4라고 표시된다.
  • 결론은 내가 지정한 유효자리수 까지만 표기가 되며 그 자리수를 넘어가면 반올림이 된다.
  • 또한 여러개의 규칙을 설정을 할 수 있다.
  • 브랜치 커버리지, 라인 커버리지 등등 element, counter, value를 잘 조합하여 원하는 방법을 선택할 수 있다.

JacocoTaskExtension

  • 자동으로 모든 Test 타입의 task에 JacocoTaskExtension을 추가한다.
  • 아래와 같이 defulat 값이 설정되어 있다.
test {
  jacoco {
    enabled = true
    destinationFile = file("$buildDir/jacoco/${name}.exec")
    includes = []
    excludes = []
    excludeClassLoaders = []
    includeNoLocationClasses = false
    sessionId = "<auto-generated value>"
    dumpOnExit = true
    classDumpDir = null
    output = JacocoTaskExtension.Output.FILE
    address = "localhost"
    port = 6300
    jmx = false
  }
}
  • 따로 적지 않아도 위와 같이 설정이 되어 있는데, 따로 설정하기 위해서는 test Task내부에 위와 같이 설정을 하면 자동으로 오버라이드가 된다.

finalizedBy

  • test task 실행 시 Jacoco task가 실행하도록 설정하는 값입니다.
test {
  // ... (생략) ...

  finalizedBy 'jacocoTestReport'
}

jacocoTestReport {
  // ... (생략) ...

  finalizedBy 'jacocoTestCoverageVerification'
}
  • 위와 같이 설정을 하면 test task가 실행될 때 마다 자동으로 jacocoTestReport, jacocoTestCoverageVerification task가 실행이 된다.

결과물

테스트 코드 작성

package test.jacoco.ex;

public class Member {
    private String name;

    private int age;

    public Member(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}
package test.jacoco.ex;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

class MemberTest {

    @DisplayName("생성자 테스트")
    @Test
    void constructorTest() {
        Member member = new Member("rutgo", 28);

        assertEquals(member.getName(), "rutgo");
        assertEquals(member.getAge(), 28);
    }
}

성공

  • 결과물로 나온 index.html을 실행하면 아래와 같이 보기 편하도록 테스트 결과가 나오게 된다.

jacoco-basic-3

  • 만들어진 html 리포트를 브라우저로 열면 다음과 같이 각 커버리지 항목 마다 총 개수와 놓친 개수를 표시해 줍니다.

실패

  • 아래와 같이 새로운 클래스를 만들고 실행하면 아래와 같이 테스트 기준에 맞추지 못했다고 나온다.
package test.jacoco.ex;

public class Book {
    private String title;

    private Member author;

    public Book(String title, Member author) {
        this.title = title;
        this.author = author;
    }

    public String getTitle() {
        return title;
    }

    public Member getAuthor() {
        return author;
    }
}
  • 빌드에서 원하는 기준에 못미쳤을 경우에는 아래와 같이 콘솔이 출력된다.

jacoco-basic-4

참고자료

Gradle 프로젝트에 JaCoCo 설정하기 - 우아한형제들 기술 블로그

728x90
728x90