728x90
Jacoco 설정하기
Jacoco란?
- Java 코드의 커버리지를 체크하는 라이브러리다.
- 커버리지 결과를 눈으로 보기 좋도록 html, xml, csv 같은 report로 생성한다.
- 또한 테스트 결과가 내가 설정한 커버리지 기준을 만족하는지 확인하는 기능도 있다.
JaCoCo 플러그인 추가
apply plugin: 'jacoco'
jacoco {
toolVersion = '0.8.6' // 현재 최신 버전
}
- 버전을 명시하면 jaCoCo를 사용할 수 있다.
- 이걸 추가하고 gradle 새로고침을 실행하면 아래와 같이 jaCoCo Task가 생성된다.
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 파일
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을 실행하면 아래와 같이 보기 편하도록 테스트 결과가 나오게 된다.
- 만들어진 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;
}
}
- 빌드에서 원하는 기준에 못미쳤을 경우에는 아래와 같이 콘솔이 출력된다.
참고자료
728x90
728x90
'Backend > Java' 카테고리의 다른 글
DTO(Data Transfer Object) vs VO(Value Object) (0) | 2020.11.16 |
---|---|
OCP와 전략패턴 (0) | 2020.11.15 |
lombok 사용법 - 2(@EqualsAndHashCode, @data, @NonNull, @Cleanup, Val, @Value, @builder, @SneakyThrows, @Log, @Synchronized) (0) | 2020.07.25 |
Lombok 사용법 1 (XXXArgsConstructor, Getter, Setter, ToString) (0) | 2020.07.16 |
Enum Field로 Instance 또는 Method를 사용해보자. (0) | 2020.06.26 |