개발/Java&Kotlin

[Spring] 테스트 커버리지 확인하기

devhooney 2022. 11. 22. 16:16
728x90

테스트 커버리지 확인하기

 

코드 커버리지

- 소프트웨어의 테스트 수준이 충분한지 표현할 수 있는 지표 중 하나

- 테스트를 진행했을 때 해당 코드가 실행되었는지를 표현하는 방법

- 많은 코드 커버리지 도구가 있다.

 

 

728x90

 

 

Jacoco란?

- Java 코드의 커버리지를 체크하는 라이브러리

- 작성된 코드의 테스트 커버리지(Test Coverage)를 측정하는 도구

- Runtime으로 Test Case를 실행하여 Coverage를 체크하는 방식

- 테스트 코드를 통해 테스트를 실행하고 그 결과를 html, xml, csv 등의 형식으로 Report를 제공

 

 

블랙 박스 테스트 / 화이트 박스 테스트

  • 블랙 박스 테스트

- 소프트웨어의 내부 구조나 작동 원리를 모르는 상태에서 동작을 검사하는 방식

- 다양한 값을 입력하여 올바른 출력이 나오는지 테스트

- 사용자 관점의 테스트 방법

 

  • 화이트 박스 테스트

- 소프트웨어의 내부 구조와 동작을 검사하는 테스트 방식

- 소프트웨어 내부 소스 코드를 테스트하는 방법

- 개발자 관점의 테스트 방법

 

 

Jacoco 설치 및 설정

plugins {
  id 'jacoco'
}

jacoco {
  // JaCoCo 버전
  toolVersion = '0.8.5'

//  테스트결과 리포트를 저장할 경로 변경
//  default는 "$/jacoco"
//  reportsDir = file("$buildDir/customJacocoReportDir")
}

 

- jacocoTestReport: 바이너리 커버리지 결과를 사람이 읽기 좋은 형태의 리포트로 저장.

- html 파일로 생성해 사람이 쉽게 눈으로 확인할 수도 있고, SonarQube 등으로 연동하기 위해 xml, csv 같은 형태로도 리포트를 생성할 수 있다.

 

- jacocoTestCoverageVerification: 내가 원하는 커버리지 기준을 만족하는지 확인해 주는 task.

- 예를 들어, 브랜치 커버리지를 최소한 80% 이상으로 유지하고 싶다면, 이 task에 설정하면 된다. 

- test task처럼 Gradle 빌드의 성공/실패로 결과를 보여준다.

 

jacocoTestReport {
  reports {
    // 원하는 리포트를 켜고 끌 수 있습니다.
    html.enabled true
    xml.enabled false
    csv.enabled false

//  각 리포트 타입 마다 리포트 저장 경로를 설정할 수 있습니다.
//  html.destination file("$buildDir/jacocoHtml")
//  xml.destination file("$buildDir/jacoco.xml")
  }
}

jacocoTestCoverageVerification {
  // 커버리지 기준
  violationRules {
    rule {
      element = 'CLASS'

      limit {
        counter = 'BRANCH'
        value = 'COVEREDRATIO'
        minimum = 0.90
      }
    }
  }
}

 

- 아래 코드는 플러그인에서 test task에 default로 설정된 값

 

test {
  jacoco {
    enabled = true
    destinationFile = file("$buildDir/jacoco/$.exec")
    includes = []
    excludes = []
    excludeClassLoaders = []
    includeNoLocationClasses = false
    sessionId = "<auto-generated value>"
    dumpOnExit = true
    classDumpDir = null
    output = JacocoTaskExtension.Output.FILE
    address = "localhost"
    port = 6300
    jmx = false
  }
}

 

- 아래 설정은

test task에서는 JUnit을 사용한다고 Gradle에 알려주는 것임.

- 이 설정을 주지 않으면 아래처럼 jacocoTestReport task와 jacocoTestCoverageVerification task를 스킵한다.

- 실제로 테스트 자체가 돌지 않게 된다.

 

test {
  useJUnitPlatform()
}

 

 

커버리지 기준 설정

jacocoTestCoverageVerification {
  violationRules {
    rule {
      // 'element'가 없으면 프로젝트의 전체 파일을 합친 값을 기준으로 합니다.
      // 위의 리포트에서 'Total'로 표시된 부분입니다.
      limit {
        // 'counter'를 지정하지 않으면 default는 'INSTRUCTION'
        // 'value'를 지정하지 않으면 default는 'COVEREDRATIO'
        minimum = 0.30
      }
    }

    // 여러 룰을 생성할 수 있습니다.
    rule {
      // 룰을 간단히 켜고 끌 수 있습니다.
      enabled = true

      // 룰을 체크할 단위는 클래스 단위
      element = 'CLASS'

      // 브랜치 커버리지를 최소한 90% 만족시켜야 합니다.
      limit {
        counter = 'BRANCH'
        value = 'COVEREDRATIO'
        minimum = 0.90
      }

      // 라인 커버리지를 최소한 80% 만족시켜야 합니다.
      limit {
        counter = 'LINE'
        value = 'COVEREDRATIO'
        minimum = 0.80
      }

      // 빈 줄을 제외한 코드의 라인수를 최대 200라인으로 제한합니다.
      limit {
        counter = 'LINE'
        value = 'TOTALCOUNT'
        maximum = 200
      }
    }
  }
}

 

- 커버리지 체크 기준이 되는 element는 다음 중에 하나를 선택할 수 있다.

- 위의 샘플처럼 CLASS를 선택하면 클래스 단위로 브랜치와 라인 커버리지를 체크.

  • BUNDLE (default): 패키지 번들
  • PACKAGE: 패키지
  • CLASS: 클래스
  • SOURCEFILE: 소스파일
  • METHOD: 메소드

- 설정 가능한 counter

  • LINE: 빈 줄을 제외한 실제 코드의 라인 수
  • BRANCH: 조건문 등의 분기 수
  • CLASS: 클래스 수
  • METHOD: 메소드 수
  • INSTRUCTION (default): Java 바이트코드 명령 수
  • COMPLEXITY: 복잡도

- value는 아래 중에서 선택할 수 있다.

  • TOTALCOUNT: 전체 개수
  • MISSEDCOUNT: 커버되지 않은 개수
  • COVEREDCOUNT: 커버된 개수
  • MISSEDRATIO: 커버되지 않은 비율. 0부터 1 사이의 숫자로, 1이 100%
  • COVEREDRATIO (default): 커버된 비율. 0부터 1 사이의 숫자로, 1이 100%

 

 

 

 

 

- 참고

https://www.youtube.com/watch?v=FCTYoce21OI&list=PLlTylS8uB2fBOi6uzvMpojFrNe7sRmlzU&index=22 

https://techblog.woowahan.com/2661/

728x90