Jacoco de couverture de code dans Android Studio avec des saveurs
j'ai essayé de faire des tests sur Jacoco depuis un moment maintenant. J'ai essayé plusieurs solutions possibles rapportées dans ces sujets:
code de test Android avec JaCoCo Gradle plugin
J'exécute les essais dans un dispositif émulaté en utilisant genymotion. Voici ce que j'ai ajouté à construire.gradle:
apply plugin: 'jacoco'
android{
jacoco {
version "0.7.1.201405082137"
}
buildTypes{
debug{
testCoverageEnabled = true
}
}
}
jacoco {
toolVersion "0.7.1.201405082137"
}
à exécutez-je utiliser quelque chose comme
./gradlew clean
./gradlew createFLAVOR_NAMEDebugCoverageReport
pertinentes générées fichiers/dossier sont les suivantes:
/build/intermediates/coverage-instrumented-classes
/build/intermediates/jacoco
/build/outputs/code-coverage/connected/flavors/MyFlavor/coverage.ec
Toutefois, il n'y a rien @ construire/rapports/jacoco/test/html/index.html ou toute page html / code rapport de couverture @ / build / outputs.
j'ai aussi essayé de créer une tâche dédiée pour construire un rapport de couverture:
def coverageSourceDirs = [
'src/main/java',
]
task jacocoTestReport(type: JacocoReport, dependsOn: "connectedAndroidTestFLAVOR_NAMEDebug") {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
reports {
xml.enabled = true
html.enabled = true
}
classDirectories = fileTree(
dir: './build/intermediates/classes/debug',
excludes: ['**/R*.class',
'**/*$InjectAdapter.class',
'**/*$ModuleAdapter.class',
'**/*$ViewInjector*.class'
])
sourceDirectories = files(coverageSourceDirs)
executionData = files("$buildDir/jacoco/connectedAndroidTestMyFlavorDebug.exec")
// Bit hacky but fixes https://code.google.com/p/android/issues/detail?id=69174.
// We iterate through the compiled .class tree and rename $$ to $.
doFirst {
new File("$buildDir/intermediates/classes/").eachFileRecurse { file ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}
}
./gradlew propre et ./ gradlew jacocoTestReport. La sortie est la même que ci-dessus, donc, pas de code html page de couverture du rapport ou tout autre fichier.
J'utilise actuellement Android Studio v1.0.2 avec la dernière version de gradle. Je suis assez nouveau à gradle, il est donc possible que je manque quelque chose de base ici.
Merci
2 réponses
Après avoir passé toute la journée à chasser cette question, j'ai trouvé le problème. Contrairement aux exemples que j'ai vus, le fichier généré par la construction de testDebug n'est pas le .fichier exec@$buildDir/jacoco / testDebug.exec.
Avec mon gradle et studio version du fichier généré est un .ce @build/sorties/code-couverture/connecté/saveurs/myFlavor/la couverture.ce
Je n'ai trouvé aucune information pertinente à ce sujet. Il peut être d'une récente changer, cependant, en créant une tâche JacocoReport personnalisée et en changeant la variable executionData en conséquence j'ai résolu le problème. Voici mon oeuvre:
task jacocoTestReport(type: JacocoReport) {
def coverageSourceDirs = [
'src/main/java'
]
group = "Reporting"
description = "Generates Jacoco coverage reports"
reports {
xml{
enabled = true
destination "${buildDir}/reports/jacoco/jacoco.xml"
}
csv.enabled false
html{
enabled true
destination "${buildDir}/jacocoHtml"
}
}
classDirectories = fileTree(
dir: 'build/intermediates/classes',
excludes: ['**/R.class',
'**/R$*.class',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*Activity*.*',
'**/*Fragment*.*'
]
)
sourceDirectories = files(coverageSourceDirs)
additionalSourceDirs = files(coverageSourceDirs)
executionData = files('build/outputs/code-coverage/connected/flavors/smartcompanion/coverage.ec')
}
Test du rapport de couverture utilisant Jacoco avec des saveurs Android:
considérons que vous avez des saveurs nommées "free" et "paid"
Etape 1 : Créer le fichier jacoco.gradle dans le répertoire des modules de vos projets (par défaut app) où build.gradle existe, il devrait être à côté de construire.dossier gradle. structure du répertoire tel qu'indiqué ci-dessous
app > jacoco.gradle
Etape 2: Coller ci-dessous code dans le fichier que nous avons créé à L'Étape 1 , le code a commentaires explicatifs pour comprendre
apply plugin: 'jacoco'
jacoco {
toolVersion = "0.7.5.201505241946"
}
project.afterEvaluate {
// Grab all build types and product flavors
def buildTypes = android.buildTypes.collect { type ->
type.name
}
def productFlavors = android.productFlavors.collect { flavor ->
flavor.name
}
// When no product flavors defined, use empty
if (!productFlavors) productFlavors.add('')
//iterate over the flavors
productFlavors.each {
productFlavorName ->
//iterate over build types like debug,release,prod etc.
buildTypes.each {
buildTypeName ->
//sourceName — e.g. freeDebug ,sourcePath — e.g. free/debug
def sourceName, sourcePath
if (!productFlavorName) {
sourceName = sourcePath = "${buildTypeName}"
} else {
sourceName = "${productFlavorName}${buildTypeName.capitalize()}"
sourcePath = "${productFlavorName}/${buildTypeName}"
}
// testTaskName — e.g. testFreeDebugtest task that the coverage task depends on,
def testTaskName = "test${sourceName.capitalize()}UnitTest"
// Create coverage task of form 'testFlavorTypeCoverage' depending on 'testFlavorTypeUnitTest'
task "${testTaskName}Coverage" (type:JacocoReport, dependsOn: "$testTaskName") {
group = "Reporting"
description = "Generate Jacoco coverage reports on the ${sourceName.capitalize()} build."
classDirectories = fileTree(
dir: "${project.buildDir}/intermediates/classes/${sourcePath}",
excludes: [
'**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/*$ViewBinder*.*',
'**/BuildConfig.*',
'**/Manifest*.*'
]
)
def coverageSourceDirs = [
"src/main/java",
"src/$productFlavorName/java",
"src/$buildTypeName/java"
]
additionalSourceDirs = files(coverageSourceDirs)
sourceDirectories = files(coverageSourceDirs)
executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec")
reports {
//enables and disable the type of file you need
xml.enabled = false
html.enabled = true
}
}
}
}
}
Etape 3: Exécutez les commandes ci-dessous dans le terminal android studio pour construire l'application
./gradlew propre assembler
Étape 4: sur build sucessfull , exécutez la commande ci-dessous pour générer le rapport de test (changez la chaîne "testFreeDebugUnitTestCoverage" à votre propre flavor / build type, par exemple pour la commande de version payante sera ./ gradlew testpaidddebugunittestcoverage)
./ gradlew testFreeDebugUnitTestCoverage
Étape 5:
il devrait donner le message de succès dans le terminal, maintenant allez dans le répertoire
>app > build > reports >jacoco >${testName} >look for html or xml file report file
- Étape 6: vous pouvez maintenant ouvrir et visualiser le fichier html test coverage dans le navigateur
bonne Chance !!!