nach dem release ist es nicht vorbei

89
Arne Limburg | open knowledge GmbH Automatisiertes Testen in Android @ArneLimburg @_openknowledg e

Upload: open-knowledge-gmbh

Post on 13-May-2015

294 views

Category:

Technology


1 download

DESCRIPTION

Nach dem Release ist es nicht vorbei Speaker: Arne Limburg Die Tests vor der ersten Veröffentlichung einer Android-App im Play Store fallen in der Regel recht ausgiebig aus. Aber was kommt danach? Wie kann eine mobile App geeignet gewartet und dauerhaft gepflegt werden? Wie können Probleme und Optimierungspotenziale nach dem ersten Release erkannt werden? Und wie geht man damit um, wenn man parallel die Weiterentwicklung der App vorantreiben will? In der Session wird gezeigt, wie man über geeignetes Crash-Reporting und proaktives App-Feedback auch bei Bugs eine optimale User Experience erzielen kann. Der Schwerpunkt liegt dabei darauf, wie durch gezielte Testautomatisierung zusätzlich Regressionssicherheit in der Weiterentwicklung erreicht werden kann. Denn nichts ist schlimmer als eine negative Bewertung im Play Store.

TRANSCRIPT

Page 1: Nach dem Release ist es nicht vorbei

Arne Limburg | open knowledge GmbH

Automatisiertes Testen in Android @ArneLimburg

@_openknowledge

Page 2: Nach dem Release ist es nicht vorbei

Meine PersonArne LimburgHead of Architecture and Technologyopen knowledge GmbH

@ArneLimburg@_openknowledge

www.openknowledge.de

Page 3: Nach dem Release ist es nicht vorbei

Diese Session startet wo andere aufhören...

Page 4: Nach dem Release ist es nicht vorbei

Wie geht es weiter?

Page 5: Nach dem Release ist es nicht vorbei

Wie geht es weiter?

• Nutzerfeedback?• Probleme?• Bugs?

Page 6: Nach dem Release ist es nicht vorbei

Informationsquellen

• Nutzerfeedback• Statistiken• Bug-Reports• Third-Party-Libraries

Page 7: Nach dem Release ist es nicht vorbei

Informationsquellen

• Nutzerfeedback• Statistiken• Bug-Reports• Third-Party-Libraries

Page 8: Nach dem Release ist es nicht vorbei

Nutzerfeedback

Page 9: Nach dem Release ist es nicht vorbei

Alpha- und Beta-Tests

• Auswahl von Testgruppe– Google-Gruppe oder– Google+ Community

• Veröffentlichung als Alpha- oder Beta-APK• Download über Play Store• In-App-Billing-Tester

– Separate Angabe der Google-Konten im Play Store (max. 400)

Page 10: Nach dem Release ist es nicht vorbei

Testen von In-App-Billing

• Anlage von Test-Konten über Developer – Google-Gruppe oder– Google+ Community

• Veröffentlichung als Alpha- oder Beta-APK• Download über Play Store

Page 11: Nach dem Release ist es nicht vorbei

Informationsquellen

• Nutzerfeedback• Statistiken• Bug-Reports• Third-Party-Libraries

Page 12: Nach dem Release ist es nicht vorbei

Informationsquellen

• Nutzerfeedback• Statistiken• Bug-Reports• Third-Party-Libraries

Page 13: Nach dem Release ist es nicht vorbei

Statistiken

Page 14: Nach dem Release ist es nicht vorbei

Statistiken

Page 15: Nach dem Release ist es nicht vorbei

Informationsquellen

• Nutzerfeedback• Statistiken• Bug-Reports• Third-Party-Libraries

Page 16: Nach dem Release ist es nicht vorbei

Abstürze & ANRS

Page 17: Nach dem Release ist es nicht vorbei

Stacktraces

Page 18: Nach dem Release ist es nicht vorbei

ANRS

Page 19: Nach dem Release ist es nicht vorbei

Application not responding.

Page 20: Nach dem Release ist es nicht vorbei

Fazit – Android Developer Console

• Vieles Out-Of-The-Box• Grenzen schnell erreicht

– Keine Zuordnung von Fehler zu Gerät und/oder Version

– Bei Crashes nur Stacktraces (keine weiteren Logs)

Page 21: Nach dem Release ist es nicht vorbei

Informationsquellen

• Nutzerfeedback• Statistiken• Bug-Reports• Third-Party-Libraries

Page 22: Nach dem Release ist es nicht vorbei

Informationsquellen

• Nutzerfeedback• Statistiken• Bug-Reports• Third-Party-Libraries

Page 23: Nach dem Release ist es nicht vorbei

Third-Party Crash Reports

• ACRA• BugSense• HockeyApp• ...

Page 24: Nach dem Release ist es nicht vorbei

ACRA @ReportsCrashes(formKey = "…") public class MyApplication extends Application { public void onCreate() { ACRA.init(this); super.onCreate(); } … }

Page 25: Nach dem Release ist es nicht vorbei

ACRA @ReportsCrashes(formKey = "…" mode = … ) public class MyApplication extends Application { … }

Page 26: Nach dem Release ist es nicht vorbei
Page 27: Nach dem Release ist es nicht vorbei
Page 28: Nach dem Release ist es nicht vorbei
Page 29: Nach dem Release ist es nicht vorbei
Page 30: Nach dem Release ist es nicht vorbei

ACRA - Zusatzinformationen

public class SomeClass { public void somewhere() { ErrorReporter.getInstance() .putCustomData("myVariable", "myValue"); } … }

Page 31: Nach dem Release ist es nicht vorbei

ACRA – Senden ohne Absturz

public class SomeClass { public void somewhere(Exception e) { ErrorReporter.getInstance() .handleException(e); } … }

Page 32: Nach dem Release ist es nicht vorbei

ACRA – Senden ohne Absturz

public class SomeClass { public void somewhere(Exception e) { ErrorReporter.getInstance() .handleSilentException(e); } … }

Page 33: Nach dem Release ist es nicht vorbei

ACRA – Senden ohne Absturz

public class SomeClass { public void somewhere(Exception e) { ErrorReporter.getInstance() .handleSilentException(e); } … }

Ideal während Alpha- und Beta-Testing

Testen von User Experience

Page 34: Nach dem Release ist es nicht vorbei

Fazit – Third-Party-Crash-Reports

• Nutzer-Feedback direkt (und nicht über Google)

• Mehr Informationen• Sinnvollere Informationen

Tipp: Belohnungssystem für Bewertung

Page 35: Nach dem Release ist es nicht vorbei

Rating aus der App heraus public void someMethod() { Uri uri = Uri.parse("market://details?id=“ + APP_NAME); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); }

Page 36: Nach dem Release ist es nicht vorbei

Aufgaben

• Feature-Requests• User Experience

Ergebnisse einarbeiten

• Bugfixing• Weiterentwicklung

Page 37: Nach dem Release ist es nicht vorbei

Herausforderungen

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

• Capabilities

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

Page 38: Nach dem Release ist es nicht vorbei

Was tun?

Rechne mit allem!

Rechne mit nichts!

Testen, Testen, Testen!

Page 39: Nach dem Release ist es nicht vorbei

Testen

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

• Test-Automatisierung

Page 40: Nach dem Release ist es nicht vorbei

Herausforderungen

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

• Capabilities

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

Page 41: Nach dem Release ist es nicht vorbei

Was tun?

Rechne mit allem!

Rechne mit nichts!

Testen, Testen, Testen!

Page 42: Nach dem Release ist es nicht vorbei

Testen

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

• Test-Automatisierung

Page 43: Nach dem Release ist es nicht vorbei

Unit-Tests

Testen - Agenda

1

2

3

4

Funktionstests

Abnahme- und Regressionstests

Stresstests

Unit-Tests

Page 44: Nach dem Release ist es nicht vorbei

Unit-Testing

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

Page 45: Nach dem Release ist es nicht vorbei

Ziel von Unit-Testing

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

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

Page 46: Nach dem Release ist es nicht vorbei

Android Testing Framework

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

• Oberklassen zum Testen von Android-Komponenten

• Activity• Content-Provider• Service• …

Page 47: Nach dem Release ist es nicht vorbei

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 48: Nach dem Release ist es nicht vorbei

Android Testing - Architektur

Page 49: Nach dem Release ist es nicht vorbei

Unit-Test-Klassenhierarchie

junit.framework.TestCase

AndroidTestCase InstrumentationTestCase

Package android.test

ApplicationTestCase

LoaderTestCase

ProviderTestCase2

ServiceTestCase

ActivityTestCase

ActivityUnitTestCase

ActivityInstrumentationTestCase2

Page 50: Nach dem Release ist es nicht vorbei

PoviderTestCase2

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

API

setContext(Context) (von AndroidTestCase)

getMockContentResolver()getProvider

Page 51: Nach dem Release ist es nicht vorbei

ProviderTestCase2public class PositionProviderTest extends ProviderTestCase2<PositionProvider> {

public PositionProviderTest() { super(PositionProvider.class, PositionProvider.AUTHORITY); }

public void testInsert() { … }

Page 52: Nach dem Release ist es nicht vorbei

ServiceTestCase

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

• Herausforderung: Testen von Threading

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

startService(Intent)bindService(Intent)

Page 53: Nach dem Release ist es nicht vorbei

ServiceTestCasepublic class UpdaterServiceTest extends ServiceTestCase<UpdaterService> {

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

public void testStartService() { … }}

Page 54: Nach dem Release ist es nicht vorbei

Code Diving ...

Page 55: Nach dem Release ist es nicht vorbei

ActivityUnitTestCase

• Leitet von InstrumentationTestCase ab• Isoliertes Testen einer Activity

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

Page 56: Nach dem Release ist es nicht vorbei

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

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

public void testOnListItemClick() { … }}

Page 57: Nach dem Release ist es nicht vorbei

Code Diving ...

Page 58: Nach dem Release ist es nicht vorbei

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 59: Nach dem Release ist es nicht vorbei

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 60: Nach dem Release ist es nicht vorbei

Robolectric

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

Page 61: Nach dem Release ist es nicht vorbei

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

@Test public void onItemClick() { … }

…}

Page 62: Nach dem Release ist es nicht vorbei

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

@Test public void onItemClick() { … }

…}

Page 63: Nach dem Release ist es nicht vorbei

Robolectric

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

Page 64: Nach dem Release ist es nicht vorbei

Code Diving ...

Page 65: Nach dem Release ist es nicht vorbei

Continuous Integration

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

z.B. Jenkins

• Voraussetzung: Automatisiertes Bauen und Testen

Ant, Maven oder Gradle

• Zusatzfeature: Code-Abdeckung mit EMMA

Page 66: Nach dem Release ist es nicht vorbei

Unit-Tests

Agenda

1

2

3

4

Funktionstests

Abnahme- und Regressionstests

Stresstests

Unit-Tests

Funktionstests

Page 67: Nach dem Release ist es nicht vorbei

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 68: Nach dem Release ist es nicht vorbei

Unit-Test-Klassenhierarchie

junit.framework.TestCase

AndroidTestCase InstrumentationTestCase

Package android.test

ApplicationTestCase

LoaderTestCase

ProviderTestCase2

ServiceTestCase

ActivityTestCase

ActivityUnitTestCase

ActivityInstrumentationTestCase2

Page 69: Nach dem Release ist es nicht vorbei

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 70: Nach dem Release ist es nicht vorbei

Instrumentation

• API (Auszug)

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

Page 71: Nach dem Release ist es nicht vorbei

ActivityInstrumentationTestCase2

• Leitet von InstrumentationTestCase ab• Testen von UI-Verhalten

Testen eines gesamten Worksflows• Erzeugen von TouchEvents mit TouchUtils oder über performClick()

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

Framework (Robotium)

Page 72: Nach dem Release ist es nicht vorbei

ActivityInstrumentationTestCase2

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

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

public void testClickOnList() { … }}

Page 73: Nach dem Release ist es nicht vorbei

Code Diving ...

Page 74: Nach dem Release ist es nicht vorbei

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 75: Nach dem Release ist es nicht vorbei

Robotium

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

Page 76: Nach dem Release ist es nicht vorbei

Espresso

• Weiterentwicklung von Robotium

onView(withId(R.id.button_simple)) .perform(click());

onView(withId(R.id.text_simple)) .check(matches( withText("Hello Espresso!")));

Page 77: Nach dem Release ist es nicht vorbei

Code Diving ...

Page 78: Nach dem Release ist es nicht vorbei

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 79: Nach dem Release ist es nicht vorbei

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 80: Nach dem Release ist es nicht vorbei

Unit-Tests

Agenda

1

2

3

4

Funktionstests

Abnahme- und Regressionstests

Stresstests

Funktionstests

Abnahme- und Regressionstests

Page 81: Nach dem Release ist es nicht vorbei

MonkeyRunner

Creative Commons by Simon Englisch

Page 82: Nach dem Release ist es nicht vorbei

MonkeyRunner

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

Bildschirm-Fotos• Paralleles Testen verschiedener

Devices und Auflösungen via Scripting

Page 83: Nach dem Release ist es nicht vorbei

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 84: Nach dem Release ist es nicht vorbei

Unit-Tests

Agenda

1

2

3

4

Funktionstests

Abnahme- und Regressionstests

Stresstests

Abnahme- und Regressionstests

Stresstests

Page 85: Nach dem Release ist es nicht vorbei

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

© Rex Features

Page 86: Nach dem Release ist es nicht vorbei

Monkey

• Schicken zufälliger Events• Anzahl und Geschwindigkeit

konfigurierbar• Reihenfolge reproduzierbar (durch

Angabe von seed)• Wahrscheinlichkeit einzelner Event-

Arten konfigurierbarSuchen von spezifischen Bugs

Page 87: Nach dem Release ist es nicht vorbei

Unit-Tests

Agenda

1

2

3

4

Funktionstests

Regressionstests

StresstestsStresstests

Page 88: Nach dem Release ist es nicht vorbei

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 89: Nach dem Release ist es nicht vorbei

Vielen Dank für Ihre Zeit.

Kontakt:

open knowledge GmbHBismarckstr. 1326122 Oldenburg

[email protected]

@ArneLimburg @_openknowledge

Q&A