TIL

[Kotlin + SpringBoot] JaCoCo 추가하기

coding-orange 2024. 5. 21. 13:21
728x90
코틀린으로 만들어진 스프링부트 프로젝트에서 jacoco를 추가하는 방법을 알아보자.

 

 

 

1. JaCoCo란?

JaCoCo(Java Code Coverage)는 자바 프로그램의 코드 커버리지를 측정하기 위한 오픈 소스 도구이다. 코드 커버리지는 테스트가 코드의 몇 퍼센트를 실행하는지를 측정하는 지표이다. JaCoco로 다음과 같은 작업을 수행할 수 있다.

 


코드 커버리지 분석

  • JaCoCo는 어떤 코드가 테스트되었는지, 어떤 코드가 테스트되지 않았는지를 보여준다. 이를 통해 테스트가 부족한 부분을 찾아낼 수 있다.

 

리포트 생성

  • JaCoCo는 HTML, XML, CSV 등 다양한 형식의 리포트를 생성하여 커버리지 결과를 시각적으로 제공한다.

 

CI/CD 통합

  • JaCoCo는 Jenkins, GitLab CI/CD 등 다양한 지속적 통합 및 배포 도구와 쉽게 통합될 수 있다. 이를 통해 빌드 파이프라인에서 자동으로 커버리지 리포트를 생성할 수 있다.

 

테스트 품질 향상

  • JaCoCo를 사용하면 테스트의 품질을 높이고, 중요한 코드가 테스트되지 않는 상황을 방지할 수 있다.

 

 


 

 

 

2. Kotlin + SpringBoot 프로젝트에 JaCoCo 추가하기

build.gradle.kts에 다음과 같이 작성 혹은 추가한다.

plugin {
	id("jacoco") // jacoco 추가
}

tasks.withType<Test> {
	useJUnitPlatform()
	finalizedBy("jacocoTestReport") // 테스트 후에 JaCoCo 리포트 생성
}

tasks.jacocoTestReport {
	dependsOn(tasks.test) // 테스트 후에 JaCoCo 리포트 생성

	reports {
		xml.required.set(true)
		html.required.set(true)
	}
}

 

JUnit5 관련 내용도 추가한다.

dependencies {

	// JUnit5
	testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.0")
	testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.0")

	testImplementation("org.springframework.boot:spring-boot-starter-test") {
		exclude(group = "junit", module = "junit")  // JUnit4 의존성 제외
		exclude(group = "org.mockito", module = "mockito-core")  // Mockito 1.x 제외
	}
}

 

 

전체 build.gradle.kts는 다음과 같다.

더보기
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
	id("org.springframework.boot") version "3.2.3"
	id("io.spring.dependency-management") version "1.1.4"
	kotlin("jvm") version "1.9.22"
	kotlin("plugin.spring") version "1.9.22"
	kotlin("plugin.jpa") version "1.9.22"
	id("jacoco")
}

group = "com.capston"
version = "0.0.1-SNAPSHOT"

java {
	sourceCompatibility = JavaVersion.VERSION_17
}

configurations {
	compileOnly {
		extendsFrom(configurations.annotationProcessor.get())
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation("org.springframework.boot:spring-boot-starter-data-jpa")
	implementation("org.springframework.boot:spring-boot-starter-validation")
	implementation("org.springframework.boot:spring-boot-starter-web")
	implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
	implementation("org.jetbrains.kotlin:kotlin-reflect")

	// JWT
	implementation("io.jsonwebtoken:jjwt-api:0.11.2")
	runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.2")
	runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.2")

	// Security
	implementation("org.springframework.boot:spring-boot-starter-security")

	// JUnit5
	testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.0")
	testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.0")

	compileOnly("org.projectlombok:lombok")
	runtimeOnly("com.mysql:mysql-connector-j")
	annotationProcessor("org.projectlombok:lombok")
	testImplementation("org.springframework.boot:spring-boot-starter-test") {
		exclude(group = "junit", module = "junit")  // JUnit4 의존성 제외
		exclude(group = "org.mockito", module = "mockito-core")  // Mockito 1.x 제외
	}
}

tasks.withType<KotlinCompile> {
	kotlinOptions {
		freeCompilerArgs += "-Xjsr305=strict"
		jvmTarget = "17"
	}
}

tasks.withType<Test> {
	useJUnitPlatform()
	finalizedBy("jacocoTestReport") // 테스트 후에 JaCoCo 리포트 생성
}

tasks.jacocoTestReport {
	dependsOn(tasks.test) // 테스트 후에 JaCoCo 리포트 생성

	reports {
		xml.required.set(true)
		html.required.set(true)
	}
}

tasks {
	val bootJar by getting(org.springframework.boot.gradle.tasks.bundling.BootJar::class) {
		archiveFileName.set("app.jar")
	}
}

 

 

 

 


 

 

 

3. Report 생성과 확인

Report 생성  : IntelliJ 오른쪽 Gradle 탭 - Tasks - verification - jacocoTestReport

 

 

Report 확인 : build/reports/test/index.html 

 

728x90