You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kafka.apache.org by ij...@apache.org on 2020/06/19 14:35:14 UTC
[kafka] branch trunk updated: MINOR: Reduce build time by gating
test coverage plugins behind a flag (#8899)
This is an automated email from the ASF dual-hosted git repository.
ijuma pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git
The following commit(s) were added to refs/heads/trunk by this push:
new 5ecd094 MINOR: Reduce build time by gating test coverage plugins behind a flag (#8899)
5ecd094 is described below
commit 5ecd094b57ed381f3420b65971fe3059c72fb45f
Author: Ismael Juma <is...@juma.me.uk>
AuthorDate: Fri Jun 19 07:32:53 2020 -0700
MINOR: Reduce build time by gating test coverage plugins behind a flag (#8899)
Most builds don't require test coverage output, so it's wasteful
to spend cycles tracking coverage information for each method
invoked.
I ran a quick test in a fast desktop machine, the absolute
difference will be larger in a slower machine. The tests were
executed after `./gradlew clean` and with a gradle daemon
that was started just before the test (and mildly warmed up
by running `./gradlew clean` again).
`./gradlew unitTest --continue --profile`:
* With coverage enabled: 6m32s
* With coverage disabled: 5m47s
I ran the same test twice and the results were within 2s of
each other, so reasonably consistent.
16% reduction in the time taken to run the unit tests is a
reasonable gain with little downside, so I think this is a
good change.
Reviewers: Manikumar Reddy <ma...@gmail.com>
---
README.md | 7 +++--
build.gradle | 96 ++++++++++++++++++++++++++++++++++--------------------------
2 files changed, 60 insertions(+), 43 deletions(-)
diff --git a/README.md b/README.md
index 249964b..c326a78 100644
--- a/README.md
+++ b/README.md
@@ -60,11 +60,11 @@ See [Test Retry Gradle Plugin](https://github.com/gradle/test-retry-gradle-plugi
### Generating test coverage reports ###
Generate coverage reports for the whole project:
- ./gradlew reportCoverage
+ ./gradlew reportCoverage -PenableTestCoverage=true
Generate coverage for a single module, i.e.:
- ./gradlew clients:reportCoverage
+ ./gradlew clients:reportCoverage -PenableTestCoverage=true
### Building a binary release gzipped tar ball ###
./gradlew clean releaseTarGz
@@ -208,6 +208,9 @@ The following options should be set with a `-P` switch, for example `./gradlew -
* `xmlSpotBugsReport`: enable XML reports for spotBugs. This also disables HTML reports as only one can be enabled at a time.
* `maxTestRetries`: the maximum number of retries for a failing test case.
* `maxTestRetryFailures`: maximum number of test failures before retrying is disabled for subsequent tests.
+* `enableTestCoverage`: enables test coverage plugins and tasks, including bytecode enhancement of classes required to track said
+coverage. Note that this introduces some overhead when running tests and hence why it's disabled by default (the overhead
+varies, but 15-20% is a reasonable estimate).
### Dependency Analysis ###
diff --git a/build.gradle b/build.gradle
index 38ae8ef..180e1fc 100644
--- a/build.gradle
+++ b/build.gradle
@@ -115,6 +115,8 @@ ext {
userTestLoggingEvents = project.hasProperty("testLoggingEvents") ? Arrays.asList(testLoggingEvents.split(",")) : null
+ userEnableTestCoverage = project.hasProperty("enableTestCoverage") ? enableTestCoverage : false
+
generatedDocsDir = new File("${project.rootDir}/docs/generated")
commitId = project.hasProperty('commitId') ? commitId : null
@@ -552,28 +554,33 @@ subprojects {
// Ignore core since its a scala project
if (it.path != ':core') {
- apply plugin: "jacoco"
-
- jacoco {
- toolVersion = versions.jacoco
- }
-
- // NOTE: Jacoco Gradle plugin does not support "offline instrumentation" this means that classes mocked by PowerMock
- // may report 0 coverage, since the source was modified after initial instrumentation.
- // See https://github.com/jacoco/jacoco/issues/51
- jacocoTestReport {
- dependsOn tasks.test
- sourceSets sourceSets.main
- reports {
- html.enabled = true
- xml.enabled = true
- csv.enabled = false
+ if (userEnableTestCoverage) {
+ apply plugin: "jacoco"
+
+ jacoco {
+ toolVersion = versions.jacoco
}
+
+ // NOTE: Jacoco Gradle plugin does not support "offline instrumentation" this means that classes mocked by PowerMock
+ // may report 0 coverage, since the source was modified after initial instrumentation.
+ // See https://github.com/jacoco/jacoco/issues/51
+ jacocoTestReport {
+ dependsOn tasks.test
+ sourceSets sourceSets.main
+ reports {
+ html.enabled = true
+ xml.enabled = true
+ csv.enabled = false
+ }
+ }
+
}
}
- def coverageGen = it.path == ':core' ? 'reportScoverage' : 'jacocoTestReport'
- task reportCoverage(dependsOn: [coverageGen])
+ if (userEnableTestCoverage) {
+ def coverageGen = it.path == ':core' ? 'reportScoverage' : 'jacocoTestReport'
+ task reportCoverage(dependsOn: [coverageGen])
+ }
task determineCommitId {
def takeFromHash = 16
@@ -640,30 +647,34 @@ def checkstyleConfigProperties(configFileName) {
}
// Aggregates all jacoco results into the root project directory
-task jacocoRootReport(type: org.gradle.testing.jacoco.tasks.JacocoReport) {
- def javaProjects = subprojects.findAll { it.path != ':core' }
+if (userEnableTestCoverage) {
+ task jacocoRootReport(type: org.gradle.testing.jacoco.tasks.JacocoReport) {
+ def javaProjects = subprojects.findAll { it.path != ':core' }
- description = 'Generates an aggregate report from all subprojects'
- dependsOn(javaProjects.test)
+ description = 'Generates an aggregate report from all subprojects'
+ dependsOn(javaProjects.test)
- additionalSourceDirs.from = javaProjects.sourceSets.main.allSource.srcDirs
- sourceDirectories.from = javaProjects.sourceSets.main.allSource.srcDirs
- classDirectories.from = javaProjects.sourceSets.main.output
- executionData.from = javaProjects.jacocoTestReport.executionData
+ additionalSourceDirs.from = javaProjects.sourceSets.main.allSource.srcDirs
+ sourceDirectories.from = javaProjects.sourceSets.main.allSource.srcDirs
+ classDirectories.from = javaProjects.sourceSets.main.output
+ executionData.from = javaProjects.jacocoTestReport.executionData
- reports {
- html.enabled = true
- xml.enabled = true
- }
+ reports {
+ html.enabled = true
+ xml.enabled = true
+ }
- // workaround to ignore projects that don't have any tests at all
- onlyIf = { true }
- doFirst {
- executionData = files(executionData.findAll { it.exists() })
+ // workaround to ignore projects that don't have any tests at all
+ onlyIf = { true }
+ doFirst {
+ executionData = files(executionData.findAll { it.exists() })
+ }
}
}
-task reportCoverage(dependsOn: ['jacocoRootReport', 'core:reportCoverage'])
+if (userEnableTestCoverage) {
+ task reportCoverage(dependsOn: ['jacocoRootReport', 'core:reportCoverage'])
+}
def connectPkgs = [
'connect:api',
@@ -684,7 +695,8 @@ project(':core') {
println "Building project 'core' with Scala version ${versions.scala}"
apply plugin: 'scala'
- apply plugin: "org.scoverage"
+ if (userEnableTestCoverage)
+ apply plugin: "org.scoverage"
archivesBaseName = "kafka_${versions.baseScala}"
dependencies {
@@ -736,11 +748,13 @@ project(':core') {
testCompile libs.jfreechart
}
- scoverage {
- scoverageVersion = versions.scoverage
- reportDir = file("${rootProject.buildDir}/scoverage")
- highlighting = false
- minimumRate = 0.0
+ if (userEnableTestCoverage) {
+ scoverage {
+ scoverageVersion = versions.scoverage
+ reportDir = file("${rootProject.buildDir}/scoverage")
+ highlighting = false
+ minimumRate = 0.0
+ }
}
configurations {