사이드프로젝트 정리3 (Jacoco 설정)

JaCoCo란?

Jacoco는(Java Code Coverage)로 자바 코드 커버리지를 체크하는데 사용하는 오픈소스 라이브러리 입니다.
테스트 코드를 돌리고, 설정한 퍼센트만큼 커버하지 못한다면 빌드를 못하게끔 막을 수 있습니다.

적용한 이유는 제가짠 코드들이 어느정도 까지 커버를 하는지 궁금해서 적용시켜보았고, 어떤 코드가 필요가 없는지 눈으로 쉽게 파악하기 위해서 적용시켜 보았습니다.

적용하기

plugins{
	id 'jacoco'
}

jacoco {
	toolVersion = '0.8.7'
}

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

		//  각 리포트 타입 마다 리포트 저장 경로를 설정할 수 있다.
		html.destination file("$buildDir/jacocoHtml")
		xml.destination file("$buildDir/jacoco.xml")
	}

	finalizedBy 'jacocoTestCoverageVerification'
}

jacocoTestCoverageVerification {
	violationRules {
		rule {
			enabled = true
			element = 'CLASS'
			// includes = []

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

			excludes = []
		}
	}
}
  1. plugin에 jacoco를 추가해 줍니다
  2. jacoco 버전을 추가해줍니다
  3. jacocoTestReport는 테스트 결과를 설정하는 부분으로 다양항 형태의 파일 타입으로 받을 수 있습니다.
    여기서 finalizedBy는 테스트가 먼저 실행되고 나서 리포트 작성을 하게끔 하기 위해서 입니다
  4. jacocoTestCoverageVerification 은 커버리지 수준을 저으이 하는 부분입니다.
    커버리지 퍼센트(소수점) 이나, counter등의 설정을 할 수 있습니다.
    - enable : rule 활성화를 설정
    - element : 커버리지에서가장 큰 측정 단위입니다.(PACKAGE, CLASS, SOURCEFILE, METHOD가 있습니다)
    - counter : 커버리지의 최소 측정 단위입니다.(CLASS, METHOD, LINE, BRACH 있습니다)
    - value : 측정한 정보를 보여주는 방식을 설정합니다(TOTALCOUNT, COVEREDCOUNT, COVEREDRATIO 있습니다)
    - exclude : 커버리지 검증에서 제외할 클래스를 지정합니다(패키지레벨 경로입니다)

실행은 다음과 같은 명령어로 하면 됩니다(터미널에서 해당 프로젝트의 gradlew 가 있는 위치에서 실행시키면 됩니다)

./gradlew --console verbose test jacocoTestReport jacocoTestCoverageVerification

--console verbose : 실행되는 과정을 콘솔에서 볼 수 있습니다.

보시면 빌드에 실패한 것을 확인 할 수 있습니다. 이유는?

이런식으로 위에서 설정한 커버리지에 만족하지 못했기 때문입니다.

결과는 제가 설정한 경로에 따르면 build -> jacocoHtml 에서 확인할 수 있습니다.

맨 아래 index.html 파일을 누르면 전체 적인 커버 스토리지를 볼 수 있습니다.

보면 빨간색이 굉장히 많은데 저게 다 커버가 안됬다는 뜻입니다 ㅠㅠ
exclude 부분에 커버리지에 측정할 필요가 없는 더미데이터 부분을 추가해 놓지 않아서 그러한 부분까지 모두 측정되어 나온 것 같습니다(라고 위안을 삼습니다 ㅠㅠ)

그리고 여러 task를 한번에 실행 시킬 수 있습니다.

task testCoverage(type: Test) {
	group 'verification'
	description 'Runs the unit tests with coverage'

	dependsOn(':test',
			':jacocoTestReport',
			':jacocoTestCoverageVerification')

	tasks['jacocoTestReport'].mustRunAfter(tasks['test'])
	tasks['jacocoTestCoverageVerification'].mustRunAfter(tasks['jacocoTestReport'])
}

이렇게 적어주게 되면 jacocoTestReport와 jacocoTestCoverageVerification 를 한번에 지정해 줄 수 있습니다. 리포트 생성 후 -> 커버리지를 체크한다는 뜻입니다. 확인하면

보시면 TestReport 생성 후 coverateVerification이 실행됨을 알 수 있습니다.

혹시나 테스트 없이 빌드가 필요한 경우 다음과 같은 명령어로 빌드 할 수 있습니다.

./gradlew clean build -x test

-x test 는 테스트 없이 바로 클린 빌드 하겠다는 뜻 입니다.

출처
https://techblog.woowahan.com/2661/

좋은 웹페이지 즐겨찾기