Inleiding tot het testen van iOS met UI-automatisering

apr 17, 2021
admin

Stelt u zich eens voor dat u scripts kunt schrijven die automatisch interactief zijn met uw iOS-applicatie en dat u de resultaten kunt verifiëren. Met UI-automatisering kun je dat. UI-automatisering is een hulpmiddel van Apple waarmee u uw iOS-toepassing op een hoger niveau kunt testen dan met XCTest mogelijk is.

1. White Box versus Black Box Testing

U heeft misschien wel eens de vergelijking gehoord van white box testing versus black box testing met betrekking tot hoe men een stuk software zou kunnen testen. Als u niet bekend bent met deze concepten, zal ik u uitleggen hoe ze werken.

White Box Testing

Stelt u zich eens voor dat er een stuk software in een doos draait. Met white box testing, kun je in de doos kijken en alle details van hoe de software werkt bekijken, en dan kun je gefundeerde beslissingen nemen over hoe de software te testen. Je kunt ook op een dieper niveau in de software inhaken vanuit de tests die je schrijft.

Unit testen is white box testen. Bij het schrijven van unit tests, heeft de tester fijnkorrelige toegang tot de geteste code. De tester kan in feite tests schrijven die gebruik maken van de geteste software op methode, of unit, niveau.

In iOS software ontwikkeling gebruiken we het XCTest framework om dit type testen uit te voeren. Kijk eens naar een andere tutorial die ik heb geschreven over het aan de slag gaan met XCTest.

Black Box Testing

Bij black box testing is de doos ondoorzichtig. De tester kan niet in de doos kijken. De tester heeft geen toegang tot en weet niets over de implementatie van de code base om tests te schrijven. In plaats daarvan wordt de tester gedwongen de applicatie te gebruiken zoals een eindgebruiker dat zou doen door interactie met de applicatie en te wachten op de respons, waarbij de resultaten worden geverifieerd.

Er zijn ten minste twee manieren om dit type testen uit te voeren.

  • Een tester die herhaaldelijk en handmatig een aantal vooraf gedefinieerde stappen uitvoert en de resultaten visueel verifieert.
  • Gebruik gespecialiseerde tools om de applicatie te testen met API’s die zich gedragen vergelijkbaar met hoe een mens interacteert.

In iOS applicatie ontwikkeling, biedt Apple een tool genaamd UI Automation om black box testing uit te voeren.

2. Wat is UI Automation?

UI-automatisering is een tool die Apple levert en onderhoudt voor het op hoger niveau geautomatiseerd testen van iOS-applicaties. Tests worden geschreven in JavaScript, waarbij een door Apple gedefinieerde API wordt gevolgd.

Het schrijven van tests kan eenvoudiger worden gemaakt door te vertrouwen op toegankelijkheidslabels voor gebruikersinterface-elementen in uw applicatie. Maak je echter geen zorgen, als je deze niet hebt gedefinieerd, zijn er alternatieven beschikbaar.

De UI Automation API mist de typische op xUnit gebaseerde indeling voor het schrijven van tests. Een verschil met unit testen is dat de tester handmatig succes en mislukkingen moet loggen. UI Automation tests worden uitgevoerd vanuit het Automation instrument binnen het Instruments tool dat wordt geleverd met Apple’s ontwikkelaarstools. De tests kunnen worden uitgevoerd in de iOS-simulator of op een fysiek apparaat.

3. UI-automatiseringstests schrijven

Stap 1: Open het voorbeeldproject

Ik heb het voorbeeldproject dat in de vorige tutorial over iOS-tests is gebruikt, bijgewerkt met enkele extra gebruikersinterface-elementen die een aantal nuttige haken bieden voor het toevoegen van UI-automatiseringstests. Download het project van GitHub. Open het project en voer de applicatie uit om er zeker van te zijn dat alles werkt zoals verwacht. U zou een gebruikersinterface moeten zien die lijkt op degene die hieronder wordt weergegeven.

Voordat we tests schrijven, kunt u de voorbeeldapplicatie uitproberen om vertrouwd te raken met de functionaliteit. Als gebruiker kunt u tekst in het tekstveld invoeren en op de knop tikken om een label op het scherm te zien dat de omgekeerde, ingevoerde tekenreeks weergeeft.

Stap 2: Maak een UI-automatiseringstest

Nu u bekend bent met de voorbeeldapplicatie, is het tijd om een UI-automatiseringstest toe te voegen. UI Automation is een tool die kan worden gevonden in Instruments. Om de voorbeeldapplicatie in Instruments uit te voeren, selecteert u Product > Profile in het menu van Xcode. Selecteer Automation (Automatisering) in de lijst met tools.

Het hoofdvenster van Instruments (Instrumenten) wordt geopend met één instrument dat klaar is om te worden uitgevoerd, het Automation-instrument (het Automation-instrument voert UI Automation-testcases uit). Je zult ook een gebied zien in de onderste helft van het venster dat lijkt op een tekst editor. Dit is de script editor. Dit is waar je je UI Automation tests zult schrijven. Voor deze eerste test volgt u de onderstaande instructies, waarbij u elke regel toevoegt aan het script in de script editor.

Begin met het opslaan van een referentie naar het tekstveld in een variabele.

var inputField = target.frontMostApp().mainWindow().textFields();

Stel de waarde van het tekstveld in.

inputField.setValue("hi");

Controleer of de waarde met succes is ingesteld en, als dat het geval is, slaagt u voor de test. Mislukt de test als dat niet het geval was.

Hoewel deze test tamelijk triviaal is, heeft hij wel degelijk waarde. We hebben zojuist een test geschreven die de aanwezigheid van een tekstveld test wanneer de applicatie wordt gestart en die test of een willekeurige string kan worden ingesteld als de waarde van het tekstveld. Als je me niet gelooft, verwijder dan het tekstveld uit het storyboard en voer de test uit. Je zult zien dat hij faalt.

Deze test demonstreert drie belangrijke onderdelen van het schrijven van UI Automation tests. Ten eerste, het laat zien hoe je toegang krijgt tot een eenvoudig gebruikers interface element, het tekst veld. Om precies te zijn, we hebben toegang tot een woordenboek van alle tekstvelden op de basisweergave van de applicatie via target.frontMostApp().mainWindow().textFields() en we vinden dan het tekstveld waarin we geïnteresseerd zijn door te zoeken naar het veld met sleutel Input Field. Deze sleutel is eigenlijk het toegankelijkheidslabel van het tekstveld. In dit geval is het gedefinieerd in het storyboard. We kunnen het toegankelijkheidslabel ook in code instellen met behulp van de accessibilityLabel property op NSObject.

Toegang tot het hoofdvenster van de applicatie, de meest vooraanstaande applicatie, en het doel zijn gebruikelijk bij het werken met UI Automation. Ik zal je later in deze tutorial laten zien hoe je dit eenvoudiger en minder omslachtig kunt maken.

Ten tweede, dit laat je zien dat je kunt interageren met user interface elementen op het scherm. In dit geval stellen we de waarde van het tekstveld in, waarmee we de interactie van de gebruiker met de toepassing nabootsen door tekst in het tekstveld in te voeren.

En ten derde toont het voorbeeld ook een techniek om te controleren wat er in de toepassing gebeurt. Als de waarde met succes wordt ingesteld, slaagt de test. Als de waarde niet wordt ingesteld, mislukt de test.

Stap 3: Tests opslaan

Hoewel het schrijven van tests in de scripteditor handig is, wordt het al snel omslachtig en moeilijk te onderhouden. Als u Instruments verlaat, worden alle niet-opgeslagen wijzigingen weggegooid. We moeten de tests die we schrijven opslaan. Kopieer en plak uw test in een nieuw document in uw favoriete teksteditor en sla het op. U kunt de tests die in deze tutorial zijn gemaakt, vinden in het voorbeeldproject onder Jumblify/JumblifyTests/AutomationTests.js.

Om de test uit te voeren, selecteert u het middelste tabblad in het deelvenster aan de rechterkant, naast de scripteditor, en selecteert u Add > Import.

U wordt gevraagd het te importeren script te selecteren. Navigeer naar het opgeslagen script en importeer het. U kunt het script nog wijzigen in de scripteditor. Alle wijzigingen worden automatisch opgeslagen in het externe bestand dat u hebt gemaakt.

Stap 4: Tikken op een knop

Laten we onze test bijwerken om de interactie met de knop te testen. Onze test voegt al tekst toe aan het tekstveld, dus we hoeven alleen maar code toe te voegen om op de knop te tikken. Laten we eerst eens kijken hoe we de knop in de view kunnen vinden zodat er op getikt kan worden. Er zijn ten minste drie manieren om dit te doen en elke aanpak heeft zijn nadelen.

Aanpak 1

We kunnen programmatisch op een (X, Y) coördinaat op het scherm tikken. Dat doen we met de volgende regel code:

target.tap({x: 8.00, y: 50.00});

Natuurlijk heb ik geen idee of dat wel de coördinaten van de knop op het scherm zijn en daar ga ik me ook niet druk over maken, want deze aanpak is niet het juiste gereedschap voor deze klus. Ik vermeld het alleen zodat je weet dat het bestaat. Het gebruik van de methode tap op target om een knop aan te tikken is foutgevoelig, omdat die knop zich niet altijd op dat specifieke coördinaat bevindt.

Aanpak 2

Het is ook mogelijk om de knop te vinden door de array van knoppen van het hoofdvenster te doorzoeken, vergelijkbaar met de manier waarop we het tekstveld in de eerste test hebben benaderd. In plaats van de knop rechtstreeks met een toets te benaderen, kunnen we een array van knoppen in het hoofdvenster ophalen en een array-index hard coderen om een verwijzing naar de knop te krijgen.

target.frontMostApp().mainWindow().buttons().tap();

Deze aanpak is een beetje beter. We coderen niet hard een coördinaat, maar we coderen hard een array index om de knop te vinden. Als we toevallig een andere knop op de pagina toevoegen, kan dat deze test per ongeluk breken.

Aanpak 3

Dit brengt me bij de derde manier om de knop op de pagina te vinden, met behulp van toegankelijkheidslabels. Door een toegankelijkheidslabel te gebruiken, kunnen we de knop direct benaderen, net zoals we een object in een woordenboek zouden vinden met behulp van een sleutel.

target.frontMostApp().mainWindow().buttons().tap();

Als je echter de bovenstaande regel aan het script toevoegt en het uitvoert, krijg je een foutmelding.

Dit komt omdat we het toegankelijkheidslabel voor de knop nog niet hebben gedefinieerd. Om dat te doen, ga je naar Xcode en open je het storyboard van het project. Zoek de knop in de view en open de Identity Inspector aan de rechterkant (View > Utilities > Identity Inspector). Zorg ervoor dat Toegankelijkheid is ingeschakeld en stel het Label voor de knop in op Jumblify Button.

Om de test opnieuw uit te voeren, moet u de toepassing vanuit Xcode uitvoeren door Product > Uitvoeren te selecteren en vervolgens de toepassing opnieuw te profileren door Product > Profiel te selecteren. Dit voert de tests uit en elke test zou nu moeten slagen.

Stap 5: Controleer de verwarde tekenreeks

Zoals ik al eerder zei, neemt onze applicatie een tekenreeks als invoer, en wanneer de gebruiker op de knop tikt, wordt de omgekeerde tekenreeks weergegeven. We moeten nog een test toevoegen om te controleren of de ingevoerde string correct is omgedraaid. Om te controleren of de UILabel gevuld is met de juiste string, moeten we uitzoeken hoe we naar de UILabel kunnen verwijzen en de string die het weergeeft kunnen controleren. Dit is een veel voorkomend probleem bij het schrijven van automatiseringstests, namelijk het uitzoeken hoe naar een element in de applicatie kan worden verwezen om er een bewering over te doen.

Er is een methode op bijna elk object in de UI Automation API, logElementTree. Deze methode logt de geneste elementen van een gegeven element. Dit is zeer nuttig om de hiërarchie van elementen in de toepassing te begrijpen en helpt bij het uitzoeken hoe een specifiek element moet worden getarget.

Laten we eens zien hoe dit werkt door de elementenboom van het hoofdvenster te loggen. Kijk eens naar de volgende regel code.

target.frontMostApp().mainWindow().logElementTree();

Het toevoegen van deze regel aan het testscript resulteert in de volgende uitvoer:

Zoals u kunt zien, is er een UIAStaticText subelement van de UIAWindow en u kunt ook zien dat het een naam heeft van ih, wat toevallig ook de omgedraaide string is die we moeten controleren. Om onze test te voltooien, hoeven we alleen maar code toe te voegen om dit element te benaderen en te controleren of het aanwezig is.

Waarom hoeven we alleen maar te controleren of het UIAStaticText element aanwezig is? Omdat de naam van het element de omgekeerde string is van de input string, bevestigt de controle van de aanwezigheid ervan dat de string correct werd omgekeerd. Als het element niet bestaat wanneer er naar verwezen wordt met de naam – de omgekeerde string – dan betekent dit dat de string niet correct is omgekeerd.

4. Kras op de oppervlakte

Er zijn zoveel andere manieren waarop een eindgebruiker kan communiceren met een iOS-apparaat tijdens het gebruik van uw app. Dit betekent dat er vele andere manieren zijn waarop u UI Automatisering kunt gebruiken om deze interacties te simuleren. In plaats van te proberen een uitgebreide lijst van deze interacties vast te leggen, zal ik je verwijzen naar de UI Automation referentie documentatie.

Voor elk type object waarmee je kunt interacteren, kun je de lijst van methoden bekijken die beschikbaar zijn op dat object. Sommige methoden zijn voor het ophalen van attributen over het object, terwijl andere voor het simuleren van touch interactie zijn, zoals flickInsideWithOptions op UIAWindow.

Opnemen van een Sessie

Als u probeert meer en meer gecompliceerde apps te testen met UI Automation, zult u merken dat het soms behoorlijk vervelend is om herhaaldelijk logElementTree te gebruiken om het element te vinden waarnaar u op zoek bent. Dit wordt ook vervelend en complex voor applicaties met een complexe view hiërarchie of navigatie. In deze gevallen kun je een andere functie van Instruments gebruiken om een reeks gebruikersinteracties vast te leggen. Wat nog cooler is, is dat Instruments de UI Automation JavaScript code genereert die nodig is om de opgenomen interacties te reproduceren. Zo kun je het zelf uitproberen.

In Instruments en met het Automation-instrument geselecteerd, zoek je naar de opnameknop onder in het venster.

Als je op de opnameknop klikt, start Instruments een opnamesessie zoals te zien is in de schermafbeelding hieronder.

Instruments start je applicatie in de iOS-simulator en je kunt er interactie mee hebben. Instruments genereert een script gebaseerd op uw interacties in real time. Probeer het maar eens. Draai de iOS Simulator, tik op willekeurige plaatsen, maak een veegbeweging, etc. Het is echt een handige manier om de mogelijkheden van UI-automatisering te verkennen.

Vermijd een monolithische codebasis

Zoals u waarschijnlijk kunt voorzien, wordt het al snel moeilijk te onderhouden als we steeds meer tests toevoegen aan het testbestand dat we in dezelfde methode hebben gemaakt. Wat kunnen we doen om dat te voorkomen. In mijn tests doe ik twee dingen om dit probleem op te lossen:

  • Eén test voor één functie: Dit houdt in dat de tests die we schrijven gericht moeten zijn op een specifiek stukje functionaliteit. Ik geef het zelfs een toepasselijke naam, zoals testEmptyInputField.
  • Groepeer gerelateerde tests in één bestand: Ik groepeer ook gerelateerde tests in hetzelfde bestand. Dit houdt de code in één bestand beheersbaar. Dit maakt het ook makkelijker om afzonderlijke stukken functionaliteit te testen door de tests in een specifiek bestand uit te voeren. Bovendien kunt u een masterscript maken waarin u de functies of tests aanroept die u in andere testbestanden hebt gegroepeerd.

In het volgende codefragment importeren we een JavaScript-bestand en dit maakt de functies in dat JavaScript-bestand voor ons beschikbaar.

#import "OtherTests.js"

Conclusie

In deze tutorial hebt u geleerd wat de waarde is van tests op een hoger niveau en hoe UI-automatisering kan helpen om dat gat te vullen. Het is een extra tool in uw gereedschapskist om ervoor te zorgen dat u betrouwbare en robuuste applicaties levert.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.