© prettyboy80/Shutterstock.com
Mobile Technology
Do Androids Dream of Electric Sheep?

Robolectric

Testen ist wichtig, darüber herrscht Einigkeit. Regelmäßiges, am besten kontinuierliches Testen führt zu höherer Qualität der Software, frühzeitiger Aufdeckung von Unstimmigkeiten in den Anforderungen und mehr Sicherheit beim Refactoring. Unit Tests sollten mittlerweile zum Standardhandwerkszeug eines jeden Softwareentwicklers gehören.

Peter Friese


Eine der Kernanforderungen für Unit Tests ist, dass sie schnell ausgeführt werden können – je schneller, desto besser. Je weniger Zeit die Ausführungen der Unit Tests für ein Softwaremodul in Anspruch nehmen, desto mehr sind Entwickler bereit, die Tests vor und nach jeder Änderung des Codes auszuführen. Idealerweise sollte eine Testsuite in weniger als zehn Sekunden ausgeführt werden können. Grund hierfür: Die menschliche Aufmerksamkeitsspanne liegt bei etwa 8 bis 10 Sekunden [1]. Bei testgetriebenem Vorgehen sieht der übliche Entwicklungszyklus wie folgt aus: Test schreiben, Test ausführen (Rot), Code schreiben, Test ausführen (Grün), Refactoring ausführen, Test erneut ausführen (hoffentlich immer noch Grün). Während der Test ausgeführt wird, ist man zum Warten verdammt. Ist die Wartezeit zu lang, schweift man ab.

Genau diese Anforderung stellt im Android-Umfeld eine große Herausforderung dar. Unit Tests für Android-Apps müssen entweder auf dem Emulator oder einem physikalischen Gerät ausgeführt werden. Grund hierfür ist, dass die Android Runtime, die im SDK als android.jar zur Verfügung steht, nur leere Methodenrümpfe enthält. Ein Versuch, diese Methoden außerhalb des Emulators oder eines Android-Geräts aufzurufen, führt zu einer RuntimeException mit dem Hinweis darauf, dass die entsprechende Methode ausgestubbt ist. Nun könnte man versucht sein, die entsprechenden Klassen mithilfe von Mocks nachzubilden. Einerseits ist dies jedoch ziemlich aufwändig und führt andererseits dazu, dass die Mocks zu einer spiegelbildlichen Implementierung der getesteten Klasse degenerieren. Zusätzlich muss der Java-Code vor der Ausführung auf dem Emulator oder einem An­droid-Gerät noch in das DEX-Format [2] konvertiert, in ein APK gepackt und auf das Zielgerät hochgeladen werden. Alle diese Schritte führen zu einem nicht zu vernachlässigenden Overhead.

Robolectric sorgt dafür, dass Unit Tests in einer regulären JVM ausgeführt werden können (Kasten: „Projektspezifikation“). Somit entfallen alle für das Deployment auf ein Gerät notwendigen Schritte, die Turnaround-Zeiten werden kürzer, und es macht wieder Spaß, Tests auszuführen.

Installation

Um Robolectric zu nutzen, muss es in das zu testende Projekt integriert werden. Die Robolectric-Dokumentation beschreibt die Integration sowohl für Eclipse-Projekte als auch für die Verwendung von Android Studio, siehe [3]. Für diesen Artikel verwenden wir die Gradle-basierte Integration von Robolectric. Um Robolectric in ein neues Androi...

Mobile Technology
Do Androids Dream of Electric Sheep?

Robolectric

Testen ist wichtig, darüber herrscht Einigkeit. Regelmäßiges, am besten kontinuierliches Testen führt zu höherer Qualität der Software, frühzeitiger Aufdeckung von Unstimmigkeiten in den Anforderungen und mehr Sicherheit beim Refactoring. Unit Tests sollten mittlerweile zum Standardhandwerkszeug eines jeden Softwareentwicklers gehören.

Peter Friese


Eine der Kernanforderungen für Unit Tests ist, dass sie schnell ausgeführt werden können – je schneller, desto besser. Je weniger Zeit die Ausführungen der Unit Tests für ein Softwaremodul in Anspruch nehmen, desto mehr sind Entwickler bereit, die Tests vor und nach jeder Änderung des Codes auszuführen. Idealerweise sollte eine Testsuite in weniger als zehn Sekunden ausgeführt werden können. Grund hierfür: Die menschliche Aufmerksamkeitsspanne liegt bei etwa 8 bis 10 Sekunden [1]. Bei testgetriebenem Vorgehen sieht der übliche Entwicklungszyklus wie folgt aus: Test schreiben, Test ausführen (Rot), Code schreiben, Test ausführen (Grün), Refactoring ausführen, Test erneut ausführen (hoffentlich immer noch Grün). Während der Test ausgeführt wird, ist man zum Warten verdammt. Ist die Wartezeit zu lang, schweift man ab.

Genau diese Anforderung stellt im Android-Umfeld eine große Herausforderung dar. Unit Tests für Android-Apps müssen entweder auf dem Emulator oder einem physikalischen Gerät ausgeführt werden. Grund hierfür ist, dass die Android Runtime, die im SDK als android.jar zur Verfügung steht, nur leere Methodenrümpfe enthält. Ein Versuch, diese Methoden außerhalb des Emulators oder eines Android-Geräts aufzurufen, führt zu einer RuntimeException mit dem Hinweis darauf, dass die entsprechende Methode ausgestubbt ist. Nun könnte man versucht sein, die entsprechenden Klassen mithilfe von Mocks nachzubilden. Einerseits ist dies jedoch ziemlich aufwändig und führt andererseits dazu, dass die Mocks zu einer spiegelbildlichen Implementierung der getesteten Klasse degenerieren. Zusätzlich muss der Java-Code vor der Ausführung auf dem Emulator oder einem An­droid-Gerät noch in das DEX-Format [2] konvertiert, in ein APK gepackt und auf das Zielgerät hochgeladen werden. Alle diese Schritte führen zu einem nicht zu vernachlässigenden Overhead.

Robolectric sorgt dafür, dass Unit Tests in einer regulären JVM ausgeführt werden können (Kasten: „Projektspezifikation“). Somit entfallen alle für das Deployment auf ein Gerät notwendigen Schritte, die Turnaround-Zeiten werden kürzer, und es macht wieder Spaß, Tests auszuführen.

Installation

Um Robolectric zu nutzen, muss es in das zu testende Projekt integriert werden. Die Robolectric-Dokumentation beschreibt die Integration sowohl für Eclipse-Projekte als auch für die Verwendung von Android Studio, siehe [3]. Für diesen Artikel verwenden wir die Gradle-basierte Integration von Robolectric. Um Robolectric in ein neues Androi...

Neugierig geworden?


    
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang