(+) jacoco

๊ฐœ์ธ์ ์œผ๋กœ ๋‹จ์ˆœํžˆ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ํผ์„ผํŠธ๊ฐ€ ๋†’๋‹ค๊ณ  ํ•ด์„œ 'ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ž˜ ์งœ์—ฌ์ ธ ์žˆ๋‹ค'๊ณ  ๋งํ• ์ˆ˜๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. jacoco ๊ฐ€ ์‹ค์ œ๋กœ ๋งŽ์€ ๋„์›€์ด ๋˜๋Š”์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์‹ค๋ฌด์—์„œ๋„ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์— ์ ์šฉ๋˜์–ด ์žˆ์—ˆ๋Š”๋ฐ, ํŠน๋ณ„ํžˆ ์ผ์ • ํผ์„ผํŠธ ๋ฐ‘์œผ๋กœ ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ•˜๊ฒŒ ํ•œ๋‹ค๋˜๊ฐ€ ํ•˜๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š์•˜์—ˆ๋‹ค.

์ผ๋‹จ ์˜ˆ์ „์— ์‹ค์Šต์œผ๋กœ ์„ธํŒ…ํ•ด๋‘” ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด์„œ ์—ฌ๊ธฐ ์ฒจ๋ถ€ํ•œ๋‹ค. gradle document ์—๋„ ์•ˆ๋‚ด๊ฐ€ ๋˜์–ด์žˆ๋‹ค.

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

group = 'me.fistkim101'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

jacoco {
    toolVersion = "0.8.6"
}

jacocoTestReport {
    reports {
        xml.enabled false
        csv.enabled false
        html.destination layout.buildDirectory.dir('jacocoHtml').get().asFile
    }

    dependsOn test // tests are required to run before generating the report
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.22'
    testImplementation group: 'org.testcontainers', name: 'mysql', version: '1.15.3'
    testImplementation group: 'org.testcontainers', name: 'junit-jupiter', version: '1.15.2'

}

test {
    useJUnitPlatform()
    finalizedBy jacocoTestReport
}

์ด๋ ‡๊ฒŒ ํ•ด๋‘๋ฉด test ๋ผ๋Š” Task ๊ฐ€ jacocoTestReport์— ์—ฐ๊ฒฐ๋œ๋‹ค. ์ฆ‰ test๋ฅผ ์‹คํ–‰ํ•˜๋ฉด test -> jacocoTestReport ๋กœ task์˜ ์˜์กด์„ฑ์ด ๋งบ์–ด์ ธ์„œ ์ž๋™์œผ๋กœ ํ๋ฆ„์ด ์ด์–ด์ง„๋‹ค. ๊ทธ๋ž˜์„œ test๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค build > jacocoHtml > index.html ์ด ์ƒˆ๋กœ ๊ฐฑ์‹ ๋˜๊ณ , ์—ฌ๊ธฐ์„œ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์›๋ฆฌ๋Š” jacoco๊ฐ€ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์„œ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋กœ ์ฒดํฌํ•ด์•ผํ•  ํฌ์ธํŠธ๋ฅผ ์„ธ์–ด ๋‘๊ณ  ํ…Œ์ŠคํŠธ์‹œ ํ•ด๋‹น ํฌ์ธํŠธ๋ฅผ ์ง€๋‚˜๊ฐ”๋Š”์ง€๋ฅผ ์ฒดํฌํ•ด์„œ ์ด๊ฑธ ๋ฐฑ๋ถ„์œจ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

  1. ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์‹œ JaCoCo ํ”Œ๋Ÿฌ๊ทธ์ธ ๋˜๋Š” ์„ค์ •์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผ๋œ ํด๋ž˜์Šค ํŒŒ์ผ์— JaCoCo์˜ ์—์ด์ „ํŠธ(agent)๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. JaCoCo ์—์ด์ „ํŠธ๋Š” JVM์— ์—ฐ๊ฒฐ๋˜์–ด ํด๋ž˜์Šค ํŒŒ์ผ์ด ๋กœ๋“œ๋˜๋Š” ์‹œ์ ์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ, ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  3. ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ JaCoCo ์—์ด์ „ํŠธ๋Š” ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ์ด๋ฅผ ๋ณด๊ณ ์„œ๋กœ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋„๊ตฌ์™€ ํ†ตํ•ฉํ•˜์—ฌ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ฑฐ์ณ๊ฐ„ ๋ถ€๋ถ„์€ ์ดˆ๋ก์ƒ‰, ๊ฑฐ์ณ๊ฐ€์ง€ ์•Š์€ ๋ถ€๋ถ„์€ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ์ฝ”๋“œ๋ฅผ line by line ์œผ๋กœ ๋ณด์—ฌ์ค€๋‹ค. ๋…ธ๋ž€์ƒ‰์€ ๋ถ„๊ธฐ๋ฌธ์—์„œ ์ผ๋ถ€๋งŒ ํ…Œ์ŠคํŠธ๊ฐ€ ๋˜์—ˆ์„ ๋•Œ์— ๋…ธ๋ž€์ƒ‰ ๋‹ค์ด์•„๋ชฌ๋“œ๊ฐ€ ๋‚˜์˜จ๋‹ค.

Last updated