이번 YAPP 21기를 진행하면서 세웠던 목표 중 하나는 테스트 코드에 신경쓰는 것이다. 테스트 코드를 작성하지 않다보니 기존 잘 동작했던 코드가 계속 수정하다보면 믿을 수 없는 코드가 되고, 또 다시 직접 테스트를 해봐야하는 번거로움이 존재하였다. 따라서 이번엔 테스트 코드를 제대로 작성해보고자 커버리지 분석 도구들을 적용해보았다.
➕ 참고로 소스코드 내부를 들여다보기에 화이트박스 테스트에 속한다.
Kotlin 17 과 함께 적용해보았다.
build.gradle.kts
plugins {
...
jacoco
}
jacoco {
toolVersion = "0.8.8"
}
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"])
}
finalizedBy
로 test task 실행시 자동으로 JaCoCo task가 실행되도록 해줌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