web-dev-qa-db-fra.com

AndroidManifest dans le répertoire androidTest ignoré

J'essaie de tester en utilisant la structure de répertoires suivante (qui a été configurée par Android Studio):

test directory structure

Je peux exécuter certains tests très bien, et même le AllTests.Java fonctionne correctement sans que le fichier AndroidManifest.xml soit présent. Le problème est que, pour l'un de mes nouveaux tests, j'ai besoin de l'autorisation Android.permission.INTERNET. J'ai donc ajouté ce qui suit au fichier AndroidManifest.xml situé dans le répertoire androidTest:

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
          package="com.example.core"
          Android:versionCode="2"
          Android:versionName="2.0" >

    <uses-sdk Android:minSdkVersion="8" />

    <uses-permission Android:name="Android.permission.INTERNET" />
</manifest>

Malheureusement, ça ne marche pas. L'erreur suivante persiste lorsque j'effectue l'un de mes tests:

E/RestAPIRequestTest ﹕ Autorisation refusée (autorisation INTERNET manquante?)

J'ai essayé de définir package pour qu'il soit com.example.core.test dans mon fichier AndroidManifest.xml (car c'est ce qui apparaît dans la liste Paramètres-> Applications), mais sans joie.

Je pense que le fichier AndroidManifest.xml n'est même pas reconnu, car le numéro de version ne s'affiche pas non plus dans les paramètres de l'application de test.

Comment puis-je injecter les autorisations correctes pour mon projet de test?

24
jwir3

Je devais faire quelque chose de similaire. J'ai créé un dossier nommé "debug" à côté d'AndroidTest, qui correspond à la variante de débogage de l'application, et ai placé un fichier AndroidManifest.xml avec l'autorisation correspondante dans ce dossier. L'autorisation fonctionne alors sous test puisque l'application de test utilise la variante de débogage. Ce n'est pas idéal car cela brouille la limite entre test et débogage, ce qui n'est pas tout à fait la même chose.

Je pense que ce qui se passe, c'est que les autorisations dans androidTest/AndroidManifest.xml vont à l'application de test, pas à l'application cible, même si ce n'est pas tout à fait clair pour moi s'il existe réellement deux APK différents ou quoi.

23
user3286293

Dans les versions antérieures d'Android Studio et du plug-in Android Gradle, le fichier androidTest/AndroidManifest.xml était ignoré. Cela a été documenté sur le site tools.Android.com à l'époque.

Avec le lancement du plug-in Android Studio 1.0+ et Android Gradle 1.0+ en décembre 2014, le fichier AndroidManifest.xml doit maintenant être fusionné avec les fichiers principaux/AndroidManifest.xml (en plus des fichiers de manifeste de débogage et de libération s'ils existent). Plus de détails concernant la fusion de manifestes les règles sont ici .

Si vous rencontrez toujours des problèmes ou si vous êtes en train de déboguer des problèmes de test liés au manifeste, essayez ceci (Adaptez-le légèrement pour Windows):

  1. Déposer à un terminal
  2. accédez au répertoire de votre projet cd MyApplication
  3. Construisez votre projet en supposant que 'debug' est le type de construction que vous souhaitez tester, mais vous pouvez également tester avec 'release' ou un script de construction défini par un script ../gradlew assembleDebugTest 
  4. Puis inspectez votre manifeste APK de test: ls app/build/intermediates/manifests/test/debug/AndroidManifest.xml
  5. Affichez le manifeste de votre application APK: ls app/build/intermediates/manifests/full/debug/AndroidManifest.xml
  6. Vous trouverez un journal de sortie de la fusion détaillant le processus de fusion du manifeste: ls app/build/outputs/apk/manifest-merger-debug-report.txt

Quelques notes supplémentaires:

  • Un élément d'instrumentation est automatiquement ajouté à AndroidManifest.xml de votre APK de test. Vous ne devez donc ajouter que des activités, autorisations, etc. supplémentaires nécessaires à votre APK de test. 
  • Si vous testez avec des emplacements fictifs, votre application APK aura besoin de la permission ACCESS_MOCK_LOCATION . Vous pouvez ajouter l'autorisation à votre fichier debug/AndroidManifest.xml ou définir que l'APK de test et l'APK d'application doivent utiliser le même ID utilisateur lors de leur déploiement (attribut sharedUserId dans votre AndroidManifest.xml).
13
PaulR

Une solution serait comme construire principal apk et tester apk en une seule exécution . Exemple: ./gradlew clean :main:assembleDebug :main:assembleDebugAndroidTest.

Cela créera une nouvelle application principale instrumentée disposant de toutes les autorisations supplémentaires requises pour l'application de test.

0
VillageMonkey