본문 바로가기

Monew

Jacoco를 활용하기 (테스트 커버리지)

코드 커버리지 도구 Jacoco

Java code coverage tools

Jacoco를 활용해서 Pull Request를 할때마다 테스트 커버리지 확인하기

 

* 코드 커버리지(code coverage) : 소프트웨어의 테스트를 논할 때 얼마나 테스트가 충분한가를 나타내는 지표. 소프트웨어 테스트를 진행했을 때 코드 자체가 얼마나 실행되었는가를 뜻한다

 

테스트코드를 꼼꼼하게 작성할수록 예외 케이스들을 잘 탐지할 수 있으며, 소프트웨어의 품질을 높이기 위해선 테스트 커버리지가 너무 낮지 않게끔 해야한다.

 

 

Jacoco 적용

build.gradle에 적용시키기

# 1단계, jacoco 플러그인 설치
plugins {
	id 'jacoco'
}

# 2단계, 테스트가 완료된 후 jacocoTestReport가 실행되도록 함
test { 
	finalizedBy jacocoTestReport
}

# 3단계, jacoco 버전 설정
jacoco {
	toolVersion = "0.8.12"
}

# 4단계, jacocoTestReport가 실행되기 전에 test가 실행되도록 설정하고,
# 코드 커버리지 보고서를 xml 형식으로 생성하도록 설정함(Pull Request에서 커버리지 결과 보기 용이)
jacocoTestReport {
	dependsOn test
    reports {
    	xml.required.set(true)
    }
}

 

 

GitHub Actions 스크립트 작성하기

jacoco 커버리지 지표를 Pull Request에 남기기 위해서 github actions 스크립트를 작성함

name: Jacoco Test Coverage Check

# 1단계
on:
  pull_request:
    types: [opened, synchronize, reopened]
    
# 2단계
permissions: write-all

# 3단계
jobs:
  test:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v3 # 3-1단계
        with: 
          fetch-depth:0
          
      - name: Set up JDK 17 # 3-2단계
        uses: actions/setup-java@v3
        with:
          distribution: 'adopt'
          java-version: '17'
          
      - name: Create and inject jasypt secret into application-secret.properties # 3-3단계
        run: |
          touch ./src/main/resources/application-secret.properties
          echo "ENCRYPT_KEY=${{ secrets.ENCRYPT_KEY }}" > ./src/main/resources/application-secret.properties
          cat ./src/main/resources/application-secret.properties
          
      - name: Grant execute permission for gradlew # 3-4단계
        run: chmod +x gradlew
        
      - name: Test with Gradle # 3-5단계
        run: |
          export ENCRYPT_KEY=${{ secrets.ENCRYPT_KEY }}
          ./gradlew --info test
          
      - name: Test Coverage Report # 3-6단계
        id: jacoco
        uses: madrapps/jacoco-report@v1.7.1
        with: 
          title: Test Coverage Report
          paths: ${{ github.workspace }}/build/reports/jacoco/test/jacocoTestReport.xml
          token: ${{ secrets.GITHUB_TOKEN }}
          min-coverage-overall: 30
          min-coverage-changed-files: 50

 

1단계 : Pull Request가 열리거나, 업데이트 되거나, 다시 열릴때마다 워크플로우가 실행되도록 함

 

2단계 : 모든 범위에 대해 쓰기 권한을 부여함. Pull Request의 코멘트에 쓰기 위해 필요함

 

3 - 1단계 :  actions/checkout 액션을 사용하여 현재 리포지토리의 코드를 체크하고, fetch-depth: 0을 설정하여 모든 커밋 목록을 가져옴

3 - 2단계 : JDK를 설정함

3 - 3단계 : Jasypt키를 ENCRYPT_KEY로 관리한다면 이를 주입해주는 단계 << 참고 사이트 기준

3 - 4단계 : gradlew 실행 권한 부여

3 - 5단계 : ENCRYPT_KEY를 주입하고 테스트를 실행하기 (info 플래그는 실행 정보 출력을 제공함)

3 - 6단계 : Jacoco 테스트 커버리지 보고서를 생성하는 핵심 단계.

github.workspace와 secrets.GITHUB_TOKEN은 GitHub Actions에서 자동으로 제공해준다.

또한 전체 파일의 최소 커버리지(min-coverage-overall)와 변경된 파일의 최소 커버리지(min-coverage-changed-files) 설정 가능 (두개 모두 기본값은 80%임)

  - jacocoTestReport에서 path를 별도로 지정할 수 있으며, 별도로 지정하지 않았다면 위 경로로 사용하면 된다고 함

  - uses의 버전을 확인하는 곳 : https://github.com/Madrapps/jacoco-report

 

 

이후에 GitHub 리포지토리에서 Settings - > Actions - > General - > Workflow permissions에 들어간 다음, Read and Write permissions를 체크해줘야한다.

 

그리고 Pull Request가 실행되면, 테스트 커버리지를 확인할 수 있다고 한다. (워크플로우 실행 후 확인 가능)

 

 

lombok.config 작성

마지막으로 lombok이 작성한 메서드(@Getter, @Setter, ...)에 대해서도 커버리지를 포함하지 않기 위해선 프로젝트 루트 단에 lombok.config를 추가하여 작성하면 된다고 한다.

lombok.addLombokGeneratedAnnotation = true

 

그럼 정상적인 테스트 커버리지를 확보할 수 있다고 합니다.

 

 

출처 : https://devwriter.tistory.com/58

'Monew' 카테고리의 다른 글

CI(지속적 통합) 작성  (0) 2025.09.12
build.gradle  (0) 2025.09.04
커밋 컨벤션 : Git Commit Template 플러그인 설치  (0) 2025.09.04
CI/CD(지속적 통합 및 지속적 배포) 파이프라인  (0) 2025.09.04
9월 3일  (0) 2025.09.03