mobile testing mit android

50
Arne Limburg | open knowledge GmbH Mobile Testing mit Android

Upload: open-knowledge-gmbh

Post on 23-Jun-2015

778 views

Category:

Documents


0 download

DESCRIPTION

Speaker: Arne Limburg W-JAX 2012

TRANSCRIPT

Page 1: Mobile Testing mit Android

Arne Limburg | open knowledge GmbH

Mobile Testing mit Android

Page 2: Mobile Testing mit Android

Meine Person

Arne LimburgEnterprise Architecktopen knowledge GmbH

@ArneLimburg@_openknowledge

www.openknowledge.de

Page 3: Mobile Testing mit Android

Herausforderungen

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

• Capabilities

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

Page 4: Mobile Testing mit Android

Was tun?

Rechne mit allem!

Rechne mit nichts!

Testen, Testen, Testen!

Page 5: Mobile Testing mit Android

Testen

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

• Test-Automatisierung

Page 6: Mobile Testing mit Android

Unit-Tests

Testen - Agenda

1

2

3

4

Funktionstests

Abnahme- und Regressionstests

Stresstests

Unit-Tests

Page 7: Mobile Testing mit Android

Unit-Testing

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

Page 8: Mobile Testing mit Android

Ziel von Unit-Testing

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

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

Page 9: Mobile Testing mit Android

Android Testing Framework

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

• Oberklassen zum Testen von Android-Komponenten

• Activity• Content-Provider• Service• …

Page 10: Mobile Testing mit 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: Mobile Testing mit Android

Android Testing - Architektur

Page 12: Mobile Testing mit Android

Unit-Test-Klassenhierarchie

junit.framework.TestCase

AndroidTestCase InstrumentationTestCase

Package android.test

ApplicationTestCase

LoaderTestCase

ProviderTestCase2

ServiceTestCase

ActivityTestCase

ActivityUnitTestCase

ActivityInstrumentationTestCase2

Page 13: Mobile Testing mit Android

PoviderTestCase2

• Testen eines isolierten Content-Providers• Verwendung von IsolatedContext• Bereitstellen eines MockContentResolvers

API

setContext(Context) (von AndroidTestCase)

getMockContentResolver()getProvider

Page 14: Mobile Testing mit Android

ProviderTestCase2public class PositionProviderTest extends ProviderTestCase2<PositionProvider> {

public GeoContactProviderTest() { super(GeoContactProvider.class, GeoContactProvider.AUTHORITY); }

public void testInsert() { … }

Page 15: Mobile Testing mit Android

ServiceTestCase

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

• Herausforderung: Testen von Threading

APIsetApplication(Application)setContext(Context) (von AndroidTestCase)

startService(Intent)bindService(Intent)

Page 16: Mobile Testing mit Android

ServiceTestCasepublic class UpdaterServiceTest extends ServiceTestCase<UpdaterService> {

public UpdaterServiceTest() { super(UpdaterService.class); }

public void testStartService() { … }}

Page 17: Mobile Testing mit Android

Code Diving ...

Page 18: Mobile Testing mit Android

ActivityUnitTestCase

• Leitet von InstrumentationTestCase ab• Isoliertes Testen einer Activity

API (Auszug)getStartedActivityIntent()getStartedActivityRequest()getRequestOrientation()isFinishedCalled()

Page 19: Mobile Testing mit Android

ActivityUnitTestCasepublic class Positio…ActivityUnitTest extends ActivityUnitTestCase<Position…Activity> {

public PositionOverviewActivityUnitTest() { super(PositionOverviewActivity.class); }

public void testOnListItemClick() { … }}

Page 20: Mobile Testing mit Android

Code Diving ...

Page 21: Mobile Testing mit 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 22: Mobile Testing mit Android

Robolectric@RunWith(RobolectricTestRunner.class) public class PositionOverviewActivityTest {

@Test public void onItemClick() { … }

…}

Page 23: Mobile Testing mit Android

Robolectric@RunWith(RobolectricTestRunner.class) public class PositionOverviewActivityTest {

@Test public void onItemClick() { … }

…}

Page 24: Mobile Testing mit Android

Robolectric

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

Page 25: Mobile Testing mit Android

Code Diving ...

Page 26: Mobile Testing mit 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 27: Mobile Testing mit Android

Unit-Tests

Agenda

1

2

3

4

Funktionstests

Abnahme- und Regressionstests

Stresstests

Funktionstests

Page 28: Mobile Testing mit 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 29: Mobile Testing mit Android

Unit-Test-Klassenhierarchie

junit.framework.TestCase

AndroidTestCase InstrumentationTestCase

Package android.test

ApplicationTestCase

LoaderTestCase

ProviderTestCase2

ServiceTestCase

ActivityTestCase

ActivityUnitTestCase

ActivityInstrumentationTestCase2

Page 30: Mobile Testing mit Android

Unit-Test-Klassenhierarchie

junit.framework.TestCase

InstrumentationTestCase

Package android.test

ActivityTestCase

ActivityInstrumentationTestCase2

Page 31: Mobile Testing mit 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 32: Mobile Testing mit Android

Instrumentation

• API (Auszug)

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

Page 33: Mobile Testing mit 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 34: Mobile Testing mit Android

ActivityInstrumentationTestCase2

public class Position…ActivityUiTest extends ActivityInstrumentationTestCase2<Pos…ity> {

public PositionOverviewActivityUiTest() { super(PositionOverviewActivity.class); }

public void testClickOnList() { … }}

Page 35: Mobile Testing mit Android

Code Diving ...

Page 36: Mobile Testing mit 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 37: Mobile Testing mit Android

Robotium

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

Page 38: Mobile Testing mit Android

Android Emulator fernsteuern

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

• DDMS-Perspektive in Eclipse• Verbinden via TelnetBeispiel:

telnet localhost 5554

Page 39: Mobile Testing mit 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 40: Mobile Testing mit Android

Unit-Tests

Agenda

1

2

3

4

Funktionstests

Abnahme- und Regressionstests

Stresstests

Abnahme- und Regressionstests

Page 41: Mobile Testing mit Android

MonkeyRunner

Creative Commons by Simon Englisch

Page 42: Mobile Testing mit Android

MonkeyRunner

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

Bildschirm-Fotos• Paralleles Testen verschiedener

Devices und Auflösungen via Scripting

Page 43: Mobile Testing mit Android

MonkeyRunnerMonkeyRunner APIvoid 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 44: Mobile Testing mit Android

Unit-Tests

Agenda

1

2

3

4

Funktionstests

Abnahme- und Regressionstests

StresstestsStresstests

Page 45: Mobile Testing mit Android

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

© Rex Features

Page 46: Mobile Testing mit Android

Monkey

• Schicken zufälliger Events• Anzahl und Geschwindigkeit

konfigurierbar• Reihenfolge reproduzierbar (durch

Angabe von seed)• Wahrscheinlichkeit einzelner Event-

Arten konfigurierbarSuchen von spezifischen Bugs

Page 47: Mobile Testing mit Android

Unit-Tests

Agenda

1

2

3

4

Funktionstests

Regressionstests

StresstestsStresstests

Page 48: Mobile Testing mit 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 49: Mobile Testing mit Android

Vielen Dank für Ihre Zeit.

Kontakt:

open knowledge GmbHBismarckstr. 1326122 Oldenburg

[email protected]

@ArneLimburg @_openknowledge

Q&A

Page 50: Mobile Testing mit Android

Weitere Sessions