Robolectric vs Android Test Framework
Tut Robolectric bieten klare Vorteile im Vergleich zu Android Test Framework ? Ich habe gelesen, die docs in Bezug auf die Rahmenbedingungen, aber soweit ich sehen kann der einzige klare Vorteil in Bezug auf Robolectric ist, dass es läuft auf der JVM, anstatt die DalvikVM, die es schneller als Android-framework.
Gibt es andere große Vorteile, die heraus stehen ?
InformationsquelleAutor der Frage Traxex1909 | 2013-08-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Update-Apr-2015: Gradle build-tools und Android Studio jetzt offiziell unterstützt unit-testing und verhindern android.jar werfen stub (keine wirkliche Umsetzung) Fehler. Also, ja, es ist möglich, tests in Java VM, wenn stubs sind entsprechend verspottet. Seine ein Anfang, aber noch nicht vergleichbar mit Robolectric macht. Es gibt auch eine Dritte alternative, Blättern Sie unten in dieser Antwort.
Nun, über Robolectric :
Profis: hier sind ein paar Punkte über, wie es hat sich als sinnvoll erwiesen, im unit-testing:
Müssen Sie nicht führen Sie einen emulator, So können Sie testen, einige der nicht-UI-Teile, ohne dass ein emulator oder Gerät. Dies gilt auch für die Ausführung von tests über continuous integration/build-Server, kein emulator-Instanzen müssen gestartet werden.
Mit Android Studio können Sie schnell die Ausführung eines bestimmten test-Klasse, wenn Sie arbeiten an der Umsetzung zu erfüllen, die Testfälle. Sie können Fehler, wie Sie code schreiben. Dies ist eine massive Produktivitätssteigerung.
Vortäuschen kann fast jedes android-bezogene Sache, die als Schatten-Objekte, auch SQLite. Plus jedes Objekt Schatten stellt viele nützliche Funktionen, die Ihre normale android-Pendants nicht bieten. Mit der shadow-Kollegen von android-Objekts, die Sie tun können, eine interne Prüfung oder den Aufruf spezieller Methoden.
Wirklich glänzt beim Test von multi-threaded code wie
AsyncTask
sLoopers
undHandlers
etc. Sie können pause und fast-forward thread Loopers, auch Haupt-thread. Hervorragend für Hf-basierte callback-Tests.JUnit-4-format unterstützt. Android hält immer noch auf JUnit 3 letztes mal habe ich überprüft.
Können kombiniert werden mit anderen test-tools wie Mockito, Espresso etc etc.
Unterstützt mock Aktivität Instanz Erstellung
Robolectric.buildActivity()
und seine Kontrolle überActivityController
. Fragment/View-manipulation funktioniert auch auf solche mock-Aktivität Instanzen.Gibt es jetzt add-on Moduledass die Abdeckung der multi-dex -, v4-Unterstützung, play services, maps und http-client. So, jetzt einfach zu test-code mit diesen library-Funktionen.
Nachteile: dort fand ich es nicht so gut:
Robolectric zeichnet sich bei der Beihilfe Unit-Tests, aber deckt nicht alle Funktionen, die ein echtes Gerät oder emulator anbieten können. Beispielsweise sensoren, gps, open-gl, etc etc.
Du brauchst einen emulator oder auf einem echten Gerät, wenn dabei die integration-oder UI-Tests, so dass Aktivitäten und Dienste können interagieren mit vollen android-Umgebung (andere apps, wie mit der Kamera-app um ein Bild zu bekommen für Ihre app), nicht begrenzt. Hier müssen Sie die Verwendung der Standard-test-framework, wie es hat die Funktionen zu testen-UI.
JNI laden scheint nicht unterstützt zu werden. Also code mit nativen Abhängigkeit nicht getestet werden können.
Als jetzt, Robolectric hat eine fest verdrahtete Abhängigkeit von google-maps-Glas zu arbeiten. Und download weitere android.jar von maven. So, Projekt-setup erfordert möglicherweise ein bisschen eine Bastelei. Update: wie der v3 es scheint ziehen alle Abhängigkeiten über Gradle ohne viel Aufhebens.
Neueren Android-tools-support-Abdeckung und Berichte generation etc, aber nur, wenn der test ausgeführt werden, die auf einem Gerät. Also mit Robolectric Sie haben zusätzliche Gradle tasks (run Jaococ), um es für Sie tun. Update: Gradle 2.9 + Schiffe mit jacoco-plugin.
Als beide gradle und android-build-tools sind Versand aus neueren build-Versionen mit einer schnellen rate, stabil Robolectric Versionen wird manchmal beginnen, die Probleme mit der veränderten build-Werkzeuge. Die meisten typisch Probleme sind: sdk-version inkompatibel ist, zeige nicht gefunden, bauen Sie die Ausgabe Pfade nicht übereinstimmen, Ressourcen, die nicht be -, build-config-Probleme etc. Einige Fragen sind auch in Bezug auf bugs, die in android-tools. Zu Zeiten, Sie können auch schreiben Sie Ihre eigenen test-runner oder gelten übergangslösungen bis zur nächsten version behebt diese Probleme. Check-out offene Fragen und konfigurieren von tests entsprechend.
Andere alternative ist einfach mock Zeug auf Ihren eigenen, keine frameworks beteiligt. Seine "harte Weg", aber die meisten anpassbare Weise. Seine schlichte JUnit mit JMockit:
Oben ist ein Rohöl-und inline-Beispiel. Sie können tatsächlich erzeugen die richtige wiederverwendbaren Klassen (sagen
FragmentTestHarness
), der eine Komponente (sagenFragment
) unter test und wickeln Sie es in vollständig isolierten Umgebung, Vorbereitung für tests.InformationsquelleAutor der Antwort S.D.
Zu teilen, wie ich tun...
Robolectric
Für SQL-Aktivitäten fließen, für jene Objekte, die benötigt Kontext.
JUnit4
für die api-java-Modul, um sicherzustellen, dass Daten korrekt zurück.
Espresso
Für die überprüfung der Benutzeroberfläche korrekt angezeigt.
Wenn ich die api geändert...ich habe nur ausgeführt, jUnit4.
Wenn ich Sie modifiziert habe das data binding zwischen api und UI-oder Sqlite, dann werde ich nur laufen Robolectric.
Wenn ich Sie modifiziert habe UI ich nur ausführen, Espresso.
Manchmal werde ich ausführen, Robolectric und espresso zusammen, aber sehr selten.
Aber ich werde alle vor dem veröffentlichen im play store.
Weil ich denke, dass es keine echten Vorteil für jetzt. Aber sehen Sie, wie u es verwenden, um zu beschleunigen Ihre Produkt-Qualität und Geschwindigkeit der Entwicklung.
Mich korrigieren, wenn ich falsch bin.
InformationsquelleAutor der Antwort Shawn Thye
Den großen Vorteil, Robolectric ist die Geschwindigkeit. Unittests mit Robolectric nicht erfordern eine laufende emulator oder ein Gerät, um die tests auszuführen und damit viel, viel schneller.
Könnten Sie immer noch wollen, um eine suite von Integrations-tests, ausführen mit einem realen Gerät, nur in einem viel kleineren suite.
InformationsquelleAutor der Antwort koljaTM