Процент покрытия отчета Gradle Jacoco не соответствует проценту проверки - PullRequest
2 голосов
/ 27 февраля 2020

Мы настроили исключает:

def coverageExcludes() {
    return [
        "com/ourcompany/*Config*",
        "com/ourcompany/ServiceApplication*",
        "com/ourcompany/Shutdown*",
        "com/ourcompany/ShutdownConnector*",
        "com/ourcompany/Tomcat*",
        "com/ourcompany/TomcatCustomConnectorCustomizer*",
        "com/ourcompany/endpoint/exception/**",
        "com/ourcompany/endpoint/util/ObjectMapperBuilder*",
        "com/ourcompany/framework/**",
        "com/ourcompany/helper/ApiHelper*",
        "com/ourcompany/helper/OffsetDateTimeDeserializer*",
        "com/ourcompany/persistence/entity/**",
        "com/ourcompany/persistence/exception/**",
        "com/ourcompany/service/exception/ServiceException*",
        "com/ourcompany/service/model/**",
        "com/ourcompany/v2/**",
        "com/ourcompany/v3/**"
    ]
}

использовал их в jacocoTestReport:

jacocoTestReport {
    reports {
        xml {
            enabled true
        }
        html {
            enabled true
        }
    }
    getExecutionData().setFrom(fileTree(buildDir).include("/jacoco/*.exec"));
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it,
                exclude: coverageExcludes()
            )
        }))
        for (Object c : classDirectories) {
            System.out.println(c);
        }
    }
}

и исключает работу:

enter image description here

Затем мы попытались использовать те же исключения в задаче проверки с пороговым значением ошибки покрытия, равным 0,87, поскольку именно это отображается в отчете о покрытии:

jacocoTestCoverageVerification {
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it,
                exclude: coverageExcludes()
            )
        }))
        for (Object c : classDirectories) {
            System.out.println(c);
        }
    }
    violationRules {
        rule {
            element = 'BUNDLE'
            limit {
                counter = 'INSTRUCTION'
                value = 'COVEREDRATIO'
                minimum = 0.87
            }
        }
    }
}
check.dependsOn jacocoTestCoverageVerification

Но это не работает:

Не удалось выполнить задачу ': settings: jacocoTestCoverageVerification'.

Правило нарушено для настроек пакета: коэффициент покрытия инструкций равен 0,70, но ожидаемый минимум равен 0,87

Мы сравнили вывод classDirectories в обеих задачах, и они точно совпадают, и в списке исключений ничего нет в classDirectories. Это означает, что обе задачи видят одни и те же классы.

И все же задача проверки получает другой ответ по покрытию, чем задача отчета.

Это вызывает беспокойство, поскольку мы не знаем, какая задача получает правильный ответ. Если это задача отчета, мы можем просто жить с более низким порогом в задаче проверки, но если у нас действительно охват только 70%, мы хотели бы знать это.

Насколько мы можем судить Исходя из документации, мы настроили задачу проверки для анализа покрытия точно так же, как и для задачи отчета.

Что мы делаем не так?

(Мы используем Gradle 5.5 .1, и пока не может обновить, но будет, если мы сможем обойти эту проблему.)

1 Ответ

3 голосов
/ 03 марта 2020

Вы настраиваете ExecutionData в своей jacocoTestReport задаче

getExecutionData().setFrom(fileTree(buildDir).include("/jacoco/*.exec"));

, но не в jacocoTestCoverageVerification задаче.

...