DevOps

[CI/CD] Gitlab-ci.yml 작성 예제 - Jacoco

네른 2022. 4. 29. 21:11

이번엔 Jacoco.

Jacoco또한 Java 테스팅 툴로, 앞서 작성한 JUnit의 테스트 코드를 그대로 사용하게 됨

해당 코드를 이용해서 전체 프로그램, 클래스의 커버리지(Coverage) 테스트를 진행할 수 있음

 

JUnit과 마찬가지로, Gradle 셋팅부터 시작


 plugins {
   id 'java'
   id 'application'
   id 'jacoco' // 해당 내용 추가
 }
 
 jacoco {
   toolVersion = 'Jacoco의 버전'
 }
 
 jacocoTestReport {
   reports {
     // xml.enabled = true // 설정에 따라 xml 혹은 csv로 레포트를 받을 수 있음
     csv.enabled // 여기서는 csv로 결과를 받기로 함. 추후 있을 gitlab-ci를 위해
     // xml.destination file("${buildDir}/jacocoCsv") 
     csv.destination file("${buildDir}/jacocoCsv") // 레포트 생성 경로 지정
   }
 }
 
 // 하단의 내용을 통해 커버리지 테스트를 설정
 jacocoTestCoverageVerification {
   violationRules {
     rule {
       element = 'METHOD' // 커버리지 체크의 단위. CLASS, METHOD 등의 단위로 체크
 
       limit {
         counter = 'BRANCH'  // 커버리지 측정 시 퍼센테이지의 기준을 정함. LINE, INSTRUCTION, BRANCH 등
         value = 'COVEREDRATIO' // 결과를 나타내는 방식을 지정. TOTALCOUNT, COVEREDRATIO 등
         minimum = 0.5 // 테스트 통과 기준. 여기서는 코드가 커버된 비율(COVEREDRATIO)이 기준이므로 0~1 사이의 값
       }
     }
    rule {  // rule은 여러개일 수 있음.
       element = 'METHOD' // 다음으로 체크할 룰을 정의
 
       limit {
         counter = 'LINE' // 이번 기준은 LINE
         value = 'TOTALCOUNT' // 전체 몇 줄 이상의 라인이 실행되었는지
         minimum = 20 // 20줄.
       }
     }
   }
 }
 
 test { // test라는 작업을 실행하면 JacocoTestReport가 순차적으로 진행되도록 설정.
   finalizedBy("jacocoTestReport")
   }
 
 jacocoTestReport { // 마찬가지로, JacocoTestReport가 완료되면 순차적으로 실행될 업무를 설정.
   finalizedBy("jacocoTestCoverageVerification")
 }

 

이후, 테스트는 앞선 JUnit과 마찬가지로 gradle check/test jacocoTestReport 라는 명령어로 수행이 가능함.

 


이 테스트를 gitlab-ci.yml에 적용하기

Jacoco는 gitlab에서 별도로 플러그인을 제공하지는 않는 것으로 보임.

이에, 별도의 레포트를 직접 생성하고 export하여 볼 수 있도록 해야 함!

 

 image: gradle:latest
 stages:
   - coverage_test
 coverage_test:
   stage: test
   script:
     - gradle check jacocoTestReport // gradle을 이용한 테스트 진행 및 결과 리포트 생성 
     - awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print covered, "/", instructions, " instructions covered"; print 100*covered/instructions, "% covered" }' build/jacocoCsv // 생성된 리포트를 파싱하여 gitlab상에서 확인할 수 있도록 적용
   tags:
    - ci

매우 간단함. gradle check 명령어로 테스트를 수행하면, 앞선 설정으로 인해 특정 경로에 csv 파일이 생성 됨

이 를 awk로 읽어와서 커버리지만 출력하도록 하는 것.

위와 같이 작성하면 하단의 그림처럼 테스트 결과 우측에 커버리지 퍼센트를 볼 수 있음.

만약 커버리지의 기준을 못넘었다면 Fail로 뜨게 됨.


추가로, 이러한 테스트 내용을 gitlab에 뱃지로 표시할 수 있음

https://docs.gitlab.com/ee/ci/pipelines/settings.html#pipeline-badges

 

Customize pipeline configuration | GitLab

Documentation for GitLab Community Edition, GitLab Enterprise Edition, Omnibus GitLab, and GitLab Runner.

docs.gitlab.com

Readme.md 파일에 아래와같이 결과를 출력할 수 있음.