Межмодульное покрытие кода с помощью автономного инструментария Jacoco в проекте gradle mutlimodule - PullRequest
4 голосов
/ 31 января 2020

Мне нужно использовать автономные инструменты Jacoco в моем проекте, потому что также используется PowerMock.

Описание проблемы: предположим, у вас есть проект gradle с двумя модулями: A, B. Модуль A имеет тесты, которые охватывают код из модуля B. По сбору данных покрытия кода я выяснил, что данные покрытия (должны быть предоставлены модулем A) для модуля B полностью пропущены.

Я создал тестовый проект, который демонстрирует проблему: https://github.com/SurpSG/jacoco-offline-instrumentation

Настройка автономного измерительного оборудования Jacoco для проекта gradle основана на ответе { ссылка }

С другой стороны, когда я Используя плагин jacoco gradle, я вижу, что данные покрытия, предоставленные модулем A для модуля B, успешно собраны в сводный отчет. Я создал еще один тестовый проект, чтобы продемонстрировать это: https://github.com/SurpSG/jacoco-gradle-plugin-merge-coverage

Неправильно ли настроен мультимодульный проект gradle + автономное инструментарий jacoco?

1 Ответ

2 голосов
/ 10 февраля 2020

После некоторого исследования я выяснил, что зависимости модулей в Gradle разрешаются с помощью файлов .jar:

<dependent-module>.classpath contains <dependency-module>.jar

Итак, в моем случае мне нужно создать специальный jar-файл, содержащий инструментированные классы.

Инструментарий классов

task preprocessClassesForJacoco(dependsOn: ['classes']) {
        ext.outputDir = buildDir.path + '/classes-instrumented'
        doLast {
            ant.taskdef(name: 'instrument',
                    classname: 'org.jacoco.ant.InstrumentTask',
                    classpath: configurations.jacoco.asPath)
            ant.instrument(destdir: outputDir) {
                fileset(dir: sourceSets.main.java.outputDir, includes: '**/*.class', erroronmissingdir: false)
            }
        }
    }

Следующим шагом будет сборка инструментальной банки :

task jacocoInstrumentedJar(type: Jar, dependsOn: [preprocessClassesForJacoco]) {
    baseName "${project.name}-instrumented"
    from preprocessClassesForJacoco.outputDir // path to instrumented classes
}

И, наконец, мы нужно заменить обычный .jar на инструментированный one

gradle.taskGraph.whenReady { graph ->
        if (graph.hasTask(preprocessClassesForJacoco)) {
            tasks.withType(Test) {
                doFirst {
                    ...
                    // getting a module dependencies
                    def modulesDependencies = moduleDependencies(project)
                    // removing regular jars
                    classpath -= files(modulesDependencies.jar.outputs.files)
                    // adding instrumented jars
                    classpath += files(modulesDependencies.jacocoInstrumentedJar.outputs.files)
                }
            }
        }
    }

Я обновил пример проекта https://github.com/SurpSG/jacoco-offline-instrumentation с описанными шагами над. Не стесняйтесь проверить проект, чтобы попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...