[board #2] Jacoco

YoungHo-Cha·2022년 7월 17일
1

Catch Bug Project

목록 보기
1/12
post-thumbnail

오늘은 jacoco에 대해서 공부를하고 Jacoco를 적용할 것이다.


목차

  • 코드 커버리지란?
  • 코드 커버리지 측정 도구란?
  • Jacoco란?
  • Jacoco in Spring

코드 커버리지란?

코드 커버리지란 자바 코드를 얼마나 테스트를 하였는지 나타내는 지표 중 하나이다. 수치로 확인할 수 있다.

커버리지에 관련한 글

  1. ✅ 테스트 커버리지

  2. ✅ 좋은 테스트란?

  3. ✅ 단위 테스트

  4. ✅ 좋은 단위 테스트


코드 커버리지 측정 도구란?

코드 커버리지 측정 도구는 개발자가 직접 확인해야하는 테스트 요소를 대신해서 측정해주는 도구다. 단순히 측정 뿐만이 아닌, 추가적인 기능을 제공한다.

제공하는 기능

  1. 테스트 커버리지 경과를 html, csv, xml 등과 같은 파일로 Export 해준다.

  2. 설정한 커버리지 수치를 만족하지 못하면 배포가 불가능하게 할 수 있다.

  3. 설정한 커버리지 수치를 만족하지 못하면 빌드가 불가능하게 할 수 있다.


Jacoco란?

Jacoco는 수많은 측정 도구 중 하나이다.

가장 많은 레퍼런스를 가지고 있다. 그리고 가장 많은 점유율을 가지고 있으며, 오픈소스이다.

✅ Git Jacoco 레포지토리


Jacoco In Spring

Jacoco를 Spring에 적용해보자.

plugin을 추가한다.

plugins {
	id 'org.springframework.boot' version '2.7.1'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'

	//jacoco
	id 'jacoco'
}

jacoco 버전을 명시한다. (생략가능)

//jacoco 버전 명시
jacoco {
	toolVersion = '0.8.6'
}

이렇게하고 gradle을 새로고침하면 Task에 2개가 추가된다.

  • jacocoTestCoverageVerification

커버리지 기준을 확인해주는 Task다.

  • jacocoTestReport

커버리지 결과를 사람이 읽기 좋은 형태로 리포트 저장해주는 Task다.

jacocoTestReportsTask 설정

테스트 결과를 리포트 파일로 저장하기 위해서 설정을 해야한다.

jacoco는 html, csv, xml 형태를 지원해준다. csv나 xml은 소나큐브와 연동이 가능하다.

reports {
	html.enabled true
    csv.enabled true
    xml.enabled false
}
    	

html은 사람이 보기 좋아서 사용하고, csv는 소나큐브를 위해서 사용해보자!

  • 리포트 결과는 어디서 볼 수 있나?

리포트 결과는 기본적으로 다음의 경로로 저장된다.

${project.reporting.baseDir}/jacoco

리포트 결과 저장경로를 따로 설정해주고 싶으면 다음과 같이하자.

reports {
	html {
    	enable true
        destination file('build/reports/~~.html')
    }
}

jacocoTestCoverageVerification Task 설정

이게 핵심이다. 코드 커버리지에 대한 추 후 작업을 설정해주어야 한다.

jacocoTestCoverageVerification {
	violationRules {
		rule {
        	enable = true
			// 클래스 단위로 테스트 커버리지 측정
			element = 'CLASS'

			// 분기 커버리지 100%
			limit {
				counter = 'BRANCH'
				value = 'COVEREDRATIO'
				minimum = 1.00
			}

			// 문장 커버리지 80%
			limit {
				counter = 'LINE'
				value = 'COVEREDRATIO'
				minimum = 0.80
			}

			// 스프링 부트 메인 메소드 제외
			excludes = ['com.everyboard.board.BoardApplication']
		}
	}
  • enable

rule 활성화 여부를 나타내는 것이다. default 값은 true이다.

  • element

커버리지를 체크할 기준을 정하는 것이다. 6가지가 존재한다.

  1. BUNDLE : 패키지 번들
  2. CLASS : 클래스
  3. GROUP : 논리적 번들 그룹
  4. METHOD : 메서드
  5. PACKAGE : 패키지
  6. SOURCEFILE : 소스 파일
  • includes

해당 rule의 적용 대상을 package 수준으로 정의할 수 있다.

  • counter
    limit 메서드를 통해 지정할 수 있고, 커버리지 측정의 최소 단위를 설정하는 것이다.
  1. BRANCH : 조건문 등의 분기 수
  2. CLASS : 클래스 수, 내부 메서드가 1번이라도 실행하면 실행된 것으로 간주
  3. COMPLEXITY : 복잡도
  4. INSTRUCTION : Java 바이트코드 명령 수
  5. METHOD : 메서드 수
  6. LINE : 빈 줄을 제외한 실제 코드의 라인 수

DEFAULT는 INSTRUCTION이다.

  • value
    value는 limit 메서드를 통해서 지정할 수 있다. 측정한 커버리지를 어떠한 방식으로 보여줄 것인지를 말한다.
  1. COVEREDCOUNT : 커버된 개수
  2. COVEREDRATIO : 커버된 비율, 0~1사이로 표현가능하다.
  3. MISSEDCOUNT : 커버되지 않은 개수
  4. MISSEDRATIO : 커버되지 않은 비율, 0~1사이로 표현가능하다.
  5. TOTALCOUNT : 전체 개수

DEFAULT는 COVEREDRATIO이다.

  • minimum
    이 값을 통해서 jacocoTestCoverageVerification의 성공 여부가 결전된다.

  • exclueds
    커버리지를 제외할 클래스를 설정할 수 있다.

Tasks 순서 정하기

순서는

  1. test

  2. jacocoTestReport

  3. jacocoTestCoverageVerification

순서로 실행하여야 한다.

그러기 위해서는 "finalizedBy" 구문을 통해서 수행하여야 한다.

test {
	useJUnitPlatform()
    finalizedBy 'jacocoTestReport' //추가
}

jacocoTestReport {
 	...
	 finalizedBy 'jacocoTestCoverageVerification' // 추가
 
 }
profile
관심많은 영호입니다. 궁금한 거 있으시면 다음 익명 카톡으로 말씀해주시면 가능한 도와드리겠습니다! https://open.kakao.com/o/sE6T84kf

0개의 댓글