webinar n+1 sposobów na automatyczne testy aplikacji mobilnych WrotQA, 20.08.2014 Damian Szczurek Łukasz Siudakiewicz Test Team Leader Automation Test Engineer damian.szczurek@bitbar.com lukasz.siudakiewicz@bitbar.com
Agenda Główne wyzwania w testach aplikacji mobilnych (Android) Testy manualne vs. Testy automatyczne Najważniejsze frameworki do automatyzacji testów Który framework wybrać i dlaczego? Testdroid Recorder Demonstracja Testdroid Cloud Q&A Copyrights by Bitbar Technologies Ltd. 2013 2
źródło http://opensignal.com/reports/fragmentation-2013/ 3
Przyczyny błędów aplikacji (Android) 4
Wyzwania w testach aplikacji mobilnych Błędy mają swoje źródła zarówno po stronie hardware'u i wersji OS Emulatory nie odwierciedlają prawdziwego zachowania aplikacji na urządzeniu Jeżeli aplikacji nie instaluje się na urządzeniu > nie można jej na nim przetestować :) Aplikacje się kraszują, zużywają za dużo pamięci Problemy z poprawnym wyświetlaniem na różnych rozdzielczościach 5
Przecież są emulatory... Tak, ale emulatory nie pomogą przetestować... UX i usability aplikacji kwestii sprzętowych współpraca z siecią Poza tym: emulatory są uciążliwe i zasobożerne jest ich ograniczona ilość 0% = procent użytkowników, którzy używają Twojej aplikacji na emulatorze ;) 6
Testy manualne vs. testy automatyczne Więcej urządzeń, mniej czasu i pieniędzy, wyniki bardziej dokładne Dostęp do mniejszej liczby urządzeń, czas, możliwość popełnienia błędów przez testerów 7
8
Różne podejścia do automatyzacji Testy pisane ręcznie Nagraj i odtwórz App crawler Different Ways To Automate Korzyści: Dokładne, dostosowane do twoich wymagań, Szybkie do stworzenia, w miarę dokładne, nie Najszybsze do uzyskania wyniki, najlepsze do testów co najmniej kilka godnych zainteresowania podatne na błędy ludzkie instalacyjnych i bardzo ograniczonych smoke testów Dostępne tylko dla niektórych frameworków Nie tak dokładne jak zaprojektowane test frameworków i narzędzi Minusy: Zabiera dużo czasu, wymaga zasobów (ludzie, kompetencje). Na początku jest dosyć case'y kosztowne. 9
Rodzina frameworków Calabash Appium Espresso Robotium Android Instrumentation Framework UIAutomator JUnit 10
Robotium: Biblioteka open source, zawierająca wiele użytecznych metod do testów UI Wsparcie dla aplikacji natywnych, hybrydowych i webowych Częste aktualizacje Java 11
Robotium: przykład kodu // Public void for the operation public voidtestrecorded() throws Exception { // Wait for the text 'Hello!'to be shown for newbie if(solo.waitfortext("hello!")) { // R class ID identifier for 'Sign in' - and click it solo.clickonview(solo.findviewbyid("com.twitter.android.r.id.sign_in")); // R class ID identifier for entering username solo.entertext((edittext)solo.findviewbyid("com.twitter.android.r.id.login_username"),"username"); // R class ID identifier for entering password solo.entertext((edittext)solo.findviewbyid("com.twitter.android.r.id.login_password"),"password"); // R class ID identifier for clicking log in solo.clickonview(solo.findviewbyid("com.twitter.android.r.id.login_login")); // Wait until log in is done solo.waitforactivity("hometabactivity"); } // Activate the text field to compose a tweet solo.clickonview(solo.findviewbyid("com.twitter.android.r.id.menu_compose_tweet")); // Type the tweet solo.entertext((edittext)solo.findviewbyid("com.twitter.android.r.id.edit"), "Testdroid"); // Tweeting! solo.clickonview(solo.findviewbyid("com.twitter.android.r.id.composer_post")); } 12
Robotium: ExtSolo Zawiera metody, których nie ma w oryginalnej bibliotece Robotium, na przykład: Multi-path drags Automatyczne screenshoty w przypadku błędu aplikacji Mock locations (GPS) Zmiana języka w urządzeniu kontrola połączenia WiFi Dostępna do ściągnięcia: http://testdroid.com/products/apis-plugins-and-libraries 13
Calabash: Behaviour Driven Development na Androida, ios oraz stron web Testy są projektowane w języku Cucumber i konwertowane podczas testu na Robotium Dostępnych jest ponad 80 różnych komend (język naturalny). Nowe komendy mogą być definiowane w Ruby Zaletą Calabasha jest łatwość w utrzymaniu testów 14
Calabash: Przykładowy skrypt Feature: Login feature Scenario: As a valid user I can log into my app I wait for text "Hello" Then I press view with id "Sign in" Then I enter text "username" into "login_username" Then I enter text "password" into "login_password" Then I wait for activity "HomeTabActivity" Then I press view with id "menu_compose_tweet" Then I enter text "Testdroid"into field with id "edit" Then I press view with id "composer_post" 15
uiautomator: Framework Google'a wspierający aplikacje natywne oraz dostęp do innych procesów w systemie Działa tylko na urządzeniach z API level >= 16 Brak wsparcia dla web view 16
uiautomator: przykładowy kod // Public void for the operation public void testsigninandtweet()throwsexception { // Starting application: getuidevice().wakeup();// Press Home button to ensure we'reonhomescreen getuidevice().presshome();// Select 'Apps' and click button newuiobject(newuiselector().description("apps")).click();// Select 'Twitter' andclick newuiobject(newuiselector().text("twitter")).click();// Locate and select 'Sign in' UiSelectorsignIn=newUiSelector().text("Sign In");// If button is available,click UiObjectsignInButton=newUiObject(signIn); if(signinbutton.exists()) { signinbutton.click();// Set the username newuiobject(new UiSelector().className("android.widget.EditText").instance(0)).setText("username"); newuiobject(new UiSelector().className("android.widget.EditText").instance(1)).setText("password"); newuiobject(newuiselector().classname("android.widget.button"). text("sign In").instance(0)).click();// Wait Sign in progress window getuidevice().waitforwindowupdate(null, 2000);// Wait for main window getuidevice().waitforwindowupdate(null, 30000); } newuiobject(newuiselector().description("new tweet")).click();// Typing text for a tweet newuiobject(newuiselector().classname("android.widget.linearlayout").instance(8)). settext("awesome #Testdroid!");// Tweeting! newuiobject(newuiselector().text("tweet")).click(); } 17
Appium: Korzysta z WebDrivera do uruchamiania testów Wspiera aplikacje natywne na Androida, ios oraz strony web na urządzeniach mobilnych: Android via UIAutomator (API level>=16) oraz Selendroid (API level<16) ios via UIAutomation Mobile web >> Selenium driver dla Androida i ios Testy mogą być pisanie w którymkolwiek z języków: Haskell, Java, Ruby, Python, PHP,... Copyrights by Bitbar Technologies Ltd. 2013 18
Appium: przykładowy kod # set up webdriver log ("WebDriver request initiated. Waiting for response, this typically takes 2-3 mins") driver = webdriver.remote(appium_url, desired_caps) log ("WebDriver response received") log ("Activity-1") log (" Getting device screen size") print driver.get_window_size() sleep(2) # always sleep before taking screenshot to let transition animations finish log (" Taking screenshot: 1_appLaunch.png") driver.save_screenshot(screenshotdir + "/1_appLaunch.png") log (" Typing in name") elems=driver.find_elements_by_tag_name('edittext') log (" info: EditText:" + `len(elems)`) log (" Filling in name") elems[0].click() elems[0].send_keys("testdroid User") sleep(2) log (" Taking screenshot: 2_nameTyped.png") driver.save_screenshot(screenshotdir + "/2_nameTyped.png") log (" Hiding keyboard") driver.back() sleep(2) log (" Taking screenshot: 3_nameTypedKeyboardHidden.png") driver.save_screenshot(screenshotdir + "/3_nameTypedKeyboardHidden.png") 19
Espresso: Framework tworzony przez Google Wspiera API level 8 (Froyo), 10 (Gingerbread), 15-19 (IJK) Android Instrumentation Framework Używany przez Google :-) Testy pisane w Javie Proste API pozwalające na rozszerzenie frameworka o własne metody Nie ma konieczności używania sleepów 20
Porównanie frameworków Robotium UIAutomator Espresso Appium Calabash Android TAK TAK TAK TAK TAK ios Nie Nie Nie TAK TAK Mobile web TAK Tylko kliki X,Y Nie TAK TAK (Android & ios) (Android) Java, Python, Ruby, Ruby (Android) Języki Java Java Java Haskel,... Narzędzia Wspierane API levels TestdroidRecorder UIAutomatorviewer HierarchyViewer Inspector CLI Wszystkie 16=> 8, 10, 15-19 Wszystkie Wszystkie 21
Inne frameworki: Android: Robolectric Siesta Spoon ios: UI Automation KIF Jasmine Frank... 22
Jaki framework wybrać? To zależy... Znajomość technologii i języków programowania Wsparcie wielu API levels Technologia i framework aplikacji Dokładność testów Zmiany w aplikacji 23
Testdroid Cloud: 24
Testdroid Recorder Demo: 25
26