Wir unterscheiden 2 Arten von Tests.

What you'll learn

⚠️ Achtung:
Diese Session hier ist noch Work in Progress und noch nicht fertig. Du muss eventuell die Übungen ohne Hilfe selbst durchführen.

Unit Tests sind immer dann möglich, wenn einzelne Logikblöcke getestet werden, die nicht mit dem Android System verbunden sind.

Da viele Android Anwendungen zu einem erheblichen Teil nur auf Optik und Präsentationslogik setzen und wenn möglich Business Logic auf einen Server auslagern, damit nicht mehrere andere Clients (iOS, Webseiten, ...) die gleiche Logik umsetzen und testen müssen, kommt es durchaus vor, dass es nur wenige UnitTests in einem Projekt gibt.

Zu finden sind Unit Tests im src/test-Folder.

Besonderes Mermal von Unit Tests ist, dass sie besonders schnell ausgeführt werden können, da sie nur Klassen testet und keine Android Abhängigkeiten haben darf.
Da unsere Enwicklungszeit gleich Lebenszeit ist, ist ein Unit Test immer einem Instrumentation Test vorzuziehen.

Standardmäßig ist ein sehr einfacher Test bereits angelegt.

@Test
fun addition_isCorrect() {
    assertEquals(4, 2 + 2)
}

Das Keyword für einen Test ist also @Test über einer Methode. Es folgt eine Methodensignatur, die genau beschreibt um was für einen Test es sich handelt.
Zusätzlich als wichtige andere Annotation kann @Before genutzt werden um eine Initialisierung vor jeder Testmethode auszuführen.
Bitte beachte, dass nicht zu 100% hervorgesagt werden kann, dass eine Methode vor der anderen ausgeführt wird (innerhalb der @Test Methoden), daher kann es passieren, dass wiederholtes ausführen von Tests zu unterschiedlichen Ergebnissen führt, wenn diese einen Datenbestand ändern.

Schreibe in dieser Übung einen kleinen Test um deine Utils Klasse oder deren Funktionen zu testen. Machen sie das was du erwartest?

Wie bereits im Kapitel zuvor angedeutet, ist die Ausführungszeit von Instrumentation Tests erheblich länger als die von Unit Tests. Instrumentation Tests werden nämllich auf dem angeschlossenen Gerät oder einem Emulator ausgeführt. Somit werden sie in einer .apk auf dem Gerät direkt ausgeführt. Instrumentation Tests können daher das Verhalten einer Anwendung und ihrer optischen Oberfläche testen und so auch Layout-Elemente auswerten.

Instrumentation Tests sind aufwändig und auch in der Ausführung Zeitintensiv. Libraries wie Espresso ermöglichen dem Test das Auswerten der derzeitig angezeigten Layout-Hierarchie. So können einzelne Elemente gefunden werden und das Klicken auf bestimmte Oberflächen simuliert werden. Da die App sich dann verhält, als würde ein User sie nutzen, muss in der Regel zwischen jedem Klick Befehl auch ein delay eingebaut werden, sodass der Test nicht voreilig zu einem Stopp kommt.

Zu finden sind die Instrumentation Tests im src/androidTest-Folder.

Standardmäßig ist ein sehr einfacher Test bereits angelegt.

@Test
 fun useAppContext() {
     // Context of the app under test.
     val appContext = InstrumentationRegistry.getInstrumentation().targetContext
     assertEquals("de.ka.helloworld", appContext.packageName)
 }

Die Methode ist also gerade zu identisch mit dem von UnitTests, unterscheidet sich aber in der Klassendeklaration mit dem @RunWith(AndroidJUnit4::class) das für den Runner der Instrumentation auf dem Gerät steht.

Es wird sofort ersichtich, dass das auf einem Gerät läuft, da der Context abgerufen wird.

Schreibe in dieser Übung einen Test, der die App öffnet und im ersten Bildschirm auf den Button drückt.