[개인 프로젝트(6)] 코드 커버리지 라이브러리, Jacoco 적용기

개발로그·2023년 10월 29일
0

개인 프로젝트

목록 보기
6/14
post-thumbnail


📌 코드 커버리지


✅ 코드 커버리지란

In computer science, test coverage is a measure used to describe the degree to which the source code of a program is executed when a particular test suite runs.

A program with high test coverage, measured as a percentage, has had more of its source code executed during testing, which suggests it has a lower chance of containing undetected software bugs compared to a program with low test coverage.
(wikipedia)

코드 커버리지는 소프트웨어 테스트에서 사용되는 측정 지표로, 테스트 스위트(Test Suite)가 소프트웨어 코드의 어느 정도를 실행하거나 테스트하는지를 나타낸다.

  • 테스트 스위트 (Test Suite) : 특정 테스트 주기에서 실행해야 하는 테스트 케이스의 집합이나 테스트 절차




✅ 코드 커버리지 측정 기준

📍 Line Coverage

 라인커버리지=실행라인수전체라인100\ 라인 \, 커버리지 =\frac{실행 \,된\, 라인 수}{전체\,라인\,수} * 100

소스 코드의 각 라인이 실행되는 비율을 나타낸다.
Test Suite가 특정 라인을 실행하면 해당 라인은 커버된 것으로 간주된다.



📍 Branch Coverage

 분기커버리지=실행분기수전체분기100\ 분기 \, 커버리지 =\frac{실행 \,된\, 분기 수}{전체\,분기\,수} * 100

조건문에서 각 브랜치가 실행되는 비율을 나타낸다.
Test Suite가 특정 브랜치를 실행하면 해당 브랜치는 커버된 것으로 간주된다.



📍 Condition Coverage

 조건커버리지=실행조건수전체조건100\ 조건 \, 커버리지 =\frac{실행 \,된\, 조건 수}{전체\,조건\,수} * 100

소스 코드의 조건문이 참과 거짓의 각 경우를 포함하여 테스트 된 비율을 나타낸다.

예를 들어, 조건 커버리지가 80%라면 소스 코드 내의 조건문 중 80%의 조건이 참과 거짓의 각 경우를 포함하여 테스트되었다는 것을 의미한다.

나머지 20%의 조건문은 여전히 테스트되지 않았거나 특정 경우가 누락되었을 수 있다.



📍 Path Coverage

프로그램의 모든 가능한 실행 경로를 테스트하는 정도를 나타낸다.

비즈니스 로직의 특성이나 코드의 복잡성으로 인해 도달이 어려운 부분이 있을 수 있기 때문에, 현실적으로 모든 경로를 완벽하게 테스트하는 것은 이상적이지만 실용적이지 않을 수 있다.

따라서, 대부분의 상황에서 경로 커버리지는 고려되지 않는다.



📍 가장 보편적으로 사용되는 커버리지 측정 방법

Branch Coverage나 Condition Coverage는 조건문이 없는 코드 부분을 커버하지 않기 때문에 실행 된 코드의 문제가 없음을 확인하지만, 실행되지 않은 코드에 대한 보장은 제공하지 않는다.

이러한 이유로, Line Coverage는 코드에서 어떤 부분이 실행되었는지를 확인하고, 코드의 실행 여부를 파악하는 데 가장 보편적으로 사용된다.



✅ 코드 커버리지는 왜 중요할까?

테스트 코드는 빠르게 변화하는 소프트웨어의 안정성을 보장하는데 중요한 역할을 한다.
그러나, 소프트웨어는 복잡하기 때문에 개발자가 직접 다양한 시나리오를 고려하여 모든 가능한 상황과 조건을 커버하는 테스트 케이스를 작성하는 것은 어렵다.


이 때, 코드 커버리지는 테스트가 얼마나 많은 코드를 실행하고 어떤 부분이 테스트되지 않았는지를 측정한다. 이를 통해 개발자들은 테스트되지 않은 영역을 식별하고 보완할 수 있다.

위와 같은 이유로 많은 개발자들은 코드 커버리지를 중요하게 생각하며, 일정 수준의 코드 커버리지를 유지하기 위해 SonarCloud와 같은 정적 분석 도구를 함께 활용하여 코드 커버리지가 일정 수준 이하인 경우 빌드에 실패하거나, 커밋이 불가능하도록 제한하기도 한다.







📌 JaCoCo란


JaCoCo is a free code coverage library for Java, which has been created by the EclEmma team based on the lessons learned from using and integration existing libraries for many years.
(JaCoCo, Java Code Coverage)

JaCoCo는 코드 커버리지를 쉽게 확인하고 관리할 수 있도록 지원하는 오픈 소스 라이브러리이다.



✅ 특징

  • Line Coverage / Branch Coverage를 제공한다.

  • 코드 커버리지 결과를 시각화하여 리포트를 제공한다. ( html / xml/ csv )

  • 설정한 커버리지 기준을 만족하는지 확인하는 기능을 제공한다.







📌 JaCoCo 적용하기


JaCoCo 플러그인은 JaCoCo와 통합하여 Java 코드의 코드 커버리지 지표를 제공한다.

✅ JaCoCo 플러그인 적용

plugins {
    id 'jacoco'
}




✅ 코드 커버리지 리포트와 테스트 실행 간의 종속성 정의

test {
    finalizedBy jacocoTestReport // report is always generated after tests run
}
jacocoTestReport {
    dependsOn test // tests are required to run before generating the report
}




✅ JaCoCo 플러그인 구성

JaCoCo properties에 대한 Gradle 기본 값

  • reportsDirectory (property) : layout.buildDirectory.dir("reports/jacoco")
jacoco {
    toolVersion = "0.8.9"
}




✅ JaCoCo 리포트 구성

JaCoCo Task를 통해 다양한 형식의 코드 커버리지 리포트를 생성할 수 있다.

XML, HTML, CSV 형식으로 리포트를 생성할 수 있으나,
SonarCloud에 필요한 것은 XML뿐이므로, JaCoCo Task에 XML 형식을 명시적으로 지정한다.

By default, the tool generates XML, HTML, and CSV versions of the report. Here, we explicitly specify XML, since that is the only one we need for SonarCloud.
[SonarCloud - Java Test Coverage]

jacocoTestReport {
    reports {
        xml.required = true
    }
}




✅ 코드 커버리지 지표 강제화 - 위반 규칙 구성

이 기능을 사용하려면 JaCoCo 버전 0.6.3 이상을 사용해야 한다.
JacocoCoverageVerification Task는 구성된 규칙에 따라 코드 커버리지 지표가 충족되는지 확인한다.

violationRules에 구성된 규칙 중 하나라도 충족되지 않으면 빌드가 실패하며, JaCoCo는 첫 번째로 위반된 규칙만 보고한다.


이와 관련된 보다 자세한 내용은 해당 링크에서 확인할 수 있으며, 지금 당장은 위반 규칙을 구성하지 않고, 향후 프로젝트를 개발하면서 필요를 느낄 때 코드 커버리지 지표 강제화 기능을 사용할 것이다.

참고 링크 : Gradle JaCoCo 플러그인







📌 결과


위의 과정을 따라 JaCoCo 설정을 마치고, 프로젝트를 빌드하면
다음과 같이 build/reports/jacoco 경로에 jacocoTestReport.xml이 정상적으로 생성되는 것을 확인할 수 있다.


Your report will be automatically saved in the build/reports/jacoco directory. The sonarqube plugin automatically detects this location so no further configuration is required.
[SonarCloud - Java Test Coverage]

0개의 댓글