私が使用する必要が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オフライン計測のための間違ったセットアップを持っているのですか?
いくつかの調査の後、私は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を、上記の手順で。しようとするプロジェクトをチェックアウトしてお気軽に。