Couverture du code de test d'instrumentation de projet multi-module dans des modules non `` d'application ''

Sep 16 2020

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

KH_AJU Oct 12 2020 at 14:02

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.