1. 소개
이 사용방법(예제)에서는 JaCoCo 테스트 범위 보고서 에서 특정 클래스 및 패키지를 제외하는 방법을 배웁니다 .
일반적으로 제외 대상은 구성 클래스, POJO, DTO 및 생성된 바이트 코드일 수 있습니다. 여기에는 특정 비즈니스 논리가 없으며 테스트 범위를 더 잘 보기 위해 보고서에서 제외하는 것이 유용할 수 있습니다.
Maven과 Gradle 프로젝트 모두에서 다양한 배제 방법을 살펴보겠습니다.
2. 예시
테스트에서 이미 다룬 모든 필수 코드가 있는 샘플 프로젝트부터 시작하겠습니다.
다음으로 mvn clean package 또는 mvn jacoco:report 를 실행하여 커버리지 보고서를 생성합니다 .
이 보고서는 우리가 이미 필요한 적용 범위를 가지고 있으며 누락된 지침은 JaCoCo 보고서 메트릭에서 제외되어야 함을 보여줍니다.
3. Plugin 구성 사용 제외
표준 * 및 ?를 사용하여 클래스 및 패키지를 제외할 수 있습니다 . 플러그인 구성의 와일드카드 구문 :
- * 0개 이상의 문자와 일치
- ** 0개 이상의 디렉토리와 일치
- ? 단일 문자와 일치
3.1. 메이븐 구성
몇 가지 제외된 패턴을 추가하도록 Maven 플러그인을 업데이트해 보겠습니다.
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>com/baeldung/**/ExcludedPOJO.class</exclude>
<exclude>com/baeldung/**/*DTO.*</exclude>
<exclude>**/config/*</exclude>
</excludes>
</configuration>
...
</plugin>
여기에서 다음 제외 사항을 지정했습니다.
- com.baeldung 패키지 아래의 모든 하위 패키지에서 제외 된 POJO 클래스
- com.baeldung 패키지 아래의 하위 패키지에서 이름이 DTO 로 끝나는 모든 클래스
- 루트 또는 하위 패키지에서 선언 된 구성 패키지
3.2. 그레이들 구성
Gradle 프로젝트에서도 동일한 제외를 적용할 수 있습니다.
먼저 build.gradle에서 JaCoCo 구성을 업데이트하고 이전 과 동일한 패턴을 사용하여 제외 List을 지정합니다.
jacocoTestReport {
dependsOn test // tests are required to run before generating the report
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, exclude: [
"com/baeldung/**/ExcludedPOJO.class",
"com/baeldung/**/*DTO.*",
"**/config/*"
])
}))
}
}
클로저를 사용하여 클래스 디렉토리를 순회하고 지정된 패턴 List과 일치하는 파일을 제거합니다. 결과적으로 ./gradlew jacocoTestReport 또는 ./gradlew clean test 를 사용하여 보고서를 생성하면 예상대로 지정된 모든 클래스와 패키지가 제외됩니다.
보고서를 생성하기 전에 모든 테스트를 실행 하는 테스트 단계 에 JaCoCo 플러그인이 연결되어 있다는 점은 주목할 가치가 있습니다.
4. 사용자 지정 어노테이션으로 제외
JaCoCo 0.8.2부터 다음 속성을 사용하여 사용자 지정 어노테이션 으로 어노테이션 을 달아 클래스와 메서드를 제외 할 수 있습니다.
- 어노테이션의 이름에는 Generated 가 포함되어야 합니다 .
- 어노테이션의 보존 정책은 런타임 또는 클래스 여야 합니다 .
먼저 어노테이션을 만듭니다.
@Documented
@Retention(RUNTIME)
@Target({TYPE, METHOD, CONSTRUCTOR})
public @interface Generated {
}
이제 커버리지 보고서에서 제외해야 하는 클래스, 메서드 또는 생성자에 어노테이션을 달 수 있습니다.
먼저 클래스 수준에서 이 어노테이션을 사용하겠습니다.
@Generated
public class Customer {
// everything in this class will be excluded from jacoco report because of @Generated
}
마찬가지로 이 사용자 지정 어노테이션을 클래스의 특정 메서드에 적용할 수 있습니다.
public class CustomerService {
@Generated
public String getCustomerId() {
// method excluded form coverage report
}
public String getCustomerName() {
// method included in test coverage report
}
}
마지막으로 어노테이션을 생성자에 적용해 보겠습니다.
public class CustomerService {
@Generated
public CustomerService(){
//constructor excluded from coverage report
}
}
5. Lombok 생성 코드 제외
Project Lombok 은 Java 프로젝트에서 상용구와 반복 코드를 크게 줄이는 인기 있는 라이브러리입니다.
프로젝트의 루트 디렉터리에 있는 lombok.config 파일 에 속성을 추가하여 Lombok에서 생성된 모든 바이트 코드를 제외 하는 방법을 살펴보겠습니다 .
lombok.addLombokGeneratedAnnotation = true
기본적으로 이 속성 은 Lombok 어노테이션이 달린 모든 클래스(예: Product 클래스)의 관련 메서드, 클래스 및 필드에 lombok.@Generated 어노테이션을 추가합니다 . 결과적으로 JaCoCo는 이 어노테이션으로 어노테이션이 달린 모든 구성을 무시하고 보고서에 표시되지 않습니다.
마지막으로 위에 표시된 모든 제외 기술을 적용한 후 보고서를 볼 수 있습니다.
6. 결론
이 문서에서는 JaCoCo 테스트 보고서에서 제외를 지정하는 다양한 방법을 시연했습니다.
처음에는 플러그인 구성에서 이름 지정 패턴을 사용하여 여러 파일과 패키지를 제외했습니다. 그런 다음 @Generated 를 사용하여 특정 클래스와 메서드를 제외 하는 방법을 살펴보았습니다 . 마지막으로 구성 파일을 사용하여 Lombok에서 생성된 모든 코드를 테스트 커버리지 보고서에서 제외하는 방법을 배웠습니다.
항상 그렇듯이 Maven 소스 코드 와 Gradle 소스 코드 는 Github에서 사용할 수 있습니다.