본문 바로가기
관리자

Programming-[Backend]/Java

[TIL] Test Coverage Report - Jacoco, Codecov, Test Reporter

728x90
반응형

 

 

1.  Jacoco

Jacoco를 사용하면 build시 Test Coverage Report를 생성해준다. 코드 라인별로 테스트 코드에서 참조되어 사용되었는지 점검하고, if 분기문 등 모든 케이스에 대해 점검하기 때문에 혹시 빠뜨린 테스트가 없는지 살펴보는데도 도움이 된다.

 

gradle로 build를 하고나면 build/reports/tests/test/ 디렉토리에 index.html 이라는 coverage report를 만들어준다. 아래 사진 처럼 각 패키지별, 클래스별로 테스트 수, 성공/실패 여부, 성공률 및 자세한 내용을 알려준다. 세부 내용으로 들어가면 앞서 말한 바와 같이 내가 어떤 부분을 놓쳤는지 알 수 있기 때문에 견고한 소프트웨어를 만드는데 있어 필수라고 할 수 있다.

 

 

ref) https://velog.io/@lxxjn0/코드-분석-도구-적용기-1편-코드-커버리지Code-Coverage가-뭔가요

 

 

 

1.1 Jacoco 설치

build.gradle의 plugin으로 넣어주면 된다. 아래 코드는 Groovy 문법을 기준으로 작성하였다.

 

plugins {
    //...
    id 'jacoco'
}

//...

subprojects { //멀티 모듈 프로젝트인 경우
	//...
    apply plugin: 'jacoco'

    jacoco {
        toolVersion = '0.8.12'
    }
}

//jacoco 전용 task 추가
    jacocoTestReport {
    // test task 이후에 실행되도록 한다. test task에서 생성된 리포트를 참고하여 jacoco report가 만들어진다.
        dependsOn test
        reports {
            html.required = true
            xml.required = true
            csv.required = true
        }
		
        // test report에서 제외할 클래스들을 패턴으로 지정한다.
        afterEvaluate {
            classDirectories.setFrom(files(classDirectories.files.collect {
                fileTree(dir: it, excludes: ["**/*MapperImpl.class", "**/*Abstract.class", "**/*Application.class", "**/*Config.class", "**/*HandlerFilter.class", "**/Gzip*.class"])
            }))
        }
    }

    jacocoTestCoverageVerification {
		
        //JPA에 의해 생성되는 Q 클래스들을 제외하는 코드
        def Qdomains = []

        for (qPattern in '*.QA'..'*.QZ') { // qPattern = '*.QA', '*.QB', ... '*.QZ'
            Qdomains.add(qPattern + '*')
        }
		
        // Verification의 기준을 정한다.
        violationRules {
            rule {
                element = 'CLASS'
                limit {
                    counter = 'BRANCH'
                    value = 'COVEREDRATIO'
                    minimum = 0.80
                }

                limit {
                    counter = 'LINE'
                    value = 'COVEREDRATIO'
                    minimum = 0.70
                }

                limit {
                    counter = 'METHOD'
                    value = 'COVEREDRATIO'
                    minimum = 0.60
                }
                excludes = ["*.*Mapper*", "*.*Builder*", "*.*Config*", "*.*Application*", "**/*HandlerFilter", "**/*Gzip*"] + Qdomains
            }

            rule {
                element = 'METHOD'

                limit {
                    counter = 'LINE'
                    value = 'TOTALCOUNT'
                    maximum = 100
                }
            }
        }
    }

 

 

ref) https://cl8d.tistory.com/119

 

 

 

2. CodeCov

 

2.1 개요

Jacoco로 생성된 Report를 기준으로 github과 연동해준다. 시계열로 Test Coverage의 변화율을 저장하고 보여주기 때문에 팀원들에게 유지보수가 일어날 때마다 test coverage를 신경쓰게하고 테스트 코드가 부족한 부분을 체크할 수 있도록 알림을 줄 수 있다.

 

다음은 github PR에 codecov가 자동으로 comment를 남겨주는 예시이다.

 

 

 

Codecov는 유료이다! 설치는 복잡하지 않기 때문에 아래 사이트를 참조하면 될 것 같다.

 

ref) https://dublin-java.tistory.com/65

 

 

github workflow에서 실행되어야 하기 때문에, workflow용 yml 파일에 아래처럼 작성해주었다. CODECOV_TOKEN은 codecov로 부터 발급받은 토큰을 github의 repository secrets에 넣어두고 사용하는 것이다. if문은 codecov가 실패했을 경우에도 PR상 build는 통과되도록 always() 메서드를 실행한다.

- name: Upload coverage reports to Codecov
  uses: codecov/codecov-action@v4.0.1
  with:
    token: ${{ secrets.CODECOV_TOKEN }}
  if: ${{ always() }}

 

 

3. Test Reporter

github Action에서 테스트의 상세 내용을 UI와 함께 살펴볼 수 있도록 해준다.

 

 

Test Reporter도 github workflow에서 실행되는 plugin이다. 대략 아래처럼 설정해줬다.

- name: Test Reporter
  uses: dorny/test-reporter@v1.9.1
  with:
    artifact: ''
    name: 'Test Reporter Result'
    path: '**/build/test-results/test/TEST-*'
    path-replace-backslashes: 'false'
    reporter: 'java-junit'
    only-summary: 'false'
    list-suites: 'all'
    list-tests: 'all'
    max-annotations: '10'
    fail-on-error: 'true'
    fail-on-empty: 'true'
    working-directory: ''

 

 

상세한 내용은 공식 github 페이지에서 확인할 수 있다.

https://github.com/marketplace/actions/test-reporter

728x90
반응형