Click here to load reader

Automatisiertes Testen in Android

  • View
    632

  • Download
    3

Embed Size (px)

DESCRIPTION

Speaker: Arne Limburg open knowledge GmbH MobileTechCon

Text of Automatisiertes Testen in Android

  • 1. Arne Limburg | open knowledge GmbH @ArneLimburg @_openknowledge

2. Meine PersonArne LimburgHead of Developmentopen knowledge GmbH @ArneLimburg @_openknowledge www.openknowledge.de 3. Herausforderungen Vielfalt der Gerte Bildschirmauflsung Eingabemethode Capabilities Vielfalt der Umwelteinflsse Umgebung (Netz, Batterie, Standort) Nutzerverhalten 4. Was tun?Rechne mit allem!Rechne mit nichts!Testen, Testen, Testen! 5. Testen Konzentration auf das Wesentliche Gerte Android-Versionen Lnder Operatoren Test-Automatisierung 6. Testen - Agenda1 Unit-Tests2 Funktionstests3 Abnahme- und Regressionstests4 Stresstests 7. Unit-TestingA unit is the smallest testable part of an application.http://en.wikipedia.org/wiki/Unit_testing 8. Ziel von Unit-Testing korrekte Funktionsweise von kleinen Einheiten der Software (Testen einzelner Methoden) Automatisch Regelmig (Continuous Integration) Regressionssicher 9. Android Testing Framework JUnit-Untersttzung fr On-Device-Testing Oberklassen zum Testen von Android-Komponenten Activity Content-Provider Service 10. Mock-Kontexte MockContext Alle Methoden werfen Exception IsolatedContext Isolation vom Device Datenbank- und Datei-Operationen mglich RenamingDelegatingContext Kommunikation mit dem Device mglich Datenbank- und Datei-Operationen werden umgeleitet 11. Android Testing - Architektur 12. Unit-Test-KlassenhierarchiePackage android.testjunit.framework.TestCase AndroidTestCaseInstrumentationTestCaseApplicationTestCase ActivityTestCase LoaderTestCaseProviderTestCase2ActivityUnitTestCase ServiceTestCase ActivityInstrumentationTestCase2 13. PoviderTestCase2 Testen eines isolierten Content-Providers Verwendung von IsolatedContext Bereitstellen eines MockContentResolversAPIsetContext(Context) (von AndroidTestCase)getMockContentResolver()getProvider 14. ProviderTestCase2public class PositionProviderTest extendsProviderTestCase2 {public PositionProviderTest() {super(PositionProvider.class,PositionProvider.AUTHORITY);}public void testInsert() {} 15. ProviderTestCase2public class PositionProviderTest extendsProviderTestCase2 {public PositionProviderTest() {super(PositionProvider.class,PositionProvider.AUTHORITY);}public void testInsert() {} 16. ProviderTestCase2public class PositionProviderTest extendsProviderTestCase2 {public PositionProviderTest() {super(PositionProvider.class,PositionProvider.AUTHORITY);}public void testInsert() {} 17. ServiceTestCase Standardmig mit echtem Context und MockApplication Herausforderung: Testen von ThreadingAPIsetApplication(Application)setContext(Context) (von AndroidTestCase)startService(Intent)bindService(Intent) 18. ServiceTestCasepublic class UpdaterServiceTest extends ServiceTestCase {public UpdaterServiceTest() {super(UpdaterService.class);}public void testStartService() {}} 19. ServiceTestCasepublic class UpdaterServiceTest extends ServiceTestCase {public UpdaterServiceTest() {super(UpdaterService.class);}public void testStartService() {}} 20. ServiceTestCasepublic class UpdaterServiceTest extends ServiceTestCase {public UpdaterServiceTest() {super(UpdaterService.class);}public void testStartService() {}} 21. Code Diving ... 22. ActivityUnitTestCase Leitet von InstrumentationTestCase ab Isoliertes Testen einer ActivityAPI (Auszug)getStartedActivityIntent()getStartedActivityRequest()getRequestOrientation()isFinishedCalled() 23. ActivityUnitTestCasepublic class PositioActivityUnitTest extendsActivityUnitTestCase {public PositionOverviewActivityUnitTest() {super(PositionOverviewActivity.class);}public void testOnListItemClick() {}} 24. ActivityUnitTestCasepublic class PositioActivityUnitTest extendsActivityUnitTestCase {public PositionOverviewActivityUnitTest() {super(PositionOverviewActivity.class);}public void testOnListItemClick() {}} 25. ActivityUnitTestCasepublic class PositioActivityUnitTest extendsActivityUnitTestCase {public PositionOverviewActivityUnitTest() {super(PositionOverviewActivity.class);}public void testOnListItemClick() {}} 26. Code Diving ... 27. Unit-Tests Herausforderung: Umgang mit Abhngigkeiten Klassisches Vorgehen: Erstellen von Mocks On-Device: Mock-Implementierungen des Android Testing Frameworks Off-Device: Gngige Java-Mocking- Frameworks (EasyMock, Mockito, ...) 28. Off-Device-Testing Herausforderung: Android Java java.lang.RuntimeException: Stub! Off-Device Instantiieren Mocking via Java-Mocking-Frameworks Zugriff auf Android-Interna Lsung: Robolectric 29. Robolectric Instantiieren von Android-Klassen Shadowing Zugriff auf Resourcen ... 30. [email protected](RobolectricTestRunner.class)public class PositionOverviewActivityTest {@Testpublic void onItemClick() {}} 31. [email protected](RobolectricTestRunner.class)public class PositionOverviewActivityTest {@Testpublic void onItemClick() {}} 32. [email protected] void onItemClick() { ShadowActivity a = shadowOf(activity); Intent startedIntent= a.getNextStartedActivity(); } 33. Code Diving ... 34. Continuous Integration Regelmiges Bauen und Testen (CI-Server) z.B. Jenkins Voraussetzung: Automatisiertes Bauen und Testen Ant oder Maven Zusatzfeature: Code-Abdeckung mit EMMA 35. Agenda1 Unit-Tests2 Funktionstests3 Abnahme- und Regressionstests4 Stresstests 36. 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 37. Unit-Test-KlassenhierarchiePackage android.testjunit.framework.TestCase AndroidTestCaseInstrumentationTestCaseApplicationTestCase ActivityTestCase LoaderTestCaseProviderTestCase2ActivityUnitTestCase ServiceTestCase ActivityInstrumentationTestCase2 38. InstrumentationTestCase API (Auszug) T launchActivity(String, Class, Bundle) T launchActivityWithIntent(String, Class, Intent)void sendKeys(String)void sendKeys(int)void sendRepeatedKeys(int)Instrumentation getInstrumentation() 39. Instrumentation API (Auszug)ActivityMonitor addMonitor()Activity waitForMonitor()Activity waitForMonitorWithTimeout()void startActivitySync()void sendXXXSync()void startPerformanceSnapshot()void endPerformanceSnapshot()void startProfiling()Void stopProfiling() 40. ActivityInstrumentationTestCase2 Leitet von InstrumentationTestCase ab Testen von UI-Verhalten Testen eines gesamten Worksflows Erzeugen von TouchEvents mitTouchUtils berprfen von Layout mit ViewAsserts Eventuell Verwendung von Third-Party-Framework (Robotium) 41. ActivityInstrumentationTestCase2public class PositionActivityUiTest extendsActivityInstrumentationTestCase2 {public PositionOverviewActivityUiTest() {super(PositionOverviewActivity.class);}public void testClickOnList() {}} 42. ActivityInstrumentationTestCase2public class PositionActivityUiTest extendsActivityInstrumentationTestCase2 {public PositionOverviewActivityUiTest() {super(PositionOverviewActivity.class);}public void testClickOnList() {}} 43. ActivityInstrumentationTestCase2public class PositionActivityUiTest extendsActivityInstrumentationTestCase2 {public PositionOverviewActivityUiTest() {super(PositionOverviewActivity.class);}public void testClickOnList() {}} 44. Code Diving ... 45. ActivityUnitTestCase vs.ActivityInstrumentationTestCase2ActivityUnitTestCase ActivityInstrTestCase2 Reines Testen des Testen des UI- CodesVerhaltens Kein Test des UI- Testen des Workflow- Verhaltens Verhaltens Kein Test des Workflow- Verhaltens 46. Robotium Selenium nur fr Android Baut auf Instrumentation auf Weniger komplex zu bedienen Black-Box-Testing mglich 47. Code Diving ... 48. Android Emulator fernsteuern Steuerung von Geo-Koordinaten, Telefonie, Netzwerk (Geschwindigkeit, Delay), Batterie, SMS, Sensoren DDMS-Perspektive in Eclipse Verbinden via TelnetBeispiel:telnet localhost 5554 49. Continuous IntegrationBest Practice Funktionstests selten ausfhren Klassifizierung von [email protected] Echter Unit-Test (ActivityUnitTest)@MediumTest Test einer Komponente mit [email protected] Workflow-Test (gesamter Use-Case) 50. Agenda1 Unit-Tests2 Funktionstests3 Abnahme- und Regressionstests4 Stresstests 51. MonkeyRunnerCreative Commons by Simon Englisch 52. MonkeyRunner Python / Jython Testen kompletter Use-Cases Vergleichen der Ergebnisse ber Bildschirm-Fotos Paralleles Testen verschiedener Devices und Auflsungen via Scripting 53. 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() 54. Agenda1 Unit-Tests2 Funktionstests3 Abnahme- und Regressionstests4 Stresstests 55. Wrden Sie einen Affen mitIhrem Telefon spielen lassen? Rex Features 56. Monkey Schicken zuflliger Events Anzahl und Geschwindigkeit konfigurierbar Reihenfolge reproduzierbar (durch Angabe von seed) Wahrscheinlichkeit einzelner Event- Arten konfigurierbarSuchen von spezifischen Bugs 57. Agenda1 Unit-Tests2 Funktionstests3 Regressionstests4 Stresstests 58. Fazit - Testing Unit-Tests Off Device (Robolectric) On Device (Android Testing Framework) Regelmig (Continuous Integration) mitSimulator Vor der Auslieferung mit echten Gerten Funktionale Tests UI-Interaktion Gesamter Workflow (automatisiert) Regressionstests (MonkeyRunner) Stresstests (Monkey) 59. Q&AVielen Dank fr Ihre Zeit.Kontakt:open knowledge GmbHBismarckstr. 1326122 [email protected]@[email protected]_openknowledge