1. 소개

이 사용방법(예제)에서는 JaCoCo 테스트 범위 보고서 에서 특정 클래스 및 패키지를 제외하는 방법을 배웁니다 .

일반적으로 제외 대상은 구성 클래스, POJO, DTO 및 생성된 바이트 코드일 수 있습니다. 여기에는 특정 비즈니스 논리가 없으며 테스트 범위를 더 잘 보기 위해 보고서에서 제외하는 것이 유용할 수 있습니다.

Maven과 Gradle 프로젝트 모두에서 다양한 배제 방법을 살펴보겠습니다.

2. 예시

테스트에서 이미 다룬 모든 필수 코드가 있는 샘플 프로젝트부터 시작하겠습니다.

다음으로 mvn clean package 또는  mvn jacoco:report 를 실행하여 커버리지 보고서를 생성합니다 .

스크린샷-2021-05-30-at-21.07.46

이 보고서는 우리가 이미 필요한 적용 범위를 가지고 있으며 누락된 지침은 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는 이 어노테이션으로 어노테이션이 달린 모든 구성을 무시하고 보고서에 표시되지 않습니다.

마지막으로 위에 표시된 모든 제외 기술을 적용한 후 보고서를 볼 수 있습니다.

스크린샷-2021-05-30-at-21.25.03

6. 결론

이 문서에서는 JaCoCo 테스트 보고서에서 제외를 지정하는 다양한 방법을 시연했습니다.

처음에는 플러그인 구성에서 이름 지정 패턴을 사용하여 여러 파일과 패키지를 제외했습니다. 그런 다음 @Generated 를 사용하여 특정 클래스와 메서드를 제외 하는 방법을 살펴보았습니다 . 마지막으로 구성 파일을 사용하여 Lombok에서 생성된 모든 코드를 테스트 커버리지 보고서에서 제외하는 방법을 배웠습니다.

항상 그렇듯이 Maven 소스 코드Gradle 소스 코드 는 Github에서 사용할 수 있습니다.

Junit footer banner