So testen Sie ein Android Library-Projekt

97

Ich schreibe ein Android Library-Projekt, das auf der Android-Bitmap-Klasse (AndroindLib) basiert und nur die Utility-Klasse enthält (keine Aktivität). Ich habe versucht, es mit Android JUnit zu testen, aber es beschwert sich immer wieder, dass die AnroidLib.apk nicht gefunden werden kann

Was ist der richtige Weg, um Android Library Project zu testen?

Lilie
quelle
1
Oder ( schamloser Plug-Alarm ) Sie könnten ein von mir erstelltes Projekt verwenden: Android Library Test Harness (was ich gerne als "Alt H" bezeichne). Es ist als Git-Repo erhältlich: gitorious.org/alth Das Projekt befindet sich noch in der Entwicklung und die Dokumentation ist etwas spärlich. Wenn Sie Fragen haben, können Sie mich gerne kontaktieren.
i41

Antworten:

75

Zitieren der Dokumentation :

"Es gibt zwei empfohlene Methoden zum Einrichten von Tests für Code und Ressourcen in einem Bibliotheksprojekt:

  • Sie können ein Testprojekt einrichten, das ein Anwendungsprojekt instrumentiert, das vom Bibliotheksprojekt abhängt. Anschließend können Sie dem Projekt Tests für bibliotheksspezifische Funktionen hinzufügen.

  • Sie können ein Standardanwendungsprojekt einrichten, das von der Bibliothek abhängt, und die Instrumentierung in dieses Projekt einfügen. Auf diese Weise können Sie ein eigenständiges Projekt erstellen, das sowohl die Tests / Instrumente als auch den zu testenden Code enthält. "

CommonsWare
quelle
27
Sie müssen also im Grunde nur die Bibliothek zu Ihrem Testprojekt hinzufügen und das Testprojekt testen.
NJZK2
Der Link ist nicht mehr gültig. Können Sie uns auf den aktuellen Link verweisen?
Abdullah Jibaly
4
Ich bin mir nicht sicher, ob jemand mit diesen Empfehlungen erfolgreich war, aber ich habe es nicht getan. Versuchte zuerst die zweite Lösung und wenn ich versuche, in Eclipse auszuführen, erhalte ich Folgendes: <Projektname> gibt keine android.test.InstrumentationTestRunner-Instrumentierung an oder deklariert die Verwendungsbibliothek android.test.runner nicht in ihrer AndroidManifest.xml. Dies trotz der Tatsache, dass ich meinem Manifest sowohl die Instrumentierungs- als auch die Verwendungsbibliothek hinzugefügt habe.
Bellinghammer
2
Habe die zweite (und bevorzugte Arbeitsweise). Es ist sehr wichtig, dass Sie die Verwendungsbibliothek und die Instrumentierungselemente an der richtigen Stelle in Ihrem Manifest erhalten. Das Instrumentierungselement ist ein untergeordnetes Element des Stammmanifestelements, und das Verwendungsbibliothekselement ist ein untergeordnetes Element des Anwendungselements. Ich habe die Verwendungsbibliothek unter das Manifest-Element gestellt und beim Versuch, die Tests auszuführen, die obige Fehlermeldung erhalten.
Bellinghammer
17

Ändern Sie in Ihrem Testprojekt einfach den Paketnamen so, dass er mit dem Paket Ihrer Bibliothek übereinstimmt. Zum Beispiel haben Sie eine Bibliothek, deren Paket ist "com.example.lib". Erstellen Sie ein Testprojekt für Ihre Bibliothek. In der Manifestdatei sehen Sie package="com.example.lib.test"und targetPackage="com.example.lib". Ändern Sie einfach das Paket von "com.example.lib.test" in "com.example.lib" (belassen Sie es targetPackagewie es ist).

Stellen Sie außerdem sicher, dass die Bibliothek NICHT im Java-Erstellungspfad, sondern als normale Android-Bibliothek auf Ihr Testprojekt verweist : In Eclipse muss sie als Bibliothek auf der Project->Properties->AndroidRegisterkarte, jedoch nicht auf der Project->Properties->Java Build PathRegisterkarte angezeigt werden .

Führen Sie dann Ihre Tests durch.

alexaschka
quelle
Ihre Ideen machten für mich Sinn, so dass der Test sich selbst (als App) zum Ziel hatte und die App mit der Bibliothek verknüpft ist ... aber ich konnte sie nicht über Ant Build oder IntelliJ zum Laufen bringen .apk (erwartet für die zu testende App) existierte nicht, als es versuchte, sie zu installieren, da es zu "test / bin /.- debug.apk" kompiliert wird
Andrew Mackenzie
Ich habe es zum Laufen gebracht, indem ich einfach den Paketnamen des Testprojekts in seinem Manifest (und das zu testende Paket - das sollte dasselbe sein) so geändert habe, dass es NICHT mit dem Paketnamen des Bibliotheksprojekts übereinstimmt, und den Verweis auf den Zieltest entfernt habe Projekt in der Datei ant.properties.
Andrew Mackenzie
1
Ich denke, dies ist eine bessere Antwort als die akzeptierte, die nur die Dokumentation widerspiegelt - IMHO.
Andrew Mackenzie
5

Gemäß der Dokumentation :

Das Testen eines Bibliotheksmoduls entspricht dem Testen einer App. Der Hauptunterschied besteht darin, dass die Bibliothek und ihre Abhängigkeiten automatisch als Abhängigkeiten der Test-APK aufgenommen werden. Dies bedeutet, dass die Test-APK nicht nur ihren eigenen Code enthält, sondern auch den AAR der Bibliothek und alle ihre Abhängigkeiten. Da es keine separate "App im Test" gibt, installiert (und deinstalliert) die androidTest-Task nur die Test-APK. Beim Zusammenführen mehrerer Manifestdateien folgt Gradle der Standardprioritätsreihenfolge und führt das Manifest der Bibliothek in das Hauptmanifest der Test-APK ein.

Avilio
quelle
Welche Aufgabe sollen Tests durchgeführt werden? gradle test oder gradle androidTest? androidTest ist keine Aufgabe.
Sonnentag
Tools wie Firebase Test Lab erfordern jedoch eine APK oder AAB und akzeptieren keine AAR-Datei, die die Ausgabe der Assembler-Aufgabe der Bibliothek ist
Mustafa Berkay Mutlu
1

HINWEIS: Diese Lösung basiert auf der Verwendung von Eclipse Indigo (3.8.2) und muss möglicherweise für eine andere IDE etwas anders implementiert werden, obwohl die Grundprinzipien dieselben sind.

Ich hatte ähnliche Probleme und stellte fest, dass Folgendes immer funktioniert:

( HINWEIS: Diese Anweisungen dienen zum Erstellen einer neuen Projektgruppe von Grund auf neu. Wenn Sie bereits Teile der Projektgruppe erstellt haben, müssen Sie Ihre Projekte möglicherweise so ändern, dass sie auf dieselbe Weise verbunden werden. )

  1. Erstellen Sie ein neues Android Library-Projekt, indem Sie während der Erstellung das Kontrollkästchen "Is Library" aktivieren. (Zum Beispiel ein Android-Projekt namens "RemingtonAndroidTools").
  2. Erstellen Sie das Android Library-Projekt und stellen Sie sicher, dass eine JAR-Datei im Ordner bin erstellt wurde. (Zum Beispiel eine JAR-Datei mit dem Namen "RemingtonAndroidTools.jar".)
  3. Erstellen Sie ein leeres Android-Projekt zum Testen der Android-App, die als Android-Test-App dient. (Zum Beispiel ein Android-Projekt namens "RemingtonAndroidToolsTestApp"). Sie müssen den Quellcode oder die Ressourcen des Android Test App-Projekts nur ändern, wenn Sie etwas haben, das zum Testen hinzugefügt werden muss. Viele Dinge können ohne Änderungen am Android Test App Project getestet werden. Das Android Test App-Projekt ist eine Brücke zwischen Ihrem Android Library-Projekt und dem Android Junit-Projekt, die das Testen des Android Library-Projekts über Android Junit ermöglicht.
  4. Wechseln Sie zur Registerkarte Bibliothek des Java Build Path für das Android Test App-Projekt (in diesem Beispiel "RemingtonAndroidToolsTestApp").
  5. Fügen Sie die JAR-Datei (in diesem Beispiel "RemingtonAndroidTools.jar") des Android Library-Projekts (in diesem Beispiel "RemingtonAndroidTools") über die Schaltfläche "Jars hinzufügen ..." hinzu.
  6. Erstellen Sie ein neues Android-Testprojekt (z. B. "RemingtonAndroidToolsTester"), das als Android-Bibliothekstester dient, und wählen Sie das Android-Test-App-Projekt (in diesem Beispiel "RemingtonAndroidToolsTestApp") als Ziel aus.
  7. Wechseln Sie zur Registerkarte Bibliothek des Java Build Path für das Android Library Tester-Projekt (in diesem Beispiel "RemingtonAndroidToolsTester").
  8. Fügen Sie die JAR-Datei (in diesem Beispiel "RemingtonAndroidTools.jar") des Android Library-Projekts (in diesem Beispiel "RemingtonAndroidTools") über die Schaltfläche "Jars hinzufügen ..." hinzu.
  9. Suchen Sie den letzten Ordner Ihres Android-Pakets im Android Library Tester-Projekt (z. B. "danny.remington.remington_android_tools_test_app.test") und fügen Sie eine Testklasse (z. B. "MainActivityTest") hinzu, die von ActivityInstrumentationTestCase2 erbt.
  10. Bearbeiten Sie die Testklasse (in diesem Beispiel "TestActivityTest"), um die Aktivität (z. B. "TestActivity") der Android-Test-App (in diesem Beispiel "RemingtonAndroidToolsTestApp") als Parameter für ActivityInstrumentationTestCase2 zu verwenden.
  11. Bearbeiten Sie die Testklasse (in diesem Beispiel "TestActivityTest") und erstellen Sie einen Standardkonstruktor, der super (Class) aufruft und die Klasse der Android-Test-App (z. B. "TestActivity.class") übergibt.

Sie sollten am Ende drei Projekte haben (Android Library, Android Test App, Android Library Tester), die ungefähr so ​​aussehen:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Am Ende sollten Sie eine Klasse zum Testen Ihrer Android-Bibliothek haben, die ungefähr so ​​aussieht:

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);
   }

}

Sie können dann einen beliebigen Test hinzufügen. Sie müssen die Android-Test-App (in diesem Beispiel "RemingtonAndroidToolsTestApp") nicht weiter referenzieren, um Ihre Tests auszuführen, es sei denn, sie erfordern Zugriff auf eine Android-spezifische Komponente (wie z. B. den Ordner "Assets"). Wenn Sie auf Android-spezifische Komponenten zugreifen müssen, können Sie dies tun, indem Sie die Android-Test-App (in diesem Beispiel "RemingtonAndroidToolsTestApp") ändern und dann über die von der Standard-Android-Junit-API bereitgestellte Instrumentierung darauf verweisen. (Mehr dazu lesen Sie hier: http://developer.android.com/tools/testing/testing_android.html )

Danny Remington - OMS
quelle
0

Wenn Ihre Ulitiy-Klassen nicht von einem Android-spezifischen Code abhängen, können Sie einfach Standard-JUnit-Unit-Tests verwenden. Die Android-Versionen müssen nicht verwendet werden.

Cheryl Simon
quelle
2
Dies funktioniert nicht, da Standard-JUnit in die Standard-JVM kompiliert wird, während Android-Java-Dateien in die Dalvik-VM kompiliert werden.
Danny Remington - OMS