私はgradleを初めて使用します。私は以下のコードを使用しています。ただし、単体テストケースのカバレッジは生成されます。ただし、統合テストケースでは生成されませんでした。パッケージsrc/test/Javaにテストクラスがあります。
test {
dependsOn jettyRunWar
ignoreFailures true
finalizedBy jettyStop
}
apply plugin: 'jacoco'
jacocoTestReport {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
}
Gradle 5.4.1(および現在は5.5.1)を使用して、テストタスクの後にレポートを取得できました。現在、test
タスクとintegrationTest
タスクの両方があります。
[〜#〜] edit [〜#〜]:JacocoReport
のドキュメントを見た後、バリアントがあります JacocoReport:executionData Gradleタスクを直接実行します。 JaCoCoプラグインはタイプJacocoTaskExtension
のすべてのタスクにTest
拡張子を追加するために機能します。その場合、エラーが発生しにくくなります。レポートタスクは次のようになります。
jacocoTestReport {
doLast {
// The JaCoCo plugin adds a JacocoTaskExtension extension to all tasks of type Test.
// Use task state to include or not task execution data
// https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/TaskState.html
executionData([test, integrationTest].findAll { it.state.executed })
}
reports {
xml.enabled true
xml.destination(file("${project.buildDir}/reports/jacoco/all-tests/jacocoAllTestReport.xml"))
html.enabled true
html.destination file("${project.buildDir}/reports/jacoco/all-tests/html")
}
}
そして、同じトリックをsonarqube
タスクに適用できます:
sonarqube {
group = "verification"
properties {
// https://jira.sonarsource.com/browse/MMF-1651
property "sonar.coverage.jacoco.xmlReportPaths", jacocoTestReport.reports.xml.destination
properties["sonar.junit.reportPaths"] += integrationTest.reports.junitXml.destination
properties["sonar.tests"] += sourceSets.integrationTest.allSource.srcDirs
// ... other properties
}
}
古いが非常に実用的な答え。また、上記の知識(Test
sタスクはJacocoTaskExtension
によって拡張される)を使用して、file
の手動のexecutionData
構成をtest.jacoco.destinationFile
に置き換えることができます。およびintegrationTest.jacoco.destinationFile
。
// Without it, the only data is the binary data,
// but I need the XML and HTML report after any test task
tasks.withType(Test) {
finalizedBy jacocoTestReport
}
// Configure the report to look for executionData generated during the test and integrationTest task
jacocoTestReport {
executionData(file("${project.buildDir}/jacoco/test.exec"),
file("${project.buildDir}/jacoco/integrationTest.exec"))
reports {
// for sonarqube
xml.enabled true
xml.destination(file("${project.buildDir}/reports/jacoco/all-tests/jacocoAllTestReport.xml"))
// for devs
html.enabled true
html.destination file("${project.buildDir}/reports/jacoco/all-tests/html")
}
}
sonarqube {
group = "verification"
properties {
// https://jira.sonarsource.com/browse/MMF-1651
property "sonar.coverage.jacoco.xmlReportPaths", ${project.buildDir}/test-results/integrationTest"
properties["sonar.junit.reportPaths"] += "${project.buildDir}/test-results/integrationTest"
properties["sonar.tests"] += sourceSets.integrationTest.allSource.srcDirs
// ... other properties
}
}
project.tasks["sonarqube"].dependsOn "jacocoTestReport"
Build.gradleに伝える必要があるのは、sourceSetsを使用した統合テスト(つまり、それらのITテストを含むフォルダー)がどこにあるかということのようです。私の場合、ソースはsrc/Javaの下にあります(src/main/Javaの代わりに-gradledefault)。ユニットテスト(Junit)はtest/Javaフォルダーの下にあり、統合テストはsrc/Java-testフォルダーの下にあります。
sourceSets {
main {
Java {
srcDir 'src/Java'
}
}
test {
Java {
srcDir 'test/Java'
}
resources {
srcDir 'test/resources'
srcDir 'conf'
}
}
integrationTest {
Java {
srcDir 'src/Java-test'
}
}
}
次に、integrationTestタスクがあります... cleanTest(私が作成したカスタムタスク)がない可能性があるため、微調整できます。そのため、dependsOnを無視できます...あなたの場合はjettyStartのようなものを使用すると思いますITテストに使用しているため(ITテストを実行するためのコンテナーを開始してからfinalizedBy機能を使用してjetty .. jettyプラグインを停止します)
task integrationTest( type: Test, dependsOn: cleanTest ) {
jacoco {
//destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
destinationFile = file("$buildDir/jacoco/integrationTest.exec")
//classDumpFile = file("$buildDir/jacoco/classpathdumps")
classDumpFile = file("$buildDir/classes/integrationTest")
}
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath
}
私が最後に持っているより詳細な出力構造とスクリプトについては、この投稿を参照してください。単体テスト(test.exec)とITテストintergrationTest.exec ..の両方で.execを取得していますが、両方のテストでjacoco.xml/jacocoHtmlレポートを取得していません。また、「gradle cleanbuild」(「test」タスクの呼び出しを含む)と「gradleclean buildintegrationTest」を実行すると、後でbuild/test-resultsフォルダーとbuild/reports /の単体テストデータが上書きされることもわかりました。テストフォルダー。
Jacocoユニットおよび統合テストの対象範囲-個別および全体
[〜#〜] note [〜#〜]:私の場合、jacocoTestReportは一般的なものの1つにあるグローバルgradleinit.dフォルダーで定義されていますgradleファイル。これは、プロジェクトレベルのbuild.gradleファイルのすべてに同じコードを含めないようにするのに役立ちます。