Android Testautomatisierung mit dem Framework Robotium Daniel Knott XING AG @dnlkntt http://www.adventuresinqa.com
Daniel Knott Manager Quality Assurance @dnlkntt daniel.knott@xing.com Daniel Knott hat einen technischen Hintergrund in verschiedenen Programmiersprachen und Quality Assurance Tools. Nach seiner Ausbildung bei der IBM Deutschland GmbH studierte er an der Fachhochschule Wiesbaden Informatik mit dem Schwerpunkt Softwarequalitätssicherung. Seit 2010 arbeitet Daniel Knott als Manager Quality Assurance bei der XING AG. In verschiedenen Projekten (XING Suche, XING Empfehlungen) war er verantwortlich für das Testmanagement, für die Ausführung der Testfälle sowie für die Testautomatisierung. Zur Zeit arbeitet Daniel Knott im XING mobile Team. Dort ist er verantwortlich für das Testmanagement aller Mobilen Apps der XING AG, dazu gehören iphone, Android, touch.xing.com, Windows Phone 7 und die Blackberry App. Neben dem Testmanagement betreut Daniel die Testautomatisierung der iphone und Android App. Zusätzlich zu seiner Tätigkeit bei der XING AG ist Daniel ein Sprecher auf agilen Konferenzen. Sein XING Profil https://www.xing.com/profile/daniel_knott. Sein Blog http://www.adventuresinqa.com
Inhaltsverzeichnis 1. XING AG 2. Warum Testautomatisierung? 3. Robotium 4. Code / Live Demo 5. Vor -und Nachteile 6. Best Practices 3
XING AG Gegründet 2003 als OpenBC Seit 2006 XING AG > 11.7 Mio. Mitglieder ~25% Mobiler Traffic 4
XING AG 5
XING AG 50 Releases im Jahr 6
XING AG 7
Warum Testautomatisierung? 8
Warum Testautomatisierung? 9
Warum Testautomatisierung? Falsche Übersetzung App lässt sich nicht installieren Fehlende Ressourcen Keine Verbindung zum Backend Layout- Probleme Probleme mit Landscape / Portrait Mode 10
Warum Testautomatisierung? 11
Warum Testautomatisierung? 12
Robotium 13
Robotium Allgemeines Black Box Test Tool Basiert auf Java und JUnit 3 Support von Android 1.6 4.x Simuliert User- InterakQonen Device & Simulator Einfacher AuSau Testet APK Files 14
Robotium Methoden clickonbutton(text) clickontext(text) clickonimage(id) clickinlist(line) searchtext(text) entertext(id, text) waitforactivity(name, timeout) waitforview(view) It s like Selenium, but for Android TM 15
Code-Beispiele 16
Code Login public void testloginfailed() throws Exception { } solo.entertext(0, wrongusername ); solo.entertext(1, wrongpassword ); solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_login)); solo.waitforactivity("com.xing.android.activities.spinnerloginactivity", 2000); asserttrue("error: Error message is not shown", verifytextispresent(solo.getstring( com.xing.android.r.string.dialog_error_body))); solo.clickonbutton(solo.getstring(com.xing.android.r.string.dialog_button)); 17
Code Login public void testloginfailed() throws Exception { } solo.entertext(0, wrongusername ); solo.entertext(1, wrongpassword ); solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_login)); solo.waitforactivity("com.xing.android.activities.spinnerloginactivity", 2000); asserttrue("error: Error message is not shown", verifytextispresent(solo.getstring( com.xing.android.r.string.dialog_error_body))); solo.clickonbutton(solo.getstring(com.xing.android.r.string.dialog_button)); 18
Code Login public void testloginfailed() throws Exception { } solo.entertext(0, wrongusername ); solo.entertext(1, wrongpassword ); solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_login)); solo.waitforactivity("com.xing.android.activities.spinnerloginactivity", 2000); asserttrue("error: Error message is not shown", verifytextispresent(solo.getstring( com.xing.android.r.string.dialog_error_body))); solo.clickonbutton(solo.getstring(com.xing.android.r.string.dialog_button)); 19
Code Login public void testloginfailed() throws Exception { } solo.entertext(0, wrongusername ); solo.entertext(1, wrongpassword ); solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_login)); solo.waitforactivity("com.xing.android.activities.spinnerloginactivity", 2000); asserttrue("error: Error message is not shown", verifytextispresent(solo.getstring( com.xing.android.r.string.dialog_error_body))); solo.clickonbutton(solo.getstring(com.xing.android.r.string.dialog_button)); 20
Code Login 21
Code Status Update public void teststatusupdate() throws Exception { solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_news)); solo.entertext(0, bin auf der Mobile Developer Conference ); solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_send)); solo.clickonmenuitem(solo.getstring(com.xing.android.r.string.menu_refresh)); asserttrue("error: Update is not shown", searchtext( bin auf der Mobile Developer Conference )); solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_delete)); solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_yes)); assertfalse("error: Update is still shown", searchtext( bin auf der Mobile Developer Conference )); } 22
Code Status Update public void teststatusupdate() throws Exception { solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_news)); solo.entertext(0, bin auf der Mobile Developer Conference ); solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_send)); solo.clickonmenuitem(solo.getstring(com.xing.android.r.string.menu_refresh)); asserttrue("error: Update is not shown", searchtext( bin auf der Mobile Developer Conference )); solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_delete)); solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_yes)); assertfalse("error: Update is still shown", searchtext( bin auf der Mobile Developer Conference )); } 23
Code Status Update public void teststatusupdate() throws Exception { solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_news)); solo.entertext(0, bin auf der Mobile Developer Conference ); solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_send)); solo.clickonmenuitem(solo.getstring(com.xing.android.r.string.menu_refresh)); asserttrue("error: Update is not shown", searchtext( bin auf der Mobile Developer Conference )); solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_delete)); solo.clickonbutton(solo.getstring(com.xing.android.r.string.button_yes)); assertfalse("error: Update is still shown", searchtext( bin auf der Mobile Developer Conference )); } 24
Code Status Update 25
Vor -und Nachteile 26
Vorteile Testen auf echter Hardware Verschiedene Versionen testen Einfacher Aufbau App Source Code nicht notwendig Integration in CI Server (Jenkins) Open Source Starke Community 27
Nachteile Ausführungszeit sehr langsam Kein Web-View- oder Flash-Support Keine Screenshotfunktion Kein Multi Device Support Kein Zugriff auf andere APKs Reaktion auf Anrufe, SMS, Tweets Kamera, Sensoren, Bluetooth 28
Best Practices 29
Best Practices Testcode und Entwicklungscode in gleicher Sprache Sicherung aller Tests in einer Versionskontrolle Tools kombinieren Continuous Integration Server nutzen Android Simulator meiden Gerootete Geräte meiden In allen Netzen Testen Die Kunden kennen! 30
Vielen Dank für Ihre Aufmerksamkeit Daniel Knott Manager Quality Assurance daniel.knott@xing.com @dnlkntt http://www.adventuresinqa.com/ Das professionelle Netzwerk www.xing.com 31
Links & Referenzen Robotium http://code.google.com/p/robotium/ Android Logo http://www.android.com/media/wallpaper/gif/android_logo.gif Twitter Logo https://si0.twimg.com/a/1318896278/images/logos/twitter_newbird_white.png Businesswoman http://www.istockphoto.com/stock-photo-16742115-businesswoman-holding-a-blanksign-isolated.php Letters, by davide vizzini limbtehttp://www.flickr.com/photos/limbte/4007115435/ Robotium Logo http://f.hatena.ne.jp/images/fotolife/r/re_shikajiro/20110601/20110601224550.jpg Samsung Logo http://samsung.de/webdownloads/pressedownloads/samsung_standard_brandline_c.jpg HTC Logo http://fs02.androidpit.info/userfiles/44704/image/bilder/htc/htc_logo.jpg 32
Links & Referenzen LG Logo http://upload.wikimedia.org/wikipedia/de/f/f1/lg-logo.svg Sony Ericsson Logo http://www.xginsider.com/wp-content/uploads/2010/09/sony-ericsson-logo.jpg Motorola Logo http://www.android-hilfe.de/attachments/android-news/42706d1310665896-motorola-atrixab-sofort-deutschland-erhaeltlich-ohne-lapdock-logo-motorola.jpg] Huawei Logo http://www.android.com/media/wallpaper/gif/android_logo.gif Iqnite Logo http://www.bredex.de/web/tl_files/bredexdateien/pictures/events/ iqnite_logo_deutschland2012_rgb.jpg Google Play Logo http://www.android.com/images/brand/android_app_on_play_logo_small.png Apple App Store Logo http://www.inext.me/wp-content/uploads/2011/09/ app-store_logo.png Windows Market Place Logo http://modmyi.com/attachments/forums/iphone-4- new-skins-themes-launches/483774d1290368882-release-windows-phone-7-hd-marketplace-2x.png 33