+ All Categories
Home > Documents > Automatisiertes Testen in Android

Automatisiertes Testen in Android

Date post: 23-Jun-2015
Category:
Upload: open-knowledge-gmbh
View: 644 times
Download: 3 times
Share this document with a friend
Description:
Speaker: Arne Limburg open knowledge GmbH MobileTechCon
59
Arne Limburg | open knowledge GmbH @ArneLimburg @_openknowledge
Transcript
Page 1: Automatisiertes Testen in Android

Arne Limburg | open knowledge GmbH

@ArneLimburg @_openknowledge

Page 2: Automatisiertes Testen in Android

Meine Person Arne Limburg Head of Development open knowledge GmbH

@ArneLimburg @_openknowledge

www.openknowledge.de

Page 3: Automatisiertes Testen in Android

Herausforderungen

•  Vielfalt der Geräte •  Bildschirmauflösung •  Eingabemethode •  Capabilities

•  Vielfalt der Umwelteinflüsse •  Umgebung (Netz, Batterie, Standort) •  Nutzerverhalten

Page 4: Automatisiertes Testen in Android

Was tun?

Rechne mit allem!

Rechne mit nichts!

Testen, Testen, Testen!

Page 5: Automatisiertes Testen in Android

Testen

•  Konzentration auf das Wesentliche – Geräte – Android-Versionen – Länder – Operatoren

•  Test-Automatisierung

Page 6: Automatisiertes Testen in Android

Unit-Tests

Testen - Agenda

1

2

3

4

Funktionstests

Abnahme- und Regressionstests

Stresstests

Unit-Tests

Page 7: Automatisiertes Testen in Android

Unit-Testing

„A unit is the smallest testable part of an application.“ http://en.wikipedia.org/wiki/Unit_testing

Page 8: Automatisiertes Testen in Android

Ziel von Unit-Testing

•  korrekte Funktionsweise von kleinen Einheiten der Software (Testen einzelner Methoden)

•  Automatisch •  Regelmäßig (Continuous Integration) •  Regressionssicher

Page 9: Automatisiertes Testen in Android

Android Testing Framework

•  JUnit-Unterstützung für On-Device-Testing

•  Oberklassen zum Testen von Android-Komponenten

•  Activity •  Content-Provider •  Service •  …

Page 10: Automatisiertes Testen in Android

Mock-Kontexte

•  MockContext •  Alle Methoden werfen Exception

•  IsolatedContext •  Isolation vom Device •  Datenbank- und Datei-Operationen möglich

•  RenamingDelegatingContext •  Kommunikation mit dem Device möglich •  Datenbank- und Datei-Operationen werden

umgeleitet

Page 11: Automatisiertes Testen in Android

Android Testing - Architektur

Page 12: Automatisiertes Testen in Android

Unit-Test-Klassenhierarchie junit.framework.TestCase

AndroidTestCase InstrumentationTestCase

Package android.test

ApplicationTestCase

LoaderTestCase

ProviderTestCase2

ServiceTestCase

ActivityTestCase

ActivityUnitTestCase

ActivityInstrumentationTestCase2

Page 13: Automatisiertes Testen in Android

PoviderTestCase2

•  Testen eines isolierten Content-Providers •  Verwendung von IsolatedContext •  Bereitstellen eines MockContentResolvers API setContext(Context) (von AndroidTestCase) getMockContentResolver() getProvider

Page 14: Automatisiertes Testen in Android

ProviderTestCase2 public class PositionProviderTest extends ProviderTestCase2<PositionProvider> { public PositionProviderTest() { super(PositionProvider.class, PositionProvider.AUTHORITY); } public void testInsert() { … }

Page 15: Automatisiertes Testen in Android

ProviderTestCase2 public class PositionProviderTest extends ProviderTestCase2<PositionProvider> { public PositionProviderTest() { super(PositionProvider.class, PositionProvider.AUTHORITY); } public void testInsert() { … }

Page 16: Automatisiertes Testen in Android

ProviderTestCase2 public class PositionProviderTest extends ProviderTestCase2<PositionProvider> { public PositionProviderTest() { super(PositionProvider.class, PositionProvider.AUTHORITY); } public void testInsert() { … }

Page 17: Automatisiertes Testen in Android

ServiceTestCase

•  Standardmäßig mit „echtem“ Context und MockApplication

•  Herausforderung: Testen von Threading API setApplication(Application) setContext(Context) (von AndroidTestCase) startService(Intent) bindService(Intent)

Page 18: Automatisiertes Testen in Android

ServiceTestCase public class UpdaterServiceTest extends ServiceTestCase<UpdaterService> { public UpdaterServiceTest() { super(UpdaterService.class); } public void testStartService() { … } }

Page 19: Automatisiertes Testen in Android

ServiceTestCase public class UpdaterServiceTest extends ServiceTestCase<UpdaterService> { public UpdaterServiceTest() { super(UpdaterService.class); } public void testStartService() { … } }

Page 20: Automatisiertes Testen in Android

ServiceTestCase public class UpdaterServiceTest extends ServiceTestCase<UpdaterService> { public UpdaterServiceTest() { super(UpdaterService.class); } public void testStartService() { … } }

Page 21: Automatisiertes Testen in Android

Code Diving ...

Page 22: Automatisiertes Testen in Android

ActivityUnitTestCase

•  Leitet von InstrumentationTestCase ab •  Isoliertes Testen einer Activity API (Auszug) getStartedActivityIntent() getStartedActivityRequest() getRequestOrientation() isFinishedCalled()

Page 23: Automatisiertes Testen in Android

ActivityUnitTestCase public class Positio…ActivityUnitTest extends ActivityUnitTestCase<Position…Activity> { public PositionOverviewActivityUnitTest() { super(PositionOverviewActivity.class); } public void testOnListItemClick() { … } }

Page 24: Automatisiertes Testen in Android

ActivityUnitTestCase public class Positio…ActivityUnitTest extends ActivityUnitTestCase<Position…Activity> { public PositionOverviewActivityUnitTest() { super(PositionOverviewActivity.class); } public void testOnListItemClick() { … } }

Page 25: Automatisiertes Testen in Android

ActivityUnitTestCase public class Positio…ActivityUnitTest extends ActivityUnitTestCase<Position…Activity> { public PositionOverviewActivityUnitTest() { super(PositionOverviewActivity.class); } public void testOnListItemClick() { … } }

Page 26: Automatisiertes Testen in Android

Code Diving ...

Page 27: Automatisiertes Testen in Android

Unit-Tests •  Herausforderung:

Umgang mit Abhängigkeiten •  Klassisches Vorgehen:

Erstellen von Mocks •  On-Device: Mock-Implementierungen des

Android Testing Frameworks •  Off-Device: Gängige Java-Mocking-

Frameworks (EasyMock, Mockito, ...)

Page 28: Automatisiertes Testen in Android

Off-Device-Testing •  Herausforderung:

Android ≠ Java java.lang.RuntimeException: Stub! Off-Device

–  Instantiieren –  Mocking via Java-Mocking-Frameworks –  Zugriff auf Android-Interna

•  Lösung: Robolectric

Page 29: Automatisiertes Testen in Android

Robolectric •  Instantiieren von Android-Klassen •  Shadowing •  Zugriff auf Resourcen •  ...

Page 30: Automatisiertes Testen in Android

Robolectric @RunWith(RobolectricTestRunner.class) public class PositionOverviewActivityTest { @Test public void onItemClick() { … } … }

Page 31: Automatisiertes Testen in Android

Robolectric @RunWith(RobolectricTestRunner.class) public class PositionOverviewActivityTest { @Test public void onItemClick() { … } … }

Page 32: Automatisiertes Testen in Android

Robolectric @Test public void onItemClick() { … ShadowActivity a = shadowOf(activity); Intent startedIntent = a.getNextStartedActivity(); … }

Page 33: Automatisiertes Testen in Android

Code Diving ...

Page 34: Automatisiertes Testen in Android

Continuous Integration

•  Regelmäßiges Bauen und Testen (CI-Server)

z.B. Jenkins •  Voraussetzung: Automatisiertes Bauen

und Testen Ant oder Maven

•  Zusatzfeature: Code-Abdeckung mit EMMA

Page 35: Automatisiertes Testen in Android

Unit-Tests

Agenda

1

2

3

4

Funktionstests

Abnahme- und Regressionstests

Stresstests

Unit-Tests

Funktionstests

Page 36: Automatisiertes Testen in Android

Funktionstests •  Testen der Interaktion mit der Umgebung •  Testaufbau

•  UI-Verhalten •  Klickpfade •  State-Saving / -Restoring

•  Testinhalt •  Änderung der Konfiguration (Orientierung,

Sprache, Tastatur, Location) •  Änderung der Ressourcen (Batterie, Netzwerk,

Bluetooth, GPS •  Eingehender Anruf / SMS

•  Tool: Auch Android JUnit

Page 37: Automatisiertes Testen in Android

Unit-Test-Klassenhierarchie junit.framework.TestCase

AndroidTestCase InstrumentationTestCase

Package android.test

ApplicationTestCase

LoaderTestCase

ProviderTestCase2

ServiceTestCase

ActivityTestCase

ActivityUnitTestCase

ActivityInstrumentationTestCase2

Page 38: Automatisiertes Testen in Android

InstrumentationTestCase •  API (Auszug)

<T> T launchActivity(String, Class<T>, Bundle) <T> T launchActivityWithIntent(String, Class<T>, Intent) void sendKeys(String) void sendKeys(int…) void sendRepeatedKeys(int…) Instrumentation getInstrumentation()

Page 39: Automatisiertes Testen in Android

Instrumentation •  API (Auszug)

ActivityMonitor addMonitor(…) Activity waitForMonitor(…) Activity waitForMonitorWithTimeout(…) void startActivitySync(…) void sendXXXSync(…) void startPerformanceSnapshot() void endPerformanceSnapshot() void startProfiling() Void stopProfiling()

Page 40: Automatisiertes Testen in Android

ActivityInstrumentationTestCase2

•  Leitet von InstrumentationTestCase ab •  Testen von UI-Verhalten

à Testen eines gesamten Worksflows •  Erzeugen von TouchEvents mit TouchUtils

•  Überprüfen von Layout mit ViewAsserts •  Eventuell Verwendung von Third-Party-

Framework (Robotium)

Page 41: Automatisiertes Testen in Android

ActivityInstrumentationTestCase2 public class Position…ActivityUiTest extends ActivityInstrumentationTestCase2<Pos…ity> { public PositionOverviewActivityUiTest() { super(PositionOverviewActivity.class); } public void testClickOnList() { … } }

Page 42: Automatisiertes Testen in Android

ActivityInstrumentationTestCase2 public class Position…ActivityUiTest extends ActivityInstrumentationTestCase2<Pos…ity> { public PositionOverviewActivityUiTest() { super(PositionOverviewActivity.class); } public void testClickOnList() { … } }

Page 43: Automatisiertes Testen in Android

ActivityInstrumentationTestCase2 public class Position…ActivityUiTest extends ActivityInstrumentationTestCase2<Pos…ity> { public PositionOverviewActivityUiTest() { super(PositionOverviewActivity.class); } public void testClickOnList() { … } }

Page 44: Automatisiertes Testen in Android

Code Diving ...

Page 45: Automatisiertes Testen in Android

ActivityUnitTestCase vs. ActivityInstrumentationTestCase2 ActivityUnitTestCase •  Reines Testen des

Codes •  Kein Test des UI-

Verhaltens •  Kein Test des

Workflow-Verhaltens

ActivityInstr…TestCase2 •  Testen des UI-

Verhaltens •  Testen des Workflow-

Verhaltens

Page 46: Automatisiertes Testen in Android

Robotium

•  Selenium nur für Android •  Baut auf Instrumentation auf •  Weniger komplex zu bedienen •  Black-Box-Testing möglich

Page 47: Automatisiertes Testen in Android

Code Diving ...

Page 48: Automatisiertes Testen in Android

Android Emulator fernsteuern

•  Steuerung von Geo-Koordinaten, Telefonie, Netzwerk (Geschwindigkeit, Delay), Batterie, SMS, Sensoren

•  DDMS-Perspektive in Eclipse •  Verbinden via Telnet

Beispiel: telnet localhost 5554

Page 49: Automatisiertes Testen in Android

Continuous Integration

Best Practice •  Funktionstests selten ausführen •  Klassifizierung von Tests

@SmallTest – „Echter“ Unit-Test (ActivityUnitTest) @MediumTest – Test einer Komponente mit Umgebung @LargeTest – Workflow-Test (gesamter Use-Case)

Page 50: Automatisiertes Testen in Android

Unit-Tests

Agenda

1

2

3

4

Funktionstests

Abnahme- und Regressionstests

Stresstests

Funktionstests

Abnahme- und Regressionstests

Page 51: Automatisiertes Testen in Android

MonkeyRunner

Creative Commons by Simon Englisch

Page 52: Automatisiertes Testen in Android

MonkeyRunner

•  Python / Jython •  Testen kompletter Use-Cases •  Vergleichen der Ergebnisse über

Bildschirm-Fotos •  Paralleles Testen verschiedener

Devices und Auflösungen via Scripting

Page 53: Automatisiertes Testen in Android

MonkeyRunner MonkeyRunner API void alert(…), integer choice(…), string input(…) void sleep(…) MonkeyDevice waitForConnection(…)

MonkeyDevice API (Auszug) void installPackage(…) void startActivity(…) Void broadcastIntent(…) void drag(…), void press(…), void touch(…), void type(…) MonkeyImage takeSnapshot()

MonkeyImage API (Auszug) MonkeyImage getSubImage(…), boolean sameAs(…), void writeToFile(…)

Page 54: Automatisiertes Testen in Android

Unit-Tests

Agenda

1

2

3

4

Funktionstests

Abnahme- und Regressionstests

Stresstests

Abnahme- und Regressionstests

Stresstests

Page 55: Automatisiertes Testen in Android

Würden Sie einen Affen mit Ihrem Telefon spielen lassen?

© Rex Features

Page 56: Automatisiertes Testen in Android

Monkey

•  Schicken zufälliger Events •  Anzahl und Geschwindigkeit

konfigurierbar •  Reihenfolge reproduzierbar (durch

Angabe von seed) •  Wahrscheinlichkeit einzelner Event-

Arten konfigurierbar àSuchen von spezifischen Bugs

Page 57: Automatisiertes Testen in Android

Unit-Tests

Agenda

1

2

3

4

Funktionstests

Regressionstests

Stresstests Stresstests

Page 58: Automatisiertes Testen in Android

Fazit - Testing

•  Unit-Tests •  Off Device (Robolectric) •  On Device (Android Testing Framework) •  Regelmäßig (Continuous Integration) mit

Simulator •  Vor der Auslieferung mit echten Geräten

•  Funktionale Tests •  UI-Interaktion •  Gesamter Workflow (automatisiert)

•  Regressionstests (MonkeyRunner) •  Stresstests (Monkey)

Page 59: Automatisiertes Testen in Android

Vielen Dank für Ihre Zeit. Kontakt: open knowledge GmbH Bismarckstr. 13 26122 Oldenburg [email protected] @ArneLimburg @_openknowledge

Q&A


Recommended