jacoco 사용기

임현규·2023년 9월 3일
0

Meca project 개발 일지

목록 보기
27/27

jacoco 사용하면서 생긴 문제점

jacoco 사용시 특정 클래스를 커버리지 테스트에서 제외하고 싶었는데 잘 되지 않았다.

jacocoTestCoverageVerification {
  violationRules {
    rule {
      element = 'CLASS'

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

      // 커버리지 체크를 제외할 클래스들
      excludes = [
//      '*.test.*',
        '*.Kotlin*'
      ]
    }
  }
}

이것을 적용하려고 했는데 실제 결과에는 제외되지 않고 커버리지를 측정했다. 그래서 제외시킬수 있는 방법을 찾아야 했다. 그리고 롬복으로 생성된 코드 역시 커버리지 분석을 하기 때문에 이 부분도 제외할 수 있는 방법을 찾아야한다.

Lombok으로 생성된 코드 라인 커버리지 제외하기

Jacoco에서는 @lombok.Generate 라는 어노테이션이 있다면 커버리지 분석에서 제외된다. 이를 롬복으로 생성된 코드마다 어노테이션을 붙여주는 설정이 있다.

우선 root 디렉토리에 lombok.config 파일을 생성한다.

그 이후 다음과 같이 설정해준다.

롬복 설정 관련 사이트

lombok.addLombokGeneratedAnnotation = true

이렇게 설정해주면 커버리지에서 Lombok으로 생성된 코드때문에 커버리지율이 떨어질 일은 없다.

특정 클래스 제외하기

특정 클래스를 제외하려면

jacocoTestReport {

    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it,
                    exclude: [
                            '**/MecaApplication.*'
                    ])
        }))
    }

    reports {
        xml.enabled true
        html.enabled true
        csv.enabled true
    }

    finalizedBy 'jacocoTestCoverageVerification'
}

jacocoTestReport는 테스트 커버리지 리포트를 생성하는데 필요한 설정이다. afterEvaluate에서 classDirectories에서 exclude를 세팅하면 리포트 생성시 특정 클래스의 커버리지를 리포트에서 제외할 수 있다.

그 외의 정보들

위에 설정에서 finalizedBy에서 jacocoTestCoverageVerification를 호출하는 이유는 report 생성시 마지막으로 jacocoTestCoverageVerification을 수행하라는 의미이다. jacocoTestCoverageVerfication은 테스트 커버리지가 특정 rule를 만족하지 않으면 실패하는데 이게 다른 task나 동작 사이에 껴있으면 같이 실패하게 만든다. 만약 test task에 verfication을 추가하면 test중에 커버리지 룰을 만족하지 못하면 통과하지 못하게 할 수 있다 따로 넣지 않는다면 리포트만 생성하고 커버리지 룰은 적용하지 않게도 만들 수 있다.

profile
엘 프사이 콩그루

0개의 댓글