You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
4.4 KiB
109 lines
4.4 KiB
/**
|
|
* This script plugin is used to bundle the host test (e.g. Robolectric) results and dist it in
|
|
* a location where TradeFed knows how to parse.
|
|
*
|
|
* - If a non-dist build is run with test, it will run the normal unit tests, failing the build if
|
|
* there are test failures.
|
|
* - If a dist build is run with test (e.g. ./gradlew dist test), the build will ignore any test
|
|
* failures, and will create a zip of the XML test reports for each test run, and copy them to
|
|
* dist/host-test-reports for consumption by TradeFed.
|
|
*/
|
|
|
|
apply plugin: 'dist'
|
|
apply plugin: 'jacoco'
|
|
|
|
// If unit tests are run as part of the build, dist the test XML reports to host-test-reports/*.zip
|
|
android.unitTestVariants.all { variant ->
|
|
def task = tasks.findByName('test' + variant.name.capitalize())
|
|
gradle.taskGraph.whenReady { taskGraph ->
|
|
// Ignore the failures, so the build continues even on test errors when the build is
|
|
// running with 'dist'. (Usually as part of a build server build)
|
|
task.ignoreFailures = taskGraph.hasTask(tasks.dist)
|
|
}
|
|
|
|
def junitReport = task.reports.junitXml
|
|
if (junitReport.enabled) {
|
|
// Create a zip file of the XML test reports
|
|
def zipTask = tasks.create("zipResultsOf${task.name.capitalize()}", Zip) {
|
|
from junitReport.destination
|
|
archiveName = task.name + 'Result.zip'
|
|
destinationDir = junitReport.destination.parentFile
|
|
}
|
|
task.finalizedBy zipTask
|
|
|
|
// Copy the test reports to dist/host-test-reports
|
|
// The file path and format should match GradleHostBasedTest class in TradeFed.
|
|
tasks.dist.mustRunAfter zipTask
|
|
dist.file zipTask.archivePath.path, "host-test-reports/${zipTask.archiveName}"
|
|
}
|
|
}
|
|
|
|
/*
|
|
* The section below adds code coverage to all the unitTest targets. By default, the jacoco plugin
|
|
* only adds to the 'java' plugin and not the Android ones.
|
|
*
|
|
* For each unitTest task "fooUnitTest", a new target "fooUnitTestCoverage" will be generated for
|
|
* to generate the jacoco report.
|
|
*/
|
|
android.testOptions.unitTests.all {
|
|
// Fix robolectric tests reporting 0 coverage on newer versions of the plugin.
|
|
jacoco {
|
|
includeNoLocationClasses = true
|
|
}
|
|
}
|
|
|
|
// Define the main coverage task if it does not exist. This task generates coverage report for all
|
|
// unit tests.
|
|
def coverageTask = tasks.findByName('coverage') ?: tasks.create('coverage') {
|
|
group = "Reporting"
|
|
description = "Generate Jacoco coverage reports"
|
|
}
|
|
|
|
android.unitTestVariants.all { variant ->
|
|
def testTaskName = "test${variant.name.capitalize()}"
|
|
def testTask = tasks.findByName(testTaskName)
|
|
|
|
// Create coverage task of form 'testFlavorCoverageUnitTestCoverage' depending on
|
|
// 'testFlavorCoverageUnitTest'
|
|
def jacocoTask = tasks.create("${testTaskName}Coverage", JacocoReport) {
|
|
group = "Reporting"
|
|
description = "Generate a Jacoco coverage report for robolectric tests on ${variant.name}."
|
|
|
|
classDirectories = fileTree(
|
|
dir: "${project.buildDir}/intermediates/classes/" +
|
|
"${variant.productFlavors[0].name}/${variant.buildType.name}",
|
|
excludes: ['**/R.class',
|
|
'**/R$*.class',
|
|
'**/BuildConfig.*',
|
|
'**/Manifest*.*']
|
|
)
|
|
|
|
sourceDirectories = files(variant.testedVariant.sourceSets.collect { it.java.srcDirs })
|
|
executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec")
|
|
|
|
reports {
|
|
xml.enabled = true
|
|
html.enabled = true
|
|
}
|
|
}
|
|
jacocoTask.dependsOn testTask
|
|
|
|
// Create a zip file of the HTML coverage reports
|
|
def zipTask = tasks.create("zipResultsOf${jacocoTask.name.capitalize()}", Zip) {
|
|
from jacocoTask.reports.html.destination
|
|
archiveName = "${testTaskName}HtmlCoverage.zip"
|
|
destinationDir = jacocoTask.reports.html.destination.parentFile
|
|
}
|
|
jacocoTask.finalizedBy zipTask
|
|
|
|
// Copy the coverage reports to dist/host-test-coverage
|
|
// The file path and format should match JacocoLogForwarder class in TradeFed.
|
|
tasks.dist.mustRunAfter jacocoTask
|
|
dist.file jacocoTask.reports.xml.destination.path, "host-test-coverage/${jacocoTask.name}.xml"
|
|
|
|
tasks.dist.mustRunAfter zipTask
|
|
dist.file zipTask.archivePath.path, "host-test-coverage/${zipTask.archiveName}"
|
|
|
|
coverageTask.dependsOn(jacocoTask)
|
|
}
|