JaCoCo, Codecov 적용

Jimin Lim·2022년 12월 2일
0

Test Code

목록 보기
4/4
post-thumbnail

이번 YAPP 21기를 진행하면서 세웠던 목표 중 하나는 테스트 코드에 신경쓰는 것이다. 테스트 코드를 작성하지 않다보니 기존 잘 동작했던 코드가 계속 수정하다보면 믿을 수 없는 코드가 되고, 또 다시 직접 테스트를 해봐야하는 번거로움이 존재하였다. 따라서 이번엔 테스트 코드를 제대로 작성해보고자 커버리지 분석 도구들을 적용해보았다.

✅ JaCoCo, CodeCov

➕ 참고로 소스코드 내부를 들여다보기에 화이트박스 테스트에 속한다.

  • Jacoco: Code Coverage 분석 도구, 커버리지 결과를 파일 형태로 저장 및 설정한 기준 확인
  • CodeCov: Code Coverage 툴, PR에서 커버리지를 바로 확인할 수 있도록 자동화

🔗 JaCoCo

Kotlin 17 과 함께 적용해보았다.

build.gradle.kts

plugins {
	...
    jacoco
}

jacoco {
    toolVersion = "0.8.8"
}
  • jacoco 플러그인 추가를 해준다. 이때, jacoco와 호환되는 언어 버전을 확인 후 toolVersion에 작성해야한다.
tasks.withType<Test> {
	...
    finalizedBy("jacocoTestReport")
}

tasks.jacocoTestReport {
    reports {
        html.required.set(true)
        xml.required.set(true)
        csv.required.set(false)
    }

    classDirectories.setFrom(
            sourceSets.main.get().output.asFileTree.matching {
                exclude("**/Web2ApplicationKt*")
            }
    )

    finalizedBy("jacocoTestCoverageVerification")
}

tasks.jacocoTestCoverageVerification {
    violationRules {
        rule {
            enabled = true
            element = "CLASS"

            limit {
                counter = "BRANCH"
                value = "COVEREDRATIO"
                minimum = "0.80".toBigDecimal()
            }
        }
    }
}

val testCoverage by tasks.registering {
    group = "verification"
    description = "Runs the unit tests with coverage"

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

    tasks["jacocoTestReport"].mustRunAfter(tasks["test"])
    tasks["jacocoTestCoverageVerification"].mustRunAfter(tasks["jacocoTestReport"])
}
  • jacocoTestReport: 리포트로 저장 방식 설정, exclude로 제외할 파일 설정 가능
  • jacocoTestCoverageVerification: 커버리지 기준 설정
  • testCoverage: jacocoTestReport, jacocoTestCoverageVerification 를 하나로 묶는 task
  • finalizedBy 로 test task 실행시 자동으로 JaCoCo task가 실행되도록 해줌

🔗 Codecov

codecov.yml
codecov에서 읽어가는 파일로, PR에서 Comment 남기는 기능을 추가하기 위해 작성하였다. 루트에 추가한 후, 아래와 같이 특별한 추가 없이 작성해주었다.

codecov:
  require_ci_to_pass: yes

comment:
  layout: "reach,diff,flags,files,footer"
  behavior: default
  require_changes: false
  branches:
    - develop
    - feature/issue-4

codecov-test.yml
Github Actions의 workflow 파일이며, PR을 날린다면 Codecov에 jacoco가 생성한 report 파일을 업로드하도록 한다.

public 레포라면 Github 토큰이 필요하지 않지만, private이라면 필요하다고 한다. 작업하는 레포는 public 이므로 토큰 관련 부분은 제외하였다.

name: Java CI with Gradle

on:
  pull_request:
    branches:
      - develop
      - feature/issue-4

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'adopt'

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: Build with Gradle
        run: ./gradlew build test

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v2
        with:
          file: ./build/reports/jacoco/test/jacocoTestReport.xml

또한 Organization에서 작업한다면, 따로 Github app에서 CodeCov 권한을 따로 request해줘야 한다. 관리자의 승인 후, PR에 comment가 달리는 것을 확인할 수 있다.


아직 develop에 커버리지가 업로드되지 않아 암것도 없지만 comment가 달리는 것을 확인할 수 있다!

🤍 참고자료

https://techblog.woowahan.com/2661/
https://stackoverflow.com/questions/62075448/jacoco-gradle-kotlin-dsl-exclude-file-from-violation-rules/72858353#72858353
https://jane514.tistory.com/12
https://docs.codecov.com/docs/team-bot

profile
💻 ☕️ 🏝 🍑 🍹 🏊‍♀️

0개의 댓글