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:
Tianli Feng 2021-08-10 07:23:46 -07:00 committed by GitHub
parent e78040aec4
commit ca3ced981f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 96 additions and 0 deletions

View File

@ -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 {

View File

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

View File

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