Backend/프로젝트

JaCoCo 적용기 (Gradle)

동구름이 2024. 4. 16. 17:55

 JaCoCo는 Java 코드의 커버리지를 체크해주는 라이브러리입니다. JaCoCo를 통해 테스트 결과가 커버리지 기준을 충족하지 못하면 프로젝트 빌드가 실패하도록 설정할 수 있습니다. 또 테스트 커버리지 결과를 html 등의 리포트로 확인할 수 있습니다. 

 

 리팩토링 중인 프로젝트에 Jacoco를 도입해보았습니다.

 

 JaCoCo 공식 문서우아한 기술 블로그(Gradle 프로젝트에 JaCoCo 설정하기) 를 참고했습니다.

 

 

JaCoCo 플러그인 추가

우선 저는 Gradle 프로젝트에 해당 라이브러리를 추가했습니다.

 

build.gradle 설정에 아래 코드를 추가합니다.

plugins {
  id 'java'
    ...
  id 'jacoco'
}

jacoco {
  //JaCoCo 버전 (최신) 
  toolVersion = "0.8.11" 
}

 

위 JaCoCo Gradle 플러그인에는 jacocoTestReport와 jacocoTestCoverageVerification task가 있습니다.

 

 

테스트 리포트 저장(jacocoTestReport)

테스트 결과를 읽기 쉬운 형태의 리포트로 제공하는 것입니다. html. xml, csv 형태로 제공을 합니다. 저는 html만 true로 설정했습니다.

그리고 html.outputLocation을 설정하면, 해당 리포트가 저장되는 위치를 지정할 수 있습니다.


default 값은 /reports/jacoco 으로 공식 문서에 명시되어있습니다.

 

jacocoTestReport {
	reports {
		xml.required = false
		csv.required = false
		html.required = true
        // html.outputLocation = layout.buildDirectory.dir('jacocoHtml')
	}
}

 

테스트 커버리지 체크(jacocoTestCoverageVerification task)

원하는 커버리지 기준을 만족하는지 확인해 주는 task입니다. 

// 커버리지 검증
jacocoTestCoverageVerification {
	violationRules {
		rule {
			enabled = true //해당 rule의 활성화 여부를 boolean으로 나타냅니다. (default: true)
			element = 'CLASS' //측정의 큰 단위를 나타냅니다.

			// rule의 상세 설정을 나타내는 block
			limit {
				counter = 'LINE' //커버리지 측정의 최소 단위 (CLASS, METHOD, LINE, BRANCH 등)
				value = 'COVEREDRATIO'
				minimum = 0.6 // jacoco coverage verification 검증 기준 값 (0.00~1.00)
			}
		}
	}
}

 

해당 사항에 대해서는 코드의 주석으로 설명을 대신 하겠습니다.

 

 

 

task 순서 지정

JaCoCo의 문서에 따르면, report를 받기 위해서는, test task를 먼저 실행한 다음 jacoco task 가 실행되어야한다고 명시되어있습니다.

 

 

 그래서 JaCoCo의 리포트를 받기 위해 test -> jacocoTestReport -> jacocoTestCoverageVerification 순으로 task의 순서를 정리해줍니다. 이것은 finalizedBy 를 이용해 수정할 수 있습니다.

 

 Gradle에서 finalizedBy 메서드는 특정 작업이 완료된 후에 추가적인 작업을 실행할 수 있도록 지정하는 데 사용되는 메서드입니다. 이 메서드를 사용하면 한 작업이 완료된 후에 다른 작업을 실행할 수 있어서 빌드 프로세스를 더 세밀하게 제어할 수 있습니다. 

 

 그리고 테스트 시 JUnit이 함께 동작할 수 있도록 아래 설정을 해주어야합니다. test task에서는 JUnit을 사용한다고 Gradle에 알려주는 것입니다.

test {
  useJUnitPlatform()
}

 

 

결과적으로 순서를 정리하면 아래와 같습니다.

1.

test {
	finalizedBy jacocoTestReport //test 다음 jacocoTestReport 실행
	useJUnitPlatform()
	jacoco {
		excludes = [ //테스트 커버리지 측정에서 제외

		]
	}
}

 

 

2.

jacocoTestReport {
	reports {
		xml.required = false
		csv.required = false
		html.required = true
	}
	finalizedBy jacocoTestCoverageVerification
}

 

 

3.

// 커버리지 검증
jacocoTestCoverageVerification {
	violationRules {
		rule {
			enabled = true
			element = 'CLASS'

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

 

 

 

 

테스트 코드 작성 및 결과 확인

이제 테스트 코드를 실행하면 결과를 확인할 수 있습니다.

 

 

 

저는 리팩토링 전, 임시로 하나의 도메인에 대한 테스트를 작성해보았습니다. 위 결과는 build -> reports -> jacoco에서 확인할 수 있습니다.

 

그리고 코드 줄 별로도 확인할 수가 있습니다.

 

테스트 코드가 통과한 줄은 초록, 아니면 빨간색으로 표시되어 나타납니다. 노란색은 절반만 통과한 것입니다.

 

 

 

이렇게 gradle 프로젝트에 JaCoCo를 설정하는 방법을 간단히 알아보았습니다.!

 

 

 

 

참고자료

The JaCoCo Plugin
https://docs.gradle.org/current/userguide/jacoco_plugin.html#header

Gradle 프로젝트에 JaCoCo 설정하기
https://techblog.woowahan.com/2661/

좌충우돌 Jacoco 적용기
https://bottom-to-top.tistory.com/36