Comment tester un projet de bibliothèque Android

97

J'écris un projet de bibliothèque Android basé sur la classe Bitmap Android (appelez-le AndroindLib) qui ne contient que la classe utilitaire (aucune activité). J'ai essayé de le tester en utilisant Android JUnit, mais il continue de se plaindre de ne pas trouver le AnroidLib.apk

Quelle est la bonne façon de tester un projet de bibliothèque Android?

Lis
la source
1
Ou ( alerte de prise sans vergogne ), vous pouvez utiliser un projet que j'ai créé: Android Library Test Harness (ce que j'aime appeler "Alt H"). Il est disponible sous forme de dépôt git: gitorious.org/alth Le projet est encore en développement et la documentation est un peu clairsemée, alors n'hésitez pas à me contacter si vous avez des questions.
i41 le

Réponses:

75

Citant la documentation :

"Il existe deux méthodes recommandées pour configurer des tests sur le code et les ressources dans un projet de bibliothèque:

  • Vous pouvez configurer un projet de test qui instrumente un projet d'application qui dépend du projet de bibliothèque. Vous pouvez ensuite ajouter des tests au projet pour les fonctionnalités spécifiques à la bibliothèque.

  • Vous pouvez configurer un projet d'application standard qui dépend de la bibliothèque et placer l'instrumentation dans ce projet. Cela vous permet de créer un projet autonome contenant à la fois les tests / instrumentations et le code à tester. "

CommonsWare
la source
27
Donc, fondamentalement, tout ce que vous avez à faire est d'ajouter la bibliothèque à votre projet de test et de tester le projet de test.
njzk2
Le lien n'est plus valide, avez-vous une chance de nous indiquer l'actuel?
Abdullah Jibaly
4
Je ne sais pas si quelqu'un d'autre a réussi ces recommandations, mais je ne l'ai pas fait. J'ai d'abord essayé la deuxième solution et lorsque j'essaie de l'exécuter dans Eclipse, j'obtiens ce qui suit: <ProjectName> ne spécifie pas d'instrumentation android.test.InstrumentationTestRunner ou ne déclare pas la bibliothèque uses-android.test.runner dans son AndroidManifest.xml. Ceci malgré le fait que j'ai ajouté à la fois les éléments instrumentation et uses-library à mon Manifest.
Bellinghammer
2
Vous avez la deuxième (et la manière préférée de travailler). Il est très important que vous obteniez les éléments de la bibliothèque d'utilisations et d'instrumentation au bon emplacement dans votre manifeste. L'élément d'instrumentation est un enfant de l'élément manifeste racine et l'élément uses-library est un enfant de l'élément application. Je mettais la bibliothèque uses sous l'élément manifest et je me retrouvais avec le message d'erreur ci-dessus en essayant d'exécuter les tests.
Bellinghammer
17

Dans votre projet de test, modifiez simplement le nom du package afin qu'il soit le même que celui de votre bibliothèque. Par exemple, vous avez une bibliothèque dont le package est "com.example.lib". Créez un projet de test ciblant votre bibliothèque. Dans le fichier manifeste, vous verrez package="com.example.lib.test", et targetPackage="com.example.lib". Changez simplement le paquet de "com.example.lib.test" à "com.example.lib" ( targetPackagelaissez tel quel ).

Assurez-vous également que la bibliothèque est référencée à votre projet de test PAS dans le chemin de construction Java, mais comme une bibliothèque Android habituelle: dans Eclipse, elle doit être affichée comme bibliothèque dans Project->Properties->Androidtab, mais pas dans Project->Properties->Java Build Pathtab.

Ensuite, exécutez vos tests.

Alexaschka
la source
Vos idées avaient un sens pour moi, de sorte que le test se ciblait lui-même (en tant qu'application) et que l'application soit liée à la bibliothèque ... mais je n'ai pas pu le faire fonctionner via ant build ni IntelliJ .... .apk (attendu pour l'application testée) n'existait pas lorsqu'il a essayé de l'installer, car il est en cours de compilation dans "test / bin /.- debug.apk"
Andrew Mackenzie
Je l'ai fait fonctionner en changeant simplement le nom du package du projet de test dans son manifeste (et le package en cours de test - qui devrait être le même) pour ne PAS coïncider avec le nom du package du projet de bibliothèque, plus en supprimant la référence au test cible projet dans le fichier ant.properties.
Andrew Mackenzie
1
Je pense que c'est une meilleure réponse que celle acceptée, qui fait juste écho à la documentation - à mon humble avis.
Andrew Mackenzie
5

Selon la documentation :

Le test d'un module de bibliothèque revient au même que le test d'une application. La principale différence est que la bibliothèque et ses dépendances sont automatiquement incluses en tant que dépendances de l'APK de test. Cela signifie que l'APK de test comprend non seulement son propre code, mais également l'AAR de la bibliothèque et toutes ses dépendances. Comme il n'y a pas d '"application testée" distincte, la tâche androidTest installe (et désinstalle) uniquement l'APK de test. Lors de la fusion de plusieurs fichiers manifestes, Gradle suit l'ordre de priorité par défaut et fusionne le manifeste de la bibliothèque dans le manifeste principal de l'APK de test.

Avilio
la source
quelle tâche exécuter les tests? gradle test, ou gradle androidTest? androidTest n'est pas une tâche.
Dimanche
mais des outils comme Firebase Test Lab nécessitent un APK ou AAB et n'acceptent pas un fichier AAR qui est le résultat de la tâche d'assemblage de la bibliothèque
Mustafa Berkay Mutlu
1

REMARQUE: Cette solution est basée sur l'utilisation d'Eclipse Indigo (3.8.2) et pourrait devoir être implémentée légèrement différemment pour un autre IDE bien que les principes de base soient les mêmes.

J'ai eu des problèmes similaires et j'ai trouvé que faire ce qui suit fonctionne toujours:

( REMARQUE: ces instructions concernent la création d'un nouveau groupe de projets à partir de rien. Si vous avez déjà créé des parties du groupe de projets, vous devrez peut-être modifier vos projets afin qu'ils se connectent de la même manière. )

  1. Créez un nouveau projet Android Library en cochant la case "Is Library" lors de la création. (par exemple un projet Android nommé "RemingtonAndroidTools").
  2. Générez le projet de bibliothèque Android et vérifiez qu'il a créé un fichier jar dans le dossier bin. (par exemple, un fichier jar nommé "RemingtonAndroidTools.jar".)
  3. Créez un projet Android vide pour tester l'application Android qui servira d'application de test Android. (Par exemple, un projet Android nommé "RemingtonAndroidToolsTestApp"). Vous n'aurez pas besoin de modifier le code source ou les ressources du projet d'application de test Android, sauf si vous avez quelque chose à ajouter pour le test. De nombreux éléments peuvent être testés sans aucune modification du projet d'application de test Android. Le projet d'application de test Android est un pont entre votre projet de bibliothèque Android et le projet Android Junit qui permet de tester le projet de bibliothèque Android via Android Junit.
  4. Accédez à l'onglet Bibliothèque du chemin de génération Java pour le projet d'application de test Android («RemingtonAndroidToolsTestApp» dans cet exemple).
  5. Ajoutez le fichier jar ("RemingtonAndroidTools.jar" dans cet exemple) du projet de bibliothèque Android ("RemingtonAndroidTools" dans cet exemple) via le bouton "Ajouter des pots ...".
  6. Créez un nouveau projet de test Android (par exemple "RemingtonAndroidToolsTester") qui servira de testeur de bibliothèque Android et sélectionnez le projet d'application de test Android ("RemingtonAndroidToolsTestApp" dans cet exemple) comme cible.
  7. Accédez à l'onglet Bibliothèque du chemin de construction Java pour le projet Android Library Tester («RemingtonAndroidToolsTester» dans cet exemple).
  8. Ajoutez le fichier jar ("RemingtonAndroidTools.jar" dans cet exemple) du projet de bibliothèque Android ("RemingtonAndroidTools" dans cet exemple) via le bouton "Ajouter des pots ...".
  9. Recherchez le dernier dossier de votre package Android dans le projet Android Library Tester ("danny.remington.remington_android_tools_test_app.test" par exemple) et ajoutez une classe de test ("MainActivityTest" par exemple) qui hérite d'ActivityInstrumentationTestCase2.
  10. Modifiez la classe de test ("TestActivityTest" dans cet exemple) pour utiliser l'activité (par exemple "TestActivity") de l'application de test Android ("RemingtonAndroidToolsTestApp" dans cet exemple) comme paramètre pour ActivityInstrumentationTestCase2.
  11. Modifiez la classe de test ("TestActivityTest" dans cet exemple) et créez un constructeur par défaut qui fait un appel à super (Class) et passe la classe de l'application de test Android ("TestActivity.class" par exemple).

Vous devriez vous retrouver avec trois projets (bibliothèque Android, application de test Android, testeur de bibliothèque Android) qui ressemblent à ceci:

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

Vous devriez vous retrouver avec une classe pour tester votre bibliothèque Android qui ressemble à ceci:

package danny.remington.remington_android_tools_test_app.test;

import android.test.ActivityInstrumentationTestCase2;
import danny.remington.remington_android_tools_test_app.TestActivity;

/**
 * 
 */
public class TestActivityTest extends
      ActivityInstrumentationTestCase2<TestActivity> {

   public TestActivityTest() {
      super(TestActivity.class);
   }

}

Vous pouvez ensuite ajouter le test de votre choix. Vous n'aurez pas besoin de référencer l'application de test Android («RemingtonAndroidToolsTestApp» dans cet exemple) pour exécuter vos tests à moins qu'ils ne nécessitent l'accès à un composant spécifique à Android (comme le dossier Assets, par exemple). Si vous avez besoin d'accéder à des composants spécifiques à Android, vous pouvez le faire en modifiant l'application de test Android ("RemingtonAndroidToolsTestApp" dans cet exemple), puis en la référençant via l'instrumentation fournie par l'API Junit Android standard. (Vous pouvez en savoir plus à ce sujet ici: http://developer.android.com/tools/testing/testing_android.html )

Danny Remington - OMS
la source
0

Si vos classes ulitiy ne dépendent d'aucun code spécifique à Android, vous pouvez simplement utiliser des tests unitaires JUnit standard. Pas besoin d'utiliser les versions Android.

Cheryl Simon
la source
2
Cela ne fonctionne pas car JUnit standard est compilé sur la JVM standard tandis que les fichiers java Android sont compilés sur la VM Dalvik.
Danny Remington - OMS