Mobiltest automatisering - erfaringer direkte fra skyttegraven TestExpo 2014
Agenda Intro Fra User story til automatisk accept test Teknikken / Værktøjer Eksempler / Demo Afvikling / Overvågning af tests Udfordringer Forbedringer Spørgsmål 2
ebay Classifieds, Denmark DBA, BilBasen og Bilinfo Mere end 1 million downloads af DBA Mere end 400.000 downloads af BilBasen Begge apps findes til iphone, ipad og Android Trafikken fra mobile enheder er fordoblet i løbet af 2013 Hyppige nye releases 3
Niels Frydenholm http://www.linkedin.com/in/frydenholm 4
Team organisering Product Owner UX Andre interessenter Udviklere QA er 5
Fra story til levende dokumentation (aka. automatisk accept test) 6
Fra story til levende dokumentation (aka. automatisk accept test) Product owner skriver user story 6
Fra story til levende dokumentation (aka. automatisk accept test) Product owner skriver user story PO, QA og en udvikler gennemgår accept kriterier 6
Fra story til levende dokumentation (aka. automatisk accept test) Product owner skriver user story PO, QA og en udvikler gennemgår accept kriterier Grooming og estimering af story 6
Fra story til levende dokumentation (aka. automatisk accept test) Product owner skriver user story PO, QA og en udvikler gennemgår accept kriterier Grooming og estimering af story Sprint planlægning 6
Fra story til levende dokumentation (aka. automatisk accept test) Product owner skriver user story PO, QA og en udvikler gennemgår accept kriterier Grooming og estimering af story Udviklere og QA er gennemgår test scenarier ud fra accept kriterier Sprint planlægning 6
Fra story til levende dokumentation (aka. automatisk accept test) Product owner skriver user story PO, QA og en udvikler gennemgår accept kriterier Grooming og estimering af story Team implementerer stories og tests Udviklere og QA er gennemgår test scenarier ud fra accept kriterier Sprint planlægning 6
Fra story til levende dokumentation (aka. automatisk accept test) Automatiserede accept tests Continuous + = Integration 6
Teknikken Jenkins (CI) 7
Cucumber - mere end et testværktøj 8
Cucumber - mere end et testværktøj Behaviour- Driven Development Sætter strøm til Gherkin syntax Kommunikation og samarbejde mellem forretningen, QA og udviklere Let at både læse og skrive Skrevet i domain sprog 8
Cucumber - mere end et testværktøj Behaviour- Driven Development Sætter strøm til Gherkin syntax Kommunikation og samarbejde mellem forretningen, QA og udviklere Feature: Simple search As a user I want to be able to do simple searches Let at både læse og skrive Skrevet i domain sprog 8
Cucumber - mere end et testværktøj Behaviour- Driven Development Sætter strøm til Gherkin syntax Kommunikation og samarbejde mellem forretningen, QA og udviklere Feature: Simple search As a user I want to be able to do simple searches Scenario: I can search without any parameters Given I am on search When I perform the search Then I see the result Let at både læse og skrive Skrevet i domain sprog 8
Cucumber - mere end et testværktøj Behaviour- Driven Development Sætter strøm til Gherkin syntax Kommunikation og samarbejde mellem forretningen, QA og udviklere Feature: Simple search As a user I want to be able to do simple searches Scenario: I can search without any parameters Given I am on search When I perform the search Then I see the result Let at både læse og skrive Skrevet i domain sprog Step-definition Then(/^I see the result$/) do unless query("view marked:'searchresultcell'").count > 0 screenshot_and_raise "No result was shown" end end 8
Calabash Gør det muligt at bruge Cucumber til native apps ios Android Interagere med apps touch, scroll, swipe etc Query- syntax (ios eksempler) query( label marked: label text ) query( button marked: Ok ) 9
Calabash - arkitektur 10
Scenario implementering 11
Scenario implementering SYI = Sell your item Scenario: Check that change classification clears matrixdata with warning Given I am logged in as "Buyer" And I am on the SYI hub And I select classification "Hovedtelefoner" And I set "Type" to Nakkekontur And I set price to "250" When I press "Kategori" Then I wait for "Du er ved at skifte kategori" to appear When I touch "Fortryd" Then I see cells containing "Nakkekontur" When I press "Kategori" Then I wait for "Du er ved at skifte kategori" to appear When I touch "Skift" Then I see the SYI classification search 11
Scenario implementering Scenario: Check that change classification clears matrixdata with warning Given I am logged in as "Buyer" And I am on the SYI hub And I select classification "Hovedtelefoner" And I set "Type" to Nakkekontur And I set price to "250" When I press "Kategori" Then I wait for "Du er ved at skifte kategori" to appear When I touch "Fortryd" Then I see cells containing "Nakkekontur" When I press "Kategori" Then I wait for "Du er ved at skifte kategori" to appear When I touch "Skift" Then I see the SYI classification search Scenario: Check that change classification clears matrixdata with warning Given I am logged in as "Buyer" And I am on the SYI hub And I select classification "Hovedtelefoner" And I set matrixdata "Type" to Nakkekontur" And I set price to "250" When I try to change classification Then I see an alert with title "Du er ved at skifte kategori" When I cancel the alert Then the classification is "Nakkekontur" When I try to change classification Then I see an alert with title "Du er ved at skifte kategori" When I accept the change classification alert Then I see the SYI classification search 11
Step implementering Step fra sell your item feature And I set price to "250" 12
Step implementering Step fra sell your item feature And I set price to "250" And /^I set price to "(.*?)"$/ do price macro 'I swipe up' sleep(1) touch("view marked:'price'") sleep(0.5) set_text("view marked:'price'", price) sleep(0.5) touch("view marked:'ok'") sleep(1) end 12
Step implementering Step fra sell your item feature And I set price to "250" And /^I set price to "(.*?)"$/ do price macro 'I swipe up' sleep(1) touch("view marked:'price'") sleep(0.5) set_text("view marked:'price'", price) sleep(0.5) touch("view marked:'ok'") sleep(1) end And /^I set price to "(.*?)"$/ do price @page.write_price(price) end 12
Step implementering Step fra sell your item feature And I set price to "250" And /^I set price to "(.*?)"$/ do price macro 'I swipe up' sleep(1) touch("view marked:'price'") sleep(0.5) set_text("view marked:'price'", price) sleep(0.5) touch("view marked:'ok'") sleep(1) end And /^I set price to "(.*?)"$/ do price @page.write_price(price) end SellYourItemPage (page object) def write_price(price) scroll_and_wait_for_row_with_mark("pricecell") touch("view marked:'price'") keyboard_enter_text price close_keyboard end 12
PageObject pattern Feature Scenario Step 13
PageObject pattern Feature Scenario Step Page object ipad iphone Android 13
PageObject pattern Feature Scenario Step Page object ipad iphone Android 13
PageObject pattern Feature Scenario Step SyiHubPage (PageObject) go_to_picture_center go_to_classification_search go_to_value_selection_for_matrix data(label) write_price(price) Page object ipad iphone Android 13
PageObject pattern Feature Scenario Step SyiHubPage (PageObject) go_to_picture_center go_to_classification_search go_to_value_selection_for_matrix data(label) write_price(price) Page object ipad iphone Android 13
DEMO 14
Continuous Integration Jenkins på en Mac Mini Afvikler tests parallelt (Master/Slave Jenkins setup) Kun afvikling på simulator (indtil videre) Tests køres efter hvert commit Unit tests > Integration tests > Accept/UI tests 15
Overvågning af CI 16
Overvågning af CI 16
Cucumber rapportering fra CI 17
Cucumber rapportering fra CI 17
Når det fejler 18
Kvalitetssikring af tests Review og Pair program med QA er Brug (kun) Custom steps Testkode er (også) produktionskode Lad kvaliteten afspejle det Refactor, Refactor, Refactor Følg op på om testene dækker det forventede Med konkret viden - ingen gætterier/antagelser 19
Code coverage Fokuser ikke (nødvendigvis) på % tallet Find inspiration til nye tests Kontroller at hver feature er godt dækket ind 20
Code coverage Fokuser ikke (nødvendigvis) på % tallet Find inspiration til nye tests Kontroller at hver feature er godt dækket ind 20
Code coverage Fokuser ikke (nødvendigvis) på % tallet Find inspiration til nye tests Kontroller at hver feature er godt dækket ind 20
Code coverage Fokuser ikke (nødvendigvis) på % tallet Find inspiration til nye tests Kontroller at hver feature er godt dækket ind 20
Forudsætninger for success Fælles team indsats Definition of Done (DoD) inkluderer automatiseret tests Afsæt tid til løbende vedligehold af nye versioner (primært ios og Calabash) m.v. Fix broken builds ASAP 21
Udfordringer Få defineret accept kriterier i god tid ios 7 En længere periode med langsomme tests Fejl/ændringer i test data Holde Ruby miljø i synk på alle udviklermaskiner 22
Fremtidige ønsker/forbedringer Afvikle tests i Xamarin Test cloud et par gange om ugen Mere BDD/TDD Hurtigere afvikling af tests efter commits Ikke alle tests behøver at køre pr. commit Evt. tags: @daily, @commit etc Database state før tests Få implementeret tests til Android apps 23
Wrap up Test scenarier følger koden - fortæller altid sandheden Muliggør hurtig Time to Market Nødvendigt for at levere høj kvalitet Meget mindre tid på bruges på trivielle regressionstests Glade QA er Modige udviklere Kvalitetsprodukt Glade brugere 24
SPØRGSMÅL 25
Ressourcer The Cucumber Book Calabash @github (https://github.com/calabash/) Calabash google groups https://groups.google.com/forum/#forum/calabash- ios https://groups.google.com/forum/#forum/calabash- android Calabash overview (http://docs.xamarin.com/guides/cross- platform/test_cloud/calabash/intro_to_calabash/) Jenkins (http://jenkins- ci.org/) plugins: Cucumber- reports, Cobertura (code coverage), Build monitor view RubyMine (http://www.jetbrains.com/ruby/) Uncle Bobs Clean Code 26