Add support to generate code coverage report with JaCoCo (#971)
* add jacoco plugin Signed-off-by: Tianli Feng <ftianli@amazon.com> * config aggregated jacoco report Signed-off-by: Tianli Feng <ftianli@amazon.com> * Skip generating report if no test in subproject Signed-off-by: Tianli Feng <ftianli@amazon.com> * Add jacoco plugin into root project Signed-off-by: Tianli Feng <ftianli@amazon.com> * test aggregate code coverage report Signed-off-by: Tianli Feng <ftianli@amazon.com> * Can generate aggregated unit test coverage report Signed-off-by: Tianli Feng <ftianli@amazon.com> * Can generate aggregated test report with source file linked Signed-off-by: Tianli Feng <ftianli@amazon.com> * Some cleanup, but jacocoReport is not dependson Test Signed-off-by: Tianli Feng <ftianli@amazon.com> * cleanup Signed-off-by: Tianli Feng <ftianli@amazon.com> * get unit test code coverage report Signed-off-by: Tianli Feng <ftianli@amazon.com> * change 'enabled == true' to 'enabled' Signed-off-by: Tianli Feng <ftianli@amazon.com> * add a comment for selectedsubprojects Signed-off-by: Tianli Feng <ftianli@amazon.com> * add tasks to generate code coverage report for unit test and integration test Signed-off-by: Tianli Feng <ftianli@amazon.com> * fix typo in variable Signed-off-by: Tianli Feng <ftianli@amazon.com> * Correct the task to get codecoverage for unit test and integtest Signed-off-by: Tianli Feng <ftianli@amazon.com> * Make code coverage report task run after test Signed-off-by: Tianli Feng <ftianli@amazon.com> * apply gradle configuration aciidance api Signed-off-by: Tianli Feng <ftianli@amazon.com> * apply jacoco plugin in BuildPlugin in all case Signed-off-by: Tianli Feng <ftianli@amazon.com> * Put file path list of integration test exec data in a variable Signed-off-by: Tianli Feng <ftianli@amazon.com> * Apply gradle configuration aviodance api to register task instead of create task Signed-off-by: Tianli Feng <ftianli@amazon.com> * merge 2 jacocoreport configurations Signed-off-by: Tianli Feng <ftianli@amazon.com> * Add some comments in gradle script Signed-off-by: Tianli Feng <ftianli@amazon.com> * Attach code coverage report task to gralde check task Signed-off-by: Tianli Feng <ftianli@amazon.com> * add a space Signed-off-by: Tianli Feng <ftianli@amazon.com> * get code coverage report after check task on demand and get report in html format on demand Signed-off-by: Tianli Feng <ftianli@amazon.com>
This commit is contained in:
parent
e78040aec4
commit
ca3ced981f
|
@ -59,6 +59,7 @@ apply from: 'gradle/local-distribution.gradle'
|
|||
apply from: 'gradle/fips.gradle'
|
||||
apply from: 'gradle/run.gradle'
|
||||
apply from: 'gradle/missing-javadoc.gradle'
|
||||
apply from: 'gradle/code-coverage.gradle'
|
||||
|
||||
// common maven publishing configuration
|
||||
allprojects {
|
||||
|
|
|
@ -81,6 +81,7 @@ class BuildPlugin implements Plugin<Project> {
|
|||
configureLicenseAndNotice(project)
|
||||
project.pluginManager.apply('opensearch.publish')
|
||||
project.pluginManager.apply(DependenciesInfoPlugin)
|
||||
project.pluginManager.apply('jacoco')
|
||||
|
||||
PrecommitTasks.create(project, true)
|
||||
}
|
||||
|
|
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* The OpenSearch Contributors require contributions made to
|
||||
* this file be licensed under the Apache-2.0 license or a
|
||||
* compatible open source license.
|
||||
*/
|
||||
|
||||
apply plugin: 'jacoco'
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
allprojects {
|
||||
plugins.withId('jacoco') {
|
||||
// The default JaCoCo version in Gradle 6.6.1 is 0.8.5, but at least version 0.8.6 officially supports Java 14
|
||||
jacoco.toolVersion = '0.8.7'
|
||||
}
|
||||
}
|
||||
|
||||
def codeCoverageReportTask = tasks.register("codeCoverageReport", JacocoReport) {
|
||||
description = 'Generates aggregate report from all subprojects.'
|
||||
executionData.setFrom fileTree(dir: '.', include: '**/build/jacoco/*.exec')
|
||||
}
|
||||
|
||||
tasks.register("codeCoverageReportForUnitTest", JacocoReport) {
|
||||
description = 'Generates aggregate report from all subprojects for unit test.'
|
||||
executionData.setFrom fileTree(dir: '.', include: '**/build/jacoco/test.exec')
|
||||
}
|
||||
|
||||
tasks.register("codeCoverageReportForIntegrationTest", JacocoReport) {
|
||||
description = 'Generates aggregate report from all subprojects for integration test.'
|
||||
// These kinds of tests are integration test, and the tests can be ran by Gradle tasks with the same name
|
||||
def integrationTestExecPathList = ['**/build/jacoco/integTest.exec',
|
||||
'**/build/jacoco/internalClusterTest.exec',
|
||||
'**/build/jacoco/javaRestTest.exec',
|
||||
'**/build/jacoco/yamlRestTest.exec' ]
|
||||
executionData.setFrom fileTree(dir: '.', include: integrationTestExecPathList)
|
||||
}
|
||||
|
||||
tasks.withType(JacocoReport).configureEach {
|
||||
group = JavaBasePlugin.VERIFICATION_GROUP
|
||||
|
||||
// Select projects with corresponding tests in order to run proper tests and select proper classes to generate the report
|
||||
def projectsWithJavaPlugin = subprojects.findAll { it.pluginManager.hasPlugin('java') }
|
||||
def projectsWithUnitTest = projectsWithJavaPlugin.findAll { it.tasks.findByName('test').enabled }
|
||||
def projectsWithIntegTest = projectsWithJavaPlugin.findAll {it.tasks.findByName('integTest')}
|
||||
def projectsWithInternalClusterTest = projectsWithJavaPlugin.findAll {it.tasks.findByName('internalClusterTest')}
|
||||
def projectsWithJavaRestTest = projectsWithJavaPlugin.findAll {it.tasks.findByName('javaRestTest')}
|
||||
def projectsWithYamlRestTest = projectsWithJavaPlugin.findAll {it.tasks.findByName('yamlRestTest')}
|
||||
def projectsWithIntegrationTest = projectsWithIntegTest + projectsWithInternalClusterTest + projectsWithJavaRestTest + projectsWithYamlRestTest
|
||||
def projectsWithTest = projectsWithUnitTest + projectsWithIntegrationTest
|
||||
|
||||
def selectedProjects
|
||||
switch (name) {
|
||||
case "codeCoverageReportForUnitTest":
|
||||
dependsOn projectsWithUnitTest.test
|
||||
selectedProjects = projectsWithUnitTest
|
||||
break
|
||||
case "codeCoverageReportForIntegrationTest":
|
||||
dependsOn projectsWithIntegTest.integTest
|
||||
dependsOn projectsWithInternalClusterTest.internalClusterTest
|
||||
dependsOn projectsWithJavaRestTest.javaRestTest
|
||||
dependsOn projectsWithYamlRestTest.yamlRestTest
|
||||
selectedProjects = projectsWithIntegrationTest
|
||||
break
|
||||
default:
|
||||
dependsOn projectsWithUnitTest.test
|
||||
dependsOn projectsWithIntegTest.integTest
|
||||
dependsOn projectsWithInternalClusterTest.internalClusterTest
|
||||
dependsOn projectsWithJavaRestTest.javaRestTest
|
||||
dependsOn projectsWithYamlRestTest.yamlRestTest
|
||||
selectedProjects = projectsWithTest
|
||||
break
|
||||
}
|
||||
sourceDirectories.setFrom files(selectedProjects.sourceSets.main.allSource.srcDirs)
|
||||
classDirectories.setFrom files(selectedProjects.sourceSets.main.output)
|
||||
|
||||
reports {
|
||||
xml.enabled true
|
||||
// Code coverage report in HTML format is on demand, since it takes up 100+MB of disk space.
|
||||
if (System.getProperty('tests.coverage.html_report')) {
|
||||
html.enabled true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (System.getProperty("tests.coverage")) {
|
||||
// Attach code coverage report task to Gradle check task
|
||||
project.getTasks().named(JavaBasePlugin.CHECK_TASK_NAME).configure {
|
||||
dependsOn codeCoverageReportTask
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue