Confus à propos de testCompile et androidTestCompile dans Android Gradle

87

Je suis nouveau dans le monde des tests et encore plus dans le monde des tests Android. En faisant des recherches sur Robolectric qui facilitent les tests sur Android, une chose me déroute le plus. Parfois, sur le Web, je vois des gens utiliser des testCompilemots clés dans les dépendances du script de construction gradle lors du référencement de Robolectric tandis que d'autres l'utilisent androidTestCompile. Les deux ne peuvent certainement pas être valides?

Quelqu'un peut-il expliquer la différence entre les deux et lequel de ceux-ci devrait être celui utilisé lors de l'utilisation de Robolectric?

Lucas
la source

Réponses:

120

testCompileEst simplement la configuration pour les tests unitaires (ceux situés dans src / test ) et androidTestCompileest utilisée pour l'API de test (celle située dans src / androidTest ). Puisque vous avez l'intention d'écrire des tests unitaires, vous devez utiliser testCompile.

Mise à jour: la principale distinction entre les deux est que l'ensemble de testsources s'exécute dans une JVM Java standard, tandis que les androidTesttests de l'ensemble de sources s'exécutent sur un appareil Android (ou un émulateur).

Mark Vieira
la source
Merci. C'est ce que j'ai pensé au début, mais si c'est le cas, pourquoi certaines font référence à la dépendance robolectric avec testCompile et d'autres avec androidTestCompile. N'est-ce pas une bibliothèque qui aide à écrire des tests d'intégration? Si tel est le cas, ne devrait-il pas être référencé avec androidTestCompile? Cependant, même le guide officiel de robolectric ordonne d'utiliser testCompile ... Désolé mais c'est trop déroutant pour moi à ce stade, comme vous pouvez le voir.
Lucas
3
Les conventions de dénomination sont un peu étranges. Fondamentalement, si vous écrivez des tests unitaires (tests qui ne seront pas exécutés sur le périphérique), ils existeraient dans 'src / test' et leurs dépendances appartiendraient donc à la testCompileconfiguration. Les dépendances ajoutées à la androidTestCompileconfiguration ne seront disponibles que pour la source dans 'src / androidTest', qui est en fait intégré dans un APK et déployé sur un appareil.
Mark Vieira
Merci de m'avoir indiqué une direction. Cela n'a pas répondu à toutes mes questions mais cela m'a aidé dans mes recherches. Juste pour clarifier ce que vous avez dit, les tests unitaires ne sont pas seulement ceux du dossier de test (par défaut). Ironiquement, Google appelle parfois les tests situés dans androidTest également en tant que tests unitaires. Dépend bien sûr du but du test particulier, mais ajoute encore à la confusion.
Lucas
1
C'est principalement de la sémantique, donc je ne serais pas accroché à eux. De nombreux tests écrits avec Roboelectric sont sans doute des tests d'intégration, et non des tests unitaires de toute façon. Cela étant dit, la principale distinction entre les deux est que 'src / test' s'exécute sur la machine des développeurs dans une JVM standard et 'src / androidTest' est emballé dans un APK et exécuté sur un périphérique réel (ou un émulateur).
Mark Vieira
1
Je pense que le support de 'src / test' que vous avez vu auparavant était simplement celui qui était disponible via le plugin standard Gradle Java. Par conséquent, il n'y avait pas de support pour les saveurs ou les types de build. Désormais, le plugin Android prend entièrement en charge les tests unitaires, afin d'inclure des ensembles de sources de test unitaires par variante.
Mark Vieira
3

Pour répondre à votre question - Utilisez testCompile pour robolectric

pourquoi, parce que robolectric fonctionne sur la JVM en se moquant de tout le comportement de l'appareil Android.

testCompile et androidTestCompile sont des dossiers Android "par convention" que gradle utilise lors de l'exécution des tâches fournies par le plugin Android.

androidTestDebug sélectionne les tests dans le dossier androidTest, testDebug sélectionne les tests dans le dossier test,

Encore une fois, ce ne sont que des dossiers de convention que vous pouvez donner des ensembles de sources pour ces configurations

Remarque: l'espresso est une bibliothèque tellement géniale, essayez de vous éloigner de robolectric :)

Amit Kaushik
la source
1

// test unitaire

testCompile 'junit:junit:4.12'

Le code ci-dessus est une dépendance de JUnit 4 dans le fichier build.gradle dans Android Studio. Vous voyez qu'il a testCompile, car JUnit s'exécute sur JVM et ne nécessite pas de périphérique ou d'émulateur pour s'exécuter. Cela signifie également que les tests JUnit ne nécessiteront pas le contexte de l'application pour s'exécuter et s'ils le nécessitent, nous aurions besoin de les "MOCK".

// Test unitaire insturmenté

androidTestCompile('com.android.support.test:runner:0.5', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

Nous voyons maintenant androidTestCompile ici, car cette fois, nous avons l'intention d'utiliser l'appareil ou l'émulateur pour les tests, c'est-à-dire les tests d'instrumentation. Pour une meilleure clarification, je suggérerais de lire sur developer.android.com

Lazycoder_007
la source
0

Pour ajouter une dépendance pour les tests JVM ou les tests unitaires (les tests ne reposent que sur un environnement Java, nous n'avons besoin d'aucun environnement Android).

Nous utilisons la directive testCompile. Exemple:

dependencies {
    testCompile gradleTestKit()
}

Pour ajouter la dépendance pour le test d'instrumentation (ces tests reposent principalement sur l'environnement Android), nous utilisons la androidTestCompiledirective.

Subhasish Nath
la source