Introduksjon til iOS Testing Med UI Automation

Introduction til iOS Testing Med UI Automation
94
Del
14
Del
Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

Tenk å kunne skrive skript som automatisk samhandler med iOS-applikasjonen og være i stand til å bekrefte resultatene. Med UI Automation kan du. UI Automation er et verktøy levert av Apple for å utføre et høyere nivå av testing på iOS-applikasjonen hinsides alt oppnåelig med XCTest.

1. White Box versus Black Box Testing

Du har kanskje hørt sammenligningen av hvit boks testing versus svart boks testing med hensyn til hvordan man kan teste et stykke programvare. Hvis du ikke er kjent med disse begrepene, la meg forklare hvordan de fungerer.

White Box Testing

Tenk det er et stykke programvare som kjører inne i en boks. Med hvit boks testing, kan du se inne i boksen og se på alle de sandete biter av hvordan programvaren fungerer, og deretter ta kvalifiserte beslutninger om hvordan å teste programvaren. Du kan også ha dypere nivå kroker i programvaren fra de testene du skriver.

Unit testing er hvit boks testing. Når skriver enhet forsøk, har testeren finkornet tilgang til koden under test. Testeren kan faktisk skrive tester som utnytter programvaren under test på metoden eller enhet, nivå.

I iOS utvikling av programvare bruker vi XCTest rammeverk for å utføre denne typen tester. Ta en titt på en annen tutorial jeg skrev om hvordan du kommer i gang med XCTest.

Black Box Testing

I black box testing, er ugjennomsiktig boksen. Testeren kan ikke se inne i boksen. Testeren kan ikke få tilgang til og ikke vet om gjennomføringen av kodebasen for å skrive tester. I stedet er testeren tvunget til å bruke programmet som en sluttbruker ville ved å samhandle med søknaden og venter på sin respons, verifisere resultatene.

Det er minst to måter å utføre denne typen testing. < .no>
A tester som gjentatte ganger og manuelt utfører en rekke forhåndsdefinerte trinn og visuelt bekrefter resultatene.

Bruk spesialiserte verktøy for å teste applikasjonen med APIer som oppfører seg som ligner på hvordan et menneske samhandler.

I iOS applikasjonsutvikling, gir Apple et verktøy kalt UI Automation å utføre svart boks testing.

2. Hva er UI Automation?

UI Automation er et verktøy som Apple leverer og vedlikeholder for høyere nivå, automatisert, testing av iOS-applikasjoner. Tester er skrevet i Javascript, å følge en API definert av Apple.

Writing tester kan gjøres enklere ved å stole på tilgjengelighets etiketter for brukergrensesnitt-elementer i programmet. Ikke bekymre deg om, hvis du ikke har disse definert, det finnes alternativer tilgjengelige.

UI Automation API mangler den typiske xUnit basert format for skriving tester. En forskjell med enhetstesting er at testeren må manuelt logge suksess og nederlag. UI Automation tester er kjørt fra Automation instrument innenfor Instruments verktøy som kommer med Apples utviklerverktøy. Testene kan kjøres i iOS Simulator eller på en fysisk enhet.

3. Skrive UI Automation Tester

Trinn 1: Åpne Eksempel Project

Jeg har oppdatert prøven prosjektet brukte i forrige tutorial på iOS testing med noen ekstra brukergrensesnitt-elementer som gir noen nyttige kroker for å legge UI Automation tester. Last prosjektet fra GitHub. Åpne prosjektet og kjøre programmet for å være sikker på at alt fungerer som forventet. Du skal se et brukergrensesnitt som ligner på den som er vist nedenfor.


Før vi skrive noen tester, gjerne prøve ut prøveprogrammet til å bli kjent med sin funksjonalitet. Som bruker, kan du skrive inn tekst i tekstfeltet, og trykk på knappen for å se en etikett på skjermen som viser reversert, inputted streng

Trinn 2:. Lag en UI Automation Test

Nå som du er kjent med prøveprogrammet, er det på tide å legge en UI Automation test. UI Automation er et verktøy som kan bli funnet i Instruments. For å kjøre prøveprogrammet i Instruments, velg Product > Profil
fra Xcode meny. Velg Automatisering
fra listen over verktøy.


Den viktigste Instruments vinduet åpnes med et enkelt instrument klar til å kjøre, den Automation instrument ( Automation instrument utfører UI Automation testtilfeller). Du vil også se et område i nedre halvdel av vinduet som ser ut som en tekst editor. Dette er script editor. Det er der du vil skrive dine UI Automation tester. For denne første testen, følg instruksjonene under, og legger hver linje til skriptet i script editor.

Start med å lagre en referanse til tekstfeltet i en variabel.
Var inputField = target.frontMostApp ( ) .mainWindow () textfields () ["Input Field"];.

Angi tekst feltets verdi
inputField.setValue ("Hei");.

Kontroller at verdien ble satt vellykket og hvis det var, bestå testen. Mislykkes testen hvis det var ikke anbefale hvis (inputField.value () = "Hei"!) UIALogger.logFail ("The Input Feltet ikke var i stand til å bli satt med streng!");. Annet UIALogger.logPass ("The Input Feltet var i stand til å bli satt med streng!");

Selv om denne testen er ganske trivielt, det har verdi. Vi har nettopp skrevet en test som tester tilstedeværelsen av et tekstfelt når programmet er lansert og som tester om en tilfeldig streng kan settes som tekstfeltet verdi. Hvis du ikke tror meg, så fjern tekstfeltet fra storyboard og kjøre testen. Du vil se at det svikter.

Denne testen viser tre viktige brikker for å skrive UI Automation tester. For det første viser den hvordan du få tilgang til et enkelt brukergrensesnitt element, tekstfeltet. Spesielt vi tilgang til en ordbok av alle tekstfelt på under visning av programmet via target.frontMostApp (). MainWindow (). Textfields () og vi deretter finne tekstfeltet vi er interessert i ved å se etter en med nøkkel Input Field. Denne tasten er faktisk tilgjengeligheten etiketten av tekstfeltet. I dette tilfellet, er det definert i dreieboken. Vi kan også stille tilgjengeligheten etiketten i koden ved hjelp av accessibilityLabel eiendommen på NSObject.

Få tilgang til programmets hovedvindu, foran de fleste program, og målet er vanlig når man arbeider med UI Automation. Jeg skal vise deg hvordan du kan gjøre dette enklere og mindre detaljert senere i denne opplæringen.

For det andre viser dette at du kan samhandle med brukergrensesnittet elementene på skjermen. I så fall stiller vi tekstfeltet verdi, hermet brukeren samspill med søknaden ved å skrive inn tekst i tekstfeltet.

Og for det tredje, viser eksemplet også en teknikk for å verifisere hva som skjer i programmet. Hvis verdien er vellykket angitt, passerer testen. Hvis verdien ikke er satt, mislykkes testen

Trinn 3:. Lagre Tester

Mens du skriver tester i script editor er praktisk, blir det fort tungvint og vanskelig å vedlikeholde. Hvis du avslutter Instruments, blir eventuelle ulagrede endringer forkastet. Vi trenger å spare testene vi skriver. Bare kopier og lim inn test inn i et nytt dokument i din favoritt teksteditor og lagre det. Du kan finne de testene som er opprettet i denne opplæringen i prøven prosjekt under Jumblify /JumblifyTests /AutomationTests.js.

For å kjøre testen, velg fanen midt i ruten til høyre, ved siden av script editor, og velg Legg til > Import.


Du vil bli bedt om å velge skriptet til å importere. Naviger til den lagrede manus og importere den. Du kan fortsatt endre skriptet i script editor. Eventuelle endringer vil automatisk bli lagret i den eksterne filen du opprettet

Trinn 4:. Klikking på en knapp

La oss oppdatere vår test for å teste interaksjon med knappen. Vår test allerede legger til tekst i tekstfeltet, så vi trenger bare å legge til kode til å trykke på knappen. La oss først vurdere hvordan du finner knappen i visningen slik at den kan tappes. Det er minst tre måter å gjøre dette, og hver tilnærming har sine avveininger.

Approach en

Vi kan programma trykke en (X, Y) koordinere på skjermen. Vi gjør dette med følgende linje med kode:
target.tap ({x: 8,00, y: 50.00});

Selvfølgelig har jeg ingen anelse om de er til og med koordinatene til knappen på skjermen, og jeg kommer ikke til å bekymre seg for det, fordi denne tilnærmingen er ikke riktig verktøy for denne jobben. Jeg bare nevner det slik at du vet den finnes. Bruke springen metoden på målet å trykke på en knapp er utsatt for feil, fordi den knappen kan ikke alltid være på den spesifikke koordinere.

Approach to

Det er også mulig å finne den knappen ved å søke rekken av knappene på hovedvinduet, ligner på hvordan vi får tilgang på tekstfeltet i den første testen. I stedet for å få tilgang på knappen direkte med en nøkkel, kan vi hente en rekke knapper på hovedvinduet og hardt kode tabellindekser for å få en henvisning til knappen.
Target.frontMostApp (). MainWindow () .buttons () [0] .tap ();

Denne tilnærmingen er litt bedre. Vi er ikke hard-koding et koordinatsystem, men vi er hardkode en rekke indeks for å finne den knappen. Hvis vi måtte legge til en annen knapp på siden, kan det tilfeldigvis bryte denne testen.

Approach 3

Dette bringer meg til den tredje måten å finne den knappen på siden, ved hjelp av tilgjengelighets etiketter. Ved å bruke et tilgjengelighets etikett, kan vi få direkte tilgang til knappen bare likte vi ville finne en gjenstand i en ordbok ved hjelp av en nøkkel.
Target.frontMostApp (). MainWindow (). Knappene () ["Jumblify Button"]. trykk ();

Men hvis du legger den over linjen til manuset, og kjøre den, vil du få en feilmelding


Dette er fordi vi fristed '. t definert tilgjengeligheten etiketten for knappen ennå. For å gjøre det, flip over til Xcode og åpne prosjektets storyboard. Finn knappen i visningen og åpne Identity Inspektør på høyre side (View > Utilities > Identity Inspector). Sørg for at tilgjengelighet er aktivert og satt Etikett for knappen for å Jumblify Button.


For å kjøre testen på nytt, må du kjøre programmet fra Xcode ved å velge produkt > Kjør og deretter profilere programmet på nytt ved å velge Product > Profil. Dette kjører testene og hver test skal passere nå

Trinn 5:. Kontroller jumbled String

Som jeg nevnte tidligere, tar vår søknad en tekststreng som input, og, når brukeren kraner på knappen, viser omvendt streng. Vi må legge til enda en test for å kontrollere at strengen er riktig reversert. For å kontrollere at UILabel er befolket med riktig streng, må vi finne ut hvordan å referere til UILabel og verifisere strengen den viser. Dette er et vanlig problem når du skriver automasjons tester, det vil si å finne ut hvordan å referere et element i programmet for å gjøre en påstand på den.

Det er en metode på nesten alle objekt i UI Automation API, logElementTree. Denne metoden logger de nestede elementer av et gitt element. Dette er svært nyttig for å forstå hierarkiet av elementene i programmet og bidrar til å finne ut hvordan å målrette et bestemt element.

La oss se hvordan dette fungerer ved å logge elementet treet i hovedvinduet. Ta en titt på følgende kodelinje
target.frontMostApp () mainWindow () logElementTree ();

Legge til denne linjen i testskriptet resultater i følgende resultat:...
< p>

Som du ser, det er en UIAStaticText underelement av UIAWindow og du kan også se at den har et navn ih, som også skjer for å være snudd strengen vi må bekrefte. Nå, for å fullføre vår test, vi trenger bare å legge til kode for å få tilgang til dette elementet, og kontroller at det er til stede.

Hvorfor trenger vi bare å verifisere om UIAStaticText element er til stede?
Fordi elementets navn er reversert streng av input strengen, bekrefter sin tilstedeværelse bekrefter at strengen var riktig reversert. Hvis elementet ikke eksisterer når referert av navn-the reverseres string-så betyr det at strengen var ikke riktig reversert.
Var stringResult = target.frontMostApp (). MainWindow (). StaticTexts () ["ih" ], hvis UIALogger.logFail ("Utgangen teksten ble IKKE stilt med riktig snudd streng!") (stringResult.isValid (!)), ellers UIALogger.logPass ("! Utgangen teksten ble innstilt med korrekt snudd string");
4. Skrape overflaten

Det er så mange andre måter som en sluttbruker kan samhandle med en iOS-enhet mens du bruker appen. Dette betyr at det er mange andre måter som du kan bruke UI Automation å simulere disse interaksjoner. Snarere enn å forsøke å fange en omfattende liste av disse interaksjonene, vil jeg henvise deg til referanse dokumentasjon UI Automation.

For hver type objekt som du kan samhandle med, kan du se listen over de metoder som er tilgjengelige på dette objektet. Noen metoder er for å hente attributter om objektet mens andre er for å simulere berøring samhandling, for eksempel flickInsideWithOptions på UIAWindow.

Opptak av Session

Som du forsøke å teste mer og mer kompliserte programmer med UI automatisering, vil du finne at noen ganger er det ganske kjedelig å gjentatte ganger bruke logElementTree å finne elementet du leter etter. Dette blir også kjedelig og komplisert for applikasjoner med et komplekst syn hierarki eller navigering. I slike tilfeller kan du bruke en annen funksjon i Instruments for å spille inn et sett av brukerinteraksjon. Det som er enda kulere er at Instruments genererer UI Automation Javascript-koden som trengs for å gjengi de registrerte interaksjoner. Her er hvordan du kan prøve det ut selv.

I Instrumenter og med Automation instrument valgt, se etter på opptaksknappen nederst i vinduet.

< .no>

Hvis du klikker på opptaksknappen, vil Instruments starte et opptak som vist i skjermbildet nedenfor.


Instruments vil lansere programmet i iOS Simulator, og du vil være i stand til å samhandle med det. Instrumenter vil generere et manus basert på samhandling i sanntid. Gi det et forsøk. Roter iOS Simulator, trykk på tilfeldige steder, utføre en swipe gest, etc. Det er en veldig nyttig måte å hjelpe utforske mulighetene for UI Automation.

unngå en Monolithic Kode Base

Som du sikkert kan forutse, hvis vi fortsetter å legge mer test til test filen vi har skapt i den samme metoden, det vil raskt bli vanskelig å opprettholde. Hva kan vi gjøre for å forhindre dette. I mine tester, jeg gjøre to ting for å løse dette problemet:

En test for én funksjon: Dette innebærer at testene vi skriver må være fokusert på en bestemt del av funksjonaliteten. Jeg vil også gi den et passende navn, for eksempel testEmptyInputField

Grupperelaterte tester i én fil. Jeg er også grupperelaterte tester i samme fil. Dette holder koden i én fil håndterlig. Dette gjør det også lettere å teste separate biter av funksjonalitet ved å utføre tester i en bestemt fil. I tillegg kan du lage en master script som kaller deg funksjonene eller tester du har gruppert i andre testfiler.

I det følgende kodebiten, importerer vi en Javascript-fil, og dette gjør det funksjoner i at Javascript-fil tilgjengelig for oss.
#import "OtherTests.js"
Konklusjon

I denne opplæringen, har du lært verdien av høyere nivå testing og hvordan UI Automation kan bidra til å fylle dette gapet. Det er et annet verktøy i verktøykassen for å bidra til å sikre deg sende pålitelige og robuste programmer.

Referanser

UI Automation Javascript Reference