GradleのmutlimoduleプロジェクトでJacocoオフライン計測とのクロスモジュールのコードカバレッジ

SergiiGnatiuk:

私が使用する必要がJacocoオフライン計測を、同様に使用されるPowerMockがあるので私のプロジェクトに。

問題の説明:あなたは二つのモジュールとGradleのプロジェクトがあるとします。Aは、Bのモジュールは、AモジュールからのコードをカバーするテストがありますBコードカバレッジデータの収集に私はカバレッジデータ(モジュールによって提供されるべきであることを考え出しAモジュール用)をB完全に逃しています。

私はこの問題を実証テストプロジェクトを作成しました:https://github.com/SurpSG/jacoco-offline-instrumentation

GradleのプロジェクトのためのJacocoオフライン計測機器のセットアップは、回答に基づいているhttps://stackoverflow.com/a/42238982/2689114

一方、私はjacocoのGradleのを使用していたとき、私はモジュールによって提供されるカバレッジデータを観察することができ、プラグインAモジュールのためBに成功要約レポートに収集します。私はこれを実証するために、1つの以上のテストプロジェクトを作成しました:https://github.com/SurpSG/jacoco-gradle-plugin-merge-coverage

私はGradleのマルチモジュールプロジェクト+ jacocoオフライン計測のための間違ったセットアップを持っているのですか?

SergiiGnatiuk:

いくつかの調査の後、私は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)
            }
        }
    }

次のステップは、されるインストルメントjarファイルを構築します

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

そして最後に、我々はする必要があります置き換える通常の.jarをインストルメントと 1

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を、上記の手順で。しようとするプロジェクトをチェックアウトしてお気軽に。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=12811&siteId=1