Your SlideShare is downloading. ×
Arne Limburg | open knowledge GmbH                         Besser geht immer@ArneLimburg@_openknowledge
Diese Session startet wo andere aufhören...
Wie geht es weiter?
Wie geht es weiter?          • Nutzerfeedback?          • Probleme?          • Bugs?
Informationsquellen          •   Nutzerkommentare          •   Statistiken          •   Bug-Reports          •   Third-Par...
Informationsquellen
Nutzerkommentare
Statistiken
Bugs
Aufhängungen und Abstürze
Application not responding.
Stacktraces
Fazit – Android Developer Console  • Vieles Out-Of-The-Box  • Grenzen schnell erreicht    – Keine Zuordnung von      Fehle...
Third-Party Crash Reports•   ACRA•   BugSense•   HockeyApp•   ...
ACRA@ReportsCrashes(formKey = "…")public class MyApplication                      extends Application {    public void onC...
ACRA@ReportsCrashes(formKey = "…"                mode = …)public class MyApplication                      extends Applicat...
ACRA - Zusatzinformationen public class SomeClass {     public void somewhere() {         ErrorReporter.getInstance()     ...
ACRA – Senden ohne Absturz  public class SomeClass {      public void somewhere(Exception e) {          ErrorReporter.getI...
ACRA – Senden ohne Absturz  public class SomeClass {      public void somewhere(Exception e) {          ErrorReporter.getI...
Fazit – Third-Party-Crash-Reports • Nutzer-Feedback direkt   (und nicht über Google) • Mehr Informationen • Sinnvollere In...
Rating aus der App herauspublic void someMethod() {  Uri uri    = Uri.parse("market://details?id=“                + APP_NA...
Aufgaben    • Feature-Requests    • Bugfixing    • Weiterentwicklung
Herausforderungen• Vielfalt der Geräte    • Bildschirmauflösung    • Eingabemethode    • Capabilities• Vielfalt der Umwelt...
Was tun?      Rechne mit allem!      Rechne mit nichts!    Testen, Testen, Testen!
Testen• Konzentration auf das Wesentliche  – Geräte  – Android-Versionen  – Länder  – Operatoren• Test-Automatisierung
Testen - Agenda1   Unit-Tests2   Funktionstests3   Abnahme- und Regressionstests4   Stresstests
Unit-Testing„A unit is the smallest testable part of an application.“                                http://en.wikipedia.o...
Ziel von Unit-Testing• korrekte Funktionsweise  von kleinen Einheiten der Software  (Testen einzelner Methoden)• Automatis...
Unit-Tests• Herausforderung:  Umgang mit Abhängigkeiten• Klassisches Vorgehen:  Erstellen von Mocks • Off-Device: Gängige ...
Robolectric@RunWith(RobolectricTestRunner.class)public class PositionOverviewActivityTest {    @Test    public void onItem...
Code Diving ...
Android Testing Framework• JUnit-Unterstützung  für On-Device-Testing• Oberklassen zum Testen  von Android-Komponenten   •...
Mock-Kontexte• MockContext    • Alle Methoden werfen Exception• IsolatedContext    • Isolation vom Device    • Datenbank- ...
Android Testing - Architektur
Unit-Test-KlassenhierarchiePackage android.test                  junit.framework.TestCase   AndroidTestCase               ...
PoviderTestCase2• Testen eines isolierten Content-Providers• Verwendung von IsolatedContext• Bereitstellen eines MockConte...
ProviderTestCase2public class PositionProviderTest extends      ProviderTestCase2<PositionProvider> { public GeoContactPro...
ServiceTestCase• Standardmäßig mit „echtem“ Context und  MockApplication• Herausforderung: Testen von ThreadingAPIsetAppli...
ServiceTestCasepublic class UpdaterServiceTest extends   ServiceTestCase<UpdaterService> {    public UpdaterServiceTest() ...
Code Diving ...
ActivityUnitTestCase• Leitet von InstrumentationTestCase ab• Isoliertes Testen einer ActivityAPI (Auszug)getStartedActivit...
ActivityUnitTestCasepublic class Positio…ActivityUnitTest extends    ActivityUnitTestCase<Position…Activity> {    public P...
Code Diving ...
Continuous Integration• Regelmäßiges Bauen und Testen  (CI-Server)   z.B. Jenkins• Voraussetzung: Automatisiertes Bauen  u...
Agenda1   Unit-Tests2   Funktionstests3   Abnahme- und Regressionstests4   Stresstests
Funktionstests• Testen der Interaktion mit der Umgebung• Testaufbau    • UI-Verhalten    • Klickpfade    • State-Saving / ...
Unit-Test-KlassenhierarchiePackage android.test                  junit.framework.TestCase   AndroidTestCase               ...
InstrumentationTestCase• API (Auszug)<T> T launchActivity(String, Class<T>, Bundle)<T> T launchActivityWithIntent(String, ...
Instrumentation• API (Auszug)ActivityMonitor addMonitor(…)Activity waitForMonitor(…)Activity waitForMonitorWithTimeout(…)v...
ActivityInstrumentationTestCase2 • Leitet von InstrumentationTestCase ab • Testen von UI-Verhalten          Testen eines g...
ActivityInstrumentationTestCase2  public class Position…ActivityUiTest extends    ActivityInstrumentationTestCase2<Pos…ity...
Code Diving ...
ActivityUnitTestCase vs.ActivityInstrumentationTestCase2 ActivityUnitTestCase   ActivityInstr TestCase2 • Reines Testen de...
Robotium•   Selenium nur für Android•   Baut auf Instrumentation auf•   Weniger komplex zu bedienen•   Black-Box-Testing m...
Android Emulator fernsteuern• Steuerung von Geo-Koordinaten,  Telefonie, Netzwerk (Geschwindigkeit,  Delay), Batterie, SMS...
Continuous IntegrationBest Practice• Funktionstests selten ausführen• Klassifizierung von Tests  @SmallTest  – „Echter“ Un...
Agenda1   Unit-Tests2   Funktionstests3   Abnahme- und Regressionstests4   Stresstests
MonkeyRunner        Creative Commons by Simon Englisch
MonkeyRunner• Python / Jython• Testen kompletter Use-Cases• Vergleichen der Ergebnisse über  Bildschirm-Fotos• Paralleles ...
MonkeyRunnerMonkeyRunner APIvoid alert(…), integer choice(…), string input(…)void sleep(…)MonkeyDevice waitForConnection(…...
Agenda1   Unit-Tests2   Funktionstests3   Abnahme- und Regressionstests4   Stresstests
Würden Sie einen Affen mitIhrem Telefon spielen lassen?                 http://blog.asiantown.net
Monkey• Schicken zufälliger Events• Anzahl und Geschwindigkeit  konfigurierbar• Reihenfolge reproduzierbar (durch  Angabe ...
Agenda1   Unit-Tests2   Funktionstests3   Regressionstests4   Stresstests
Fazit - Testing• Unit-Tests    • Off Device (Robolectric)    • On Device (Android Testing Framework)    • Regelmäßig (Cont...
Q&AVielen Dank für Ihre Zeit.Kontakt:open knowledge GmbHBismarckstr. 1326122 Oldenburgarne.limburg@openknowledge.de      @...
Besser geht immer
Besser geht immer
Besser geht immer
Besser geht immer
Upcoming SlideShare
Loading in...5
×

Besser geht immer

402

Published on

Speaker: Arne Limburg auf der MobileTechCon 2012 in Frankfurt am Main

In der Regel wird die erste Version einer Mobile-App vor ihrer Veröffentlichung im Market einem ausgiebigen Test unterzogen. Aber was passiert danach? Wie kann man Fehler bzw. Optimierungspotenziale in einer bereits veröffentlichten App identifizieren? Und wie geht man mit ihnen um, wenn parallel die Weiterentwicklung der App vorangetrieben werden muss? Die Session zeigt, wie eine optimale User Experience bei den Anwendern erreicht werden kann, angefangen bei gezielter Testautomatisierung über Crash-Reporting bis hin zu proaktivem App-Feedback. Denn nichts ist schlimmer als eine negative Bewertung in den Stores.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
402
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Besser geht immer"

  1. 1. Arne Limburg | open knowledge GmbH Besser geht immer@ArneLimburg@_openknowledge
  2. 2. Diese Session startet wo andere aufhören...
  3. 3. Wie geht es weiter?
  4. 4. Wie geht es weiter? • Nutzerfeedback? • Probleme? • Bugs?
  5. 5. Informationsquellen • Nutzerkommentare • Statistiken • Bug-Reports • Third-Party-Libraries
  6. 6. Informationsquellen
  7. 7. Nutzerkommentare
  8. 8. Statistiken
  9. 9. Bugs
  10. 10. Aufhängungen und Abstürze
  11. 11. Application not responding.
  12. 12. Stacktraces
  13. 13. 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)
  14. 14. Third-Party Crash Reports• ACRA• BugSense• HockeyApp• ...
  15. 15. ACRA@ReportsCrashes(formKey = "…")public class MyApplication extends Application { public void onCreate() { ACRA.init(this); super.onCreate(); } …}
  16. 16. ACRA@ReportsCrashes(formKey = "…" mode = …)public class MyApplication extends Application { …}
  17. 17. ACRA - Zusatzinformationen public class SomeClass { public void somewhere() { ErrorReporter.getInstance() .putCustomData("myVariable", "myValue"); } … }
  18. 18. ACRA – Senden ohne Absturz public class SomeClass { public void somewhere(Exception e) { ErrorReporter.getInstance() .handleException(e); } … }
  19. 19. ACRA – Senden ohne Absturz public class SomeClass { public void somewhere(Exception e) { ErrorReporter.getInstance() .handleSilentException(e); } … }
  20. 20. Fazit – Third-Party-Crash-Reports • Nutzer-Feedback direkt (und nicht über Google) • Mehr Informationen • Sinnvollere Informationen Tipp: Belohnungssystem für Bewertung
  21. 21. Rating aus der App herauspublic void someMethod() { Uri uri = Uri.parse("market://details?id=“ + APP_NAME); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);}
  22. 22. Aufgaben • Feature-Requests • Bugfixing • Weiterentwicklung
  23. 23. Herausforderungen• Vielfalt der Geräte • Bildschirmauflösung • Eingabemethode • Capabilities• Vielfalt der Umwelteinflüsse • Umgebung (Netz, Batterie, Standort) • Nutzerverhalten
  24. 24. Was tun? Rechne mit allem! Rechne mit nichts! Testen, Testen, Testen!
  25. 25. Testen• Konzentration auf das Wesentliche – Geräte – Android-Versionen – Länder – Operatoren• Test-Automatisierung
  26. 26. Testen - Agenda1 Unit-Tests2 Funktionstests3 Abnahme- und Regressionstests4 Stresstests
  27. 27. Unit-Testing„A unit is the smallest testable part of an application.“ http://en.wikipedia.org/wiki/Unit_testing
  28. 28. Ziel von Unit-Testing• korrekte Funktionsweise von kleinen Einheiten der Software (Testen einzelner Methoden)• Automatisch• Regelmäßig (Continuous Integration)• Regressionssicher
  29. 29. Unit-Tests• Herausforderung: Umgang mit Abhängigkeiten• Klassisches Vorgehen: Erstellen von Mocks • Off-Device: Gängige Java-Mocking- Frameworks (EasyMock, Mockito, ...) • On-Device: Mock-Implementierungen des Android Testing Frameworks
  30. 30. Robolectric@RunWith(RobolectricTestRunner.class)public class PositionOverviewActivityTest { @Test public void onItemClick() { … } …}
  31. 31. Code Diving ...
  32. 32. Android Testing Framework• JUnit-Unterstützung für On-Device-Testing• Oberklassen zum Testen von Android-Komponenten • Activity • Content-Provider • Service •
  33. 33. 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
  34. 34. Android Testing - Architektur
  35. 35. Unit-Test-KlassenhierarchiePackage android.test junit.framework.TestCase AndroidTestCase InstrumentationTestCaseApplicationTestCase ActivityTestCase LoaderTestCase ProviderTestCase2 ActivityUnitTestCase ServiceTestCase ActivityInstrumentationTestCase2
  36. 36. PoviderTestCase2• Testen eines isolierten Content-Providers• Verwendung von IsolatedContext• Bereitstellen eines MockContentResolversAPIsetContext(Context) (von AndroidTestCase)getMockContentResolver()getProvider
  37. 37. ProviderTestCase2public class PositionProviderTest extends ProviderTestCase2<PositionProvider> { public GeoContactProviderTest() { super(GeoContactProvider.class, GeoContactProvider.AUTHORITY); } public void testInsert() { … }
  38. 38. ServiceTestCase• Standardmäßig mit „echtem“ Context und MockApplication• Herausforderung: Testen von ThreadingAPIsetApplication(Application)setContext(Context) (von AndroidTestCase)startService(Intent)bindService(Intent)
  39. 39. ServiceTestCasepublic class UpdaterServiceTest extends ServiceTestCase<UpdaterService> { public UpdaterServiceTest() { super(UpdaterService.class); } public void testStartService() { … }}
  40. 40. Code Diving ...
  41. 41. ActivityUnitTestCase• Leitet von InstrumentationTestCase ab• Isoliertes Testen einer ActivityAPI (Auszug)getStartedActivityIntent()getStartedActivityRequest()getRequestOrientation()isFinishedCalled()
  42. 42. ActivityUnitTestCasepublic class Positio…ActivityUnitTest extends ActivityUnitTestCase<Position…Activity> { public PositionOverviewActivityUnitTest() { super(PositionOverviewActivity.class); } public void testOnListItemClick() { … }}
  43. 43. Code Diving ...
  44. 44. 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
  45. 45. Agenda1 Unit-Tests2 Funktionstests3 Abnahme- und Regressionstests4 Stresstests
  46. 46. 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
  47. 47. Unit-Test-KlassenhierarchiePackage android.test junit.framework.TestCase AndroidTestCase InstrumentationTestCaseApplicationTestCase ActivityTestCase LoaderTestCase ProviderTestCase2 ActivityUnitTestCase ServiceTestCase ActivityInstrumentationTestCase2
  48. 48. 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()
  49. 49. Instrumentation• API (Auszug)ActivityMonitor addMonitor(…)Activity waitForMonitor(…)Activity waitForMonitorWithTimeout(…)void startActivitySync(…)void sendXXXSync(…)void startPerformanceSnapshot()void endPerformanceSnapshot()void startProfiling()Void stopProfiling()
  50. 50. 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)
  51. 51. ActivityInstrumentationTestCase2 public class Position…ActivityUiTest extends ActivityInstrumentationTestCase2<Pos…ity> { public PositionOverviewActivityUiTest() { super(PositionOverviewActivity.class); } public void testClickOnList() { … } }
  52. 52. Code Diving ...
  53. 53. ActivityUnitTestCase vs.ActivityInstrumentationTestCase2 ActivityUnitTestCase ActivityInstr TestCase2 • Reines Testen des • Testen des UI- Codes Verhaltens • Kein Test des UI- • Testen des Workflow- Verhaltens Verhaltens • Kein Test des Workflow- Verhaltens
  54. 54. Robotium• Selenium nur für Android• Baut auf Instrumentation auf• Weniger komplex zu bedienen• Black-Box-Testing möglich
  55. 55. 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
  56. 56. Continuous IntegrationBest 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)
  57. 57. Agenda1 Unit-Tests2 Funktionstests3 Abnahme- und Regressionstests4 Stresstests
  58. 58. MonkeyRunner Creative Commons by Simon Englisch
  59. 59. MonkeyRunner• Python / Jython• Testen kompletter Use-Cases• Vergleichen der Ergebnisse über Bildschirm-Fotos• Paralleles Testen verschiedener Devices und Auflösungen via Scripting
  60. 60. 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(…)
  61. 61. Agenda1 Unit-Tests2 Funktionstests3 Abnahme- und Regressionstests4 Stresstests
  62. 62. Würden Sie einen Affen mitIhrem Telefon spielen lassen? http://blog.asiantown.net
  63. 63. Monkey• Schicken zufälliger Events• Anzahl und Geschwindigkeit konfigurierbar• Reihenfolge reproduzierbar (durch Angabe von seed)• Wahrscheinlichkeit einzelner Event- Arten konfigurierbar Suchen von spezifischen Bugs
  64. 64. Agenda1 Unit-Tests2 Funktionstests3 Regressionstests4 Stresstests
  65. 65. 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)
  66. 66. Q&AVielen Dank für Ihre Zeit.Kontakt:open knowledge GmbHBismarckstr. 1326122 Oldenburgarne.limburg@openknowledge.de @ArneLimburg @_openknowledge

×