wake-up-neo.com

Unterschied zwischen Android-Instrumentationstest und Unit-Test in Android Studio?

Seit Android Studio 1.1rc gibt es Unit-Testsupport und Ich frage mich, was der Unterschied zwischen Android-Instrumentationstests und Unit-Tests ist.

So wie ich es verstehe:
Unit-Tests sind nützlich, um Code zu testen, der nicht die Android-API (_) aufgerufen wird, und die Android-Instrumentierungstests sind eher Integrationstests bestimmte Elemente oder GUI-Komponenten.

Wenn Sie jedoch ein Framework wie Robolectric oder Mockito in Ihren Unit-Tests verwenden, können Sie den Android-Code (ohne die Notwendigkeit eines Geräts) testen, wenn ich mich nicht irre.


Ist das richtig oder gibt es einen größeren Unterschied? Wenn ja, was nützt es?

54
Joen93

Unit-Tests isolieren die zu testende Komponente, weshalb sie oft zusammen mit Mocks-Frameworks als Mockito verwendet werden: weil die Einheit von ihren Abhängigkeiten isoliert wird. Bitte beachten Sie, dass das, was Sie zur Android-API sagen, teilweise wahr ist, denn es gibt auch Instrumented Unit-Tests , nämlich Instrumentation ist Teil des Junit-Pakets, und auch die Klassen, die TestCase als Klasse erweitern AndroidTestCase ist Teil des Junit-Pakets, erlaubt jedoch die Verwendung von A) Context, den Sie mit getContext () aufrufen können, und B) Ressourcen, die Teil der Android-API sind! Beachten Sie bitte auch, dass AndroidTestCase eine Basisklasse ist und es gibt einige andere nützliche Klassen, die diese Klasse erweitern. Sie testen speziell Loader, ContentProviders und sogar Services und haben auch Zugriff auf die Android-API. Daher bieten diese Klassen ein JUnit-Testframework sowie Android-spezifische Methoden. Mit Junit4 gibt es jetzt die ServiceTestRule, die direkt von Object ausgeht und Ihnen das Testen eines Service erleichtert. Sie können jedoch keine Intent direkt in dieser Klasse starten.

Instrumentation tests sind ebenfalls Bestandteil des Junit-Pakets, aber die Steuerung der Android-API ist ziemlich umfassend, da Instrumentationstests im System instanziiert werden, bevor Anwendungscode ausgeführt wird. Zum Testen müssen Sie die echte Anwendung öffnen ( Emulator oder ein an USB angeschlossenes Telefon). 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 aufweist, der benutzerorientierter ist. 

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

Von der Website von Robolectric:

Ein alternativer Ansatz für Robolectric ist die Verwendung von Mock-Frameworks wie Mockito oder das Android-SDK zu verspotten. Dies ist zwar eine gültige Herangehensweise führt dies häufig zu Tests, die im Wesentlichen umgekehrt sind Implementierungen des Anwendungscodes . Roboelectric ermöglicht einen Teststil, der dem Black-Box-Test näher kommt, um die Tests effektiver für das Refactoring zu machen und die Tests zuzulassen um sich auf das Verhalten der Anwendung zu konzentrieren, anstatt auf die Implementierung von Android. Sie können immer noch ein Mocking-Framework zusammen mit .__ verwenden. mit Robolectric, wenn Sie möchten.

Mockito, das auch mit Junit verwendet werden kann, wird wirklich verwendet, mit Ausnahme, wann abschließende Klassen, anonyme Klassen oder primitive Typen verwaltet werden müssen.

27
trocchietto

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

Unit Testing, so wie ich es verstehe, testet eine Unit (zB Klasse) auf ihre Daten und ihr Verhalten. 

Angenommen, Sie haben ein Spiel: Dieses Spiel wird auf einer Aktivität (Hauptaktivität) ausgeführt, und Sie haben einen auf einer Robot-Klasse basierenden Charakter, der zwei Methoden (Feuer und Zug) hat. Sie würden die Hauptaktivität mit einem Gerätetest testen, um zu sehen, ob sie beim Verlassen der App richtig gespeichert wird, ob sie beim Wiederherstellen der App korrekt wiederhergestellt wird usw., und Sie würden Robot mit einem Unit-Test testen, um dessen Attribute und Verhalten zu testen.

Haftungsausschluss: Ich bin keine Java-Person, aber ich habe mich für Ihre Frage interessiert und sie auf der Grundlage einer geringfügigen Online-Suche beantwortet. Sie müssen wahrscheinlich tiefer in dieses Thema einsteigen, um eine detailliertere Antwort zu finden.

40
gemantzu

UNIT TESTEN

Unit-Tests, die nur auf Ihrem lokalen Computer ausgeführt werden. Diese Tests sind zur lokalen Ausführung auf der JVM kompiliert, um die Ausführungszeit zu minimieren. Benutzen Dies ist der Ansatz, um Unit-Tests auszuführen, die keine Abhängigkeiten von der .__ haben. Android-Framework oder Abhängigkeiten, die von Scheinobjekten erfüllt werden können.

Grundsätzlich führen Sie reinen Java-Code aus, um beispielsweise einen Inhaltsanbieter, Datenbankverbindungen, Eingabe und Ausgabe von Methoden zu testen. Dies läuft nicht auf Android. Um es auszuführen, brauchen Sie KEIN Gerät.

INSTRUMENTATIONSTEST

Unit-Tests, die auf einem Android-Gerät oder Emulator ausgeführt werden. Diese Tests haben Zugriff auf Instrumentation-Informationen, wie z. B. den Kontext der App im Test. Verwenden Sie diesen Ansatz, um Gerätetests mit Android auszuführen Abhängigkeiten, die Scheinobjekte nicht leicht befriedigen können.

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

Referenz: http://developer.Android.com/tools/testing/testing_Android.html

21
Isaac Urbina

 enter image description here 

Unit Tests

Hierbei handelt es sich um kleine, stark fokussierte Tests, die direkt auf Ihrem lokalen Entwicklungscomputer ausgeführt werden können. Da sie direkt in Ihrer lokalen Umgebung ausgeführt werden, sind sie sehr schnell und ihre Ausführungszeit ist sehr kurz.

Integrationstests

Dies sind die Tests, die tatsächlich auf einem realen Gerät und nicht auf einem lokalen Computer ausgeführt werden und die Integration zwischen verschiedenen Modulen testen sollen, die zusammenarbeiten.

End-to-End-Tests

Die Genauigkeit dieser Tests ist jedoch viel höher, da diese Tests auch auf einem tatsächlichen Gerät ausgeführt werden und der Umfang dieser Tests viel größer ist, da sie ein vollständiges Merkmal oder einen Fluss von Ende zu Ende testen.

Unit Testing:

  • JUnit
  • Mockito
  • PowerMock

UI-Tests:

  • Espresso
  • UIAutomator
  • Robotium, Appium, Calabash, Robolectric

Lesen Sie mehr hier und hier

3
yoAlex5

https://developer.Android.com/training/testing/fundamentals.html#testing-pyramid

Kleine Tests sind Einzeltests, die Sie getrennt von Produktionssystemen ausführen können. Sie verspotten normalerweise alle wichtigen Komponenten und sollten auf Ihrer Maschine schnell laufen.

Mittlere Tests sind Integrationstests, die zwischen kleinen und großen Tests liegen. Sie integrieren mehrere Komponenten und laufen auf Emulatoren oder realen Geräten.

Große Tests sind Integrations- und UI-Tests, die durch Ausführen eines UI-Workflows ausgeführt werden. Sie stellen sicher, dass wichtige Endbenutzeraufgaben auf Emulatoren oder realen Geräten wie erwartet funktionieren.

0
ViT-Vetal-

Unit-Test:

Häufig werden Unit-Tests als "lokale Tests" oder "lokale 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 für Ihre App nicht testen, ohne Objekte wie eine Aktivität zu überlisten.


Instrumentationstests:

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

Instrumentationstests können auch verwendet werden, um keine Logik der Benutzeroberfläche zu testen. Sie sind besonders nützlich, wenn Sie Code testen müssen, der von einem Kontext abhängt.


Ref Link zum Beispiel

0
akhilesh0707

Stückprüfung

Es wird nur auf dem lokalen Computer ausgeführt.

Instrumentierungstestfall

Es wird auf dem Android-Gerät oder -Emulator ausgeführt. Wenn Sie den Testfall überprüfen, der auf dem Emulator oder Android-Gerät ausgeführt wird

0
mathi