Unterschied zwischen Android Instrumentation Test und Unit Test in Android Studio?

74

Ab Android Studio 1.1rc gibt es Unterstützung für Unit-Tests und ich frage mich, was der Unterschied zwischen Android-Instrumentierungstests und Unit-Tests ist.

So wie ich es verstehe:
Unit-Tests sind nützlich, um Code zu testen, der die Android-API nicht aufruft, und die Android-Instrumentierungstests sind eher Integrationstests zum Testen von Android-API-spezifischen Elementen oder GUI-Komponenten.

Wenn Sie jedoch in Ihren Komponententests ein Framework wie Robolectric oder Mockito verwenden, können Sie Android-Code (ohne Gerät) testen, wenn ich mich nicht irre.


Ist das richtig oder gibt es einen größeren Unterschied? Wenn ja, wozu dient jeder?

Joen93
quelle

Antworten:

40

Unit-Tests isolieren die zu testende Komponente, und dies ist der Grund, warum sie häufig zusammen mit Mocks-Frameworks als Mockito verwendet werden: weil sie die Unit von ihren Abhängigkeiten isolieren. Bitte beachten Sie, dass Ihre Aussagen zur Android-API teilweise zutreffen, da es auch Instrumented Unit-Tests gibt , nämlich Instrumentation ist ebenfalls Teil des Junit-Pakets und auch die Klassen, die TestCase als Klasse AndroidTestCase erweiternist Teil des Junit-Pakets, ermöglicht jedoch die Verwendung von A) Context, den Sie mit getContext () aufrufen können, und B) Resources, die Teil der Android-API sind! Beachten Sie auch, dass AndroidTestCase eine Basisklasse ist und es mehrere andere nützliche Klassen gibt, die diese Klasse erweitern. Sie testen speziell Loader, ContentProvider und sogar Services und haben Zugriff auf die Android-API. Daher bieten diese Klassen ein JUnit-Testframework sowie Android-spezifische Methoden. Mit Junit4 gibt es jetzt die ServiceTestRule, die sich direkt von Object aus erstreckt und es Ihnen ermöglicht, einen Service einfacher zu testen, obwohl Sie eine Absicht nicht direkt in dieser Klasse starten können.

Instrumentationstests gehören ebenfalls zum Junit-Paket, aber die Kontrolle über die Android-API ist ziemlich vollständig, da Instrumentationstests im System instanziiert werden, bevor ein Anwendungscode ausgeführt wird. Zum Testen müssen Sie die reale Anwendung (Emulator oder Telefon) öffnen mit USB verbunden). Sie greifen auf Android-Komponenten (z. B. Klicken auf eine Schaltfläche) und den Anwendungslebenszyklus zu. Sie sind normalerweise langsamer als Junit-Tests, die TestCase erweitern (die oben untersuchten). Die typische Verwendung erfolgt mit ActivityInstrumentationTestCase2, das einen funktionalen Testansatz hat und benutzerorientierter ist.

BEARBEITEN: In Bezug auf Roboelectric und Mockito, die derzeit (13. Juli 2016) mit Espresso zwischen den derzeit beliebtesten Test-Frameworks zusammenarbeiten, können Sie mit Roboelectric mehrere Tests in Sekunden statt in Minuten ausführen. Dies ist sehr praktisch in Teams, die dies müssen Führen Sie kontinuierliche Tests durch und unterliegen Sie einer kontinuierlichen Integration.

Von der Website von Robolectric:

Ein alternativer Ansatz für Robolectric besteht darin, Mock-Frameworks wie Mockito zu verwenden oder das Android SDK zu verspotten. Dies ist zwar ein gültiger Ansatz, führt jedoch häufig zu Tests, bei denen es sich im Wesentlichen um umgekehrte Implementierungen des Anwendungscodes handelt. Roboelectric ermöglicht einen Teststil, der dem Black-Box-Testen näher kommt, wodurch die Tests für das Refactoring effektiver werden und sich die Tests auf das Verhalten der Anwendung konzentrieren können, anstatt auf die Implementierung von Android. Sie können weiterhin ein Spott-Framework zusammen mit Robolectric verwenden, wenn Sie möchten.

Mockito, das auch mit Junit verwendet werden kann, wird wirklich verwendet, mit Ausnahme der Fälle, in denen endgültige Klassen, anonyme Klassen oder primitive Typen verwaltet werden müssen.

trocchietto
quelle
47

Es scheint mir, dass Instrumentierungstests Integrationstests mit der Fähigkeit sind, den Lebenszyklus und die Ereignisse (onStart, onCreate usw.) der App zu steuern.

Unit-Tests, so wie ich es verstehe, testen eine Unit (z. B. Klasse) auf ihre Daten und ihr Verhalten.

Angenommen, Sie haben ein Spiel: Dieses Spiel läuft auf einer Aktivität (Hauptaktivität) und Sie haben einen Charakter, der auf einer Roboterklasse basiert und über zwei Methoden verfügt (Feuer und Bewegung). Sie würden die Hauptaktivität mit einem Instrumentierungstest testen, um festzustellen, ob sie beim Verlassen der App korrekt gespeichert wird, ob sie beim Wiederherstellen korrekt wiederhergestellt wird usw., und Sie würden den Roboter mit einem Komponententest testen, um seine Attribute und sein Verhalten zu testen.

Haftungsausschluss: Ich bin keine Java-Person, aber ich habe mich für Ihre Frage interessiert und sie aufgrund einer kleinen Online-Suche beantwortet. Sie müssen sich wahrscheinlich eingehender damit befassen, um eine detailliertere Antwort zu finden.

gemantzu
quelle
34

EINHEITSTEST

Unit-Tests, die nur auf Ihrem lokalen Computer ausgeführt werden. Diese Tests werden so kompiliert, dass sie lokal auf der JVM ausgeführt werden, um die Ausführungszeit zu minimieren. Verwenden Sie diesen Ansatz, um Komponententests auszuführen, die keine Abhängigkeiten vom Android-Framework aufweisen oder Abhängigkeiten aufweisen, die Scheinobjekte erfüllen können.

Im Grunde genommen führen Sie einfachen Java-Code aus, um beispielsweise einen Inhaltsanbieter, Datenbankverbindungen sowie die Eingabe und Ausgabe von Methoden zu testen. Dies läuft nicht auf Android. Zum Ausführen benötigen Sie KEIN Gerät.

INSTRUMENTATIONSTEST

Unit-Tests, die auf einem Android-Gerät oder Emulator ausgeführt werden. Diese Tests haben Zugriff auf Instrumentierungsinformationen, z. B. den Kontext der zu testenden App. Verwenden Sie diesen Ansatz, um Komponententests mit Android-Abhängigkeiten auszuführen, die Scheinobjekte nicht einfach erfüllen können.

Es verspottet also, wie der Benutzer die eigentliche Anwendung verwendet. Daher benötigen Sie ein Gerät (physisch oder Emulator), um sie auszuführen. Es hat Zugriff auf Ansichten, Aktivitäten, Kontext usw.

Referenz: http://developer.android.com/tools/testing/testing_android.html

Isaac Urbina
quelle
3

Das Diagramm der Testtypen in der Android-Welt

[Doppeltypen testen]

yoAlex5
quelle
1

Unit Testing:

Oft Unit - Tests werden als „lokale Tests“ oder „local Unit - Tests“ bezeichnet. Der Hauptgrund dafür scheint zu sein, dass Sie Tests ohne angeschlossenes Gerät oder Emulator ausführen möchten.

Unit-Tests können die Benutzeroberfläche Ihrer App nicht testen, ohne Objekte wie eine Aktivität zu verspotten.


Instrumentierungstests:

Instrumentierungstests werden auf einem Gerät oder einem Emulator ausgeführt. Im Hintergrund wird Ihre App installiert, und anschließend wird eine Test-App installiert, die Ihre App steuert, startet und nach Bedarf UI-Tests ausführt.

Instrumentierungstests können auch verwendet werden, um keine UI-Logik zu testen. Sie sind besonders nützlich, wenn Sie Code testen müssen, der von einem Kontext abhängig ist.


Ref Link zum Beispiel

akhilesh0707
quelle
0

Unit Testing

Es wird nur auf dem lokalen Computer ausgeführt.

Instrumentationstestfall

Es läuft auf dem Android-Gerät oder Emulator. Wenn Sie den Testfall überprüfen, läuft es auf dem Emulator oder Android-Gerät

Mathi
quelle