web-dev-qa-db-ja.com

Gradle:jacocoを使用して統合テストのカバレッジレポートを生成する方法

私は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)
}
15
Veera

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
    }
}

古いが非常に実用的な答え。また、上記の知識(Testsタスクは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"
4
Brice

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ファイルのすべてに同じコードを含めないようにするのに役立ちます。

3
Arun Sangal