Couverture du code de test d'instrumentation de projet multi-module dans des modules non `` d'application ''
J'ai une structure de projet comme:
--app
--module2 // module de bibliothèque
--module3 // module de bibliothèque
Je suis en train d' écrire des cas de test d'instrumentation pour mon projet androïde module multipuces avec couverture code jacoco . Si j'exécute les cas de test d'instrumentation à partir du module 'app', la couverture de code n'est générée que pour les classes de module 'app'.
Ainsi, afin d'obtenir une couverture de code pour les classes 'module2' et 'module3'; J'ai écrit des cas de test d'instrumentation dans les modules respectifs.
Un problème survient lorsque j'exécute des cas de test d'instrumentation dans des modules non-app, que je ne peux pas lancer l'activité principale, que l'application ne se lance pas pendant l'instrumentation et que les cas de test échouent.
La cause première est:
@Rule
public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);
@Rule n'est pas déclaré dans 'module2' et 'module3' qui lancent 'MainActivity.class'. Je ne peux pas importer «MainActiviy» dans ces modules en raison de problèmes de dépendance circulaire.
Erreur:
java.lang.RuntimeException: No activities found. Did you forget to launch the activity by calling getActivity() or startActivitySync or similar?
Comment y faire face?
NB: Cette question concerne exclusivement les tests d'instrumentation , pas les tests unitaires (cela est déjà traité dans les tests unitaires)
Question similaire
Réponses
J'ai suivi cette réponse et changé la tâche gradle en fonction de mes besoins. Ajout de la tâche gradle pour référence.
task jacocoUiTestReportAllModules(type: JacocoReport, dependsOn: 'createDebugCoverageReport') {
group "Reports"
description "Generate Jacoco Instrumented Tests coverage reports for all modules"
reports {
xml.enabled = true
html.enabled = true
html.destination file("${rootProject.buildDir}/coverage-report") } def javaClasses = [] def kotlinClasses = [] def javaSrc = [] def kotlinSrc = [] def execution = [] rootProject.subprojects.each { proj -> javaClasses << fileTree(dir: "$proj.buildDir/intermediates/javac/debug", excludes: fileFilter)
kotlinClasses << fileTree(dir: "$proj.buildDir/tmp/kotlin-classes/debug", excludes: fileFilter) javaSrc << "$proj.projectDir/src/main/java"
kotlinSrc << "$proj.projectDir/src/main/kotlin" execution << fileTree(dir: proj.buildDir, includes: [ 'outputs/code_coverage/debugAndroidTest/connected/**/*.ec']) } getSourceDirectories().setFrom(files([javaSrc, kotlinSrc])) getClassDirectories().setFrom(files([javaClasses, kotlinClasses])) getExecutionData().setFrom(execution) doLast() { print "file://${reports.html.destination}/index.html"
}
}
Après avoir exécuté gradlew jacocoUiTestReportAllModulesle rapport avec une couverture complète sera présent dans [projRoot]/build/coverage-report.