Advertisement
  1. Code
  2. Testing

Einführung in Testen von iOS mit UI-Automatisierung

Scroll to top
Read Time: 12 min

() translation by (you can also view the original English article)

Stellen Sie sich vor, Sie könnten Skripte schreiben, die automatisch mit Ihrer iOS-Anwendung interagieren, und die Ergebnisse überprüfen. Mit UI Automation können Sie. UI Automation ist ein von Apple bereitgestelltes Werkzeug, mit dem Sie eine höhere Teststufe für Ihre iOS-Anwendung durchführen können, als dies mit XCTest möglich ist.

1. White Box versus Black Box Testing

Vielleicht haben Sie den Vergleich von White-Box-Tests mit Black-Box-Tests im Hinblick darauf gehört, wie eine Software getestet werden kann. Wenn Sie diese Konzepten nicht kennengelernt haben, lassen Sie mich erklären, wie sie funktionieren.

White-Box-Test

Stellen Sie sich vor, in einer Box läuft eine Software. Beim White-Box-Test können Sie in die Box sehen und sich alle wichtigen Aspekte der Funktionsweise der Software ansehen. Anschließend können Sie fundierte Entscheidungen zum Testen der Software treffen. Sie können aus den von Ihnen geschriebenen Tests auch tiefere Level-Hooks in die Software einbinden.

Unit-Tests sind White-Box-Tests. Beim Schreiben von Komponententests hat der Tester detaillierten Zugriff auf den zu testenden Code. Der Tester kann tatsächlich Tests schreiben, die die zu testende Software auf Methoden- oder Einheitenebene nutzen.

In der iOS-Softwareentwicklung verwenden wir das XCTest-Framework, um diese Art von Tests durchzuführen. Schauen Sie sich ein anderes Tutorial an, das ich über die ersten Schritte mit XCTest geschrieben habe.

Black-Box-Testing

Beim Black-Box-Testing ist die Box undurchsichtig. Der Tester kann nicht in die Box sehen. Der Tester kann nicht auf die Implementierung der Codebasis zum Schreiben von Tests zugreifen und weiß nichts darüber. Stattdessen muss der Tester die Anwendung als Endbenutzer verwenden, indem er mit der Anwendung interagiert und auf ihre Antwort wartet und die Ergebnisse überprüft.

Es gibt mindestens zwei Möglichkeiten, diese Art von Tests auszuführen.

  • Ein Tester, der wiederholt und manuell eine Reihe vordefinierter Schritte ausführt und die Ergebnisse visuell überprüft.
  • Verwenden Sie spezielle Werkzeugs, um die Anwendung mit APIs zu testen, die sich ähnlich wie die Interaktion eines Menschen verhalten.

In der Entwicklung von iOS-Anwendungen bietet Apple ein Werkzeug namens UI Automation an, mit dem Black-Box-Tests durchgeführt werden können.

2. Was ist UI-Automatisierung?

UI Automation ist ein Werkzeug, das Apple zum automatisierten Testen von iOS-Anwendungen auf höherer Ebene bereitstellt und verwaltet. Tests werden in JavaScript geschrieben und entsprechen einer von Apple definierten API.

Das Schreiben von Tests kann vereinfacht werden, indem Sie sich auf Eingabehilfen für Benutzeroberflächenelemente in Ihrer Anwendung verlassen. Keine Sorge, wenn Sie diese nicht definiert haben, stehen Alternativen zur Verfügung.

Der UI-Automatisierungs-API fehlt das typische xUnit-basierte Format zum Schreiben von Tests. Ein Unterschied zum Komponententest besteht darin, dass der Tester Erfolge und Fehler manuell protokollieren muss. UI-Automatisierungstests werden über das Automatisierungsinstrument im Instrumenten-Werkzeug ausgeführt, das mit den EntwicklerWerkzeugs von Apple geliefert wird. Die Tests können im iOS-Simulator oder auf einem physischen Gerät ausgeführt werden.

3. Schreiben von UI-Automatisierungstests

Schritt 1: Öffnen Sie das Beispielprojekt

Ich habe das im vorherigen Lernprogramm zum Testen von iOS verwendete Beispielprojekt mit einigen zusätzlichen Elementen der Benutzeroberfläche aktualisiert, die einige nützliche Hooks zum Hinzufügen von UI-Automatisierungstests bieten. Laden Sie das Projekt von GitHub herunter. Öffnen Sie das Projekt und führen Sie die Anwendung aus, um sicherzustellen, dass alles wie erwartet funktioniert. Sie sollten eine Benutzeroberfläche ähnlich der unten gezeigten sehen.

Sample Application screenshotSample Application screenshotSample Application screenshot

Bevor wir Tests schreiben, können Sie die Beispielanwendung ausprobieren, um sich mit ihrer Funktionalität vertraut zu machen. Als Benutzer können Sie Text in das Textfeld eingeben und auf die Schaltfläche tippen, um eine Beschriftung auf dem Bildschirm anzuzeigen, auf der die umgekehrte, eingegebene Zeichenfolge angezeigt wird.

Schritt 2: Erstellen Sie einen UI-Automatisierungstest

Nachdem Sie mit der Beispielanwendung vertraut sind, ist es an der Zeit, einen UI-Automatisierungstest hinzuzufügen. UI Automation ist ein Werkzeug, das in Instruments zu finden ist. Um die Beispielanwendung in Instruments auszuführen, wählen Sie im Menü von Xcode Produkt > Profil. Wählen Sie Automatisierung aus der Liste der Werkzeuge.

Instrument chooser screenshotInstrument chooser screenshotInstrument chooser screenshot

Das Hauptfenster von Instruments wird mit einem einzigen betriebsbereiten Instrument, dem Automation-Instrument, geöffnet (das Automation-Instrument führt UI Automation-Testfälle aus). In der unteren Hälfte des Fensters sehen Sie außerdem einen Bereich, der wie ein Texteditor aussieht. Dies ist der Skripteditor. Hier schreiben Sie Ihre UI-Automatisierungstests. Befolgen Sie für diesen ersten Test die folgenden Anweisungen und fügen Sie jede Zeile dem Skript im Skripteditor hinzu.

Speichern Sie zunächst einen Verweis auf das Textfeld in einer Variablen.

1
var inputField = target.frontMostApp().mainWindow().textFields()["Input Field”];

Legen Sie den Wert des Textfelds fest.

1
inputField.setValue("hi”);

Stellen Sie sicher, dass der Wert erfolgreich festgelegt wurde, und bestehen Sie gegebenenfalls den Test. Bestehen Sie den Test nicht, wenn dies nicht der Fall ist.

1
if (inputField.value() != "hi") UIALogger.logFail("The Input Field was NOT able to be set with the string!");
2
else UIALogger.logPass("The Input Field was able to be set with the string!");

Während dieser Test ziemlich trivial ist, hat er Wert. Wir haben gerade einen Test geschrieben, der das Vorhandensein eines Textfelds beim Start der Anwendung testet und prüft, ob eine zufällige Zeichenfolge als Wert für das Textfeld festgelegt werden kann. Wenn Sie mir nicht glauben, entfernen Sie das Textfeld aus dem Storyboard und führen Sie den Test aus. Sie werden sehen, dass es fehlschlägt.

Dieser Test zeigt drei wichtige Teile des Schreibens von UI-Automatisierungstests. Zunächst wird gezeigt, wie Sie auf ein einfaches Benutzeroberflächenelement, das Textfeld, zugreifen. Insbesondere greifen wir über target.frontMostApp().mainWindow().textFields() auf ein Wörterbuch aller Textfelder in der Basisansicht der Anwendung zu und suchen dann das gewünschte Textfeld, indem wir nach dem mit der Schlüsseleingabe Input FIeld. Dieser Schlüssel ist eigentlich die Eingabehilfenbezeichnung des Textfelds. In diesem Fall wird es im Storyboard definiert. Wir können die Eingabehilfenbezeichnung auch im Code mithilfe der Eigenschaft accessibilityLabel in NSObject festlegen.

Der Zugriff auf das Hauptfenster der Anwendung, die vorderste Anwendung und das Ziel ist bei der Arbeit mit UI Automation üblich. Ich werde Ihnen später in diesem Tutorial zeigen, wie Sie dies einfacher und weniger ausführlich machen können.

Zweitens zeigt dies, dass Sie mit Elementen der Benutzeroberfläche auf dem Bildschirm interagieren können. In diesem Fall legen wir den Wert des Textfelds fest und ahmen den Benutzer nach, der mit der Anwendung interagiert, indem er Text in das Textfeld eingibt.

Und drittens zeigt das Beispiel auch eine Technik zum Überprüfen, was in der Anwendung passiert. Wenn der Wert erfolgreich eingestellt wurde, besteht der Test. Wenn der Wert nicht festgelegt ist, schlägt der Test fehl.

Schritt 3: Speichern von Tests

Das Schreiben von Tests im Skripteditor ist zwar praktisch, wird jedoch schnell umständlich und schwierig zu warten. Wenn Sie Instruments beenden, werden alle nicht gespeicherten Änderungen verworfen. Wir müssen die Tests speichern, die wir schreiben. Kopieren Sie einfach Ihren Test, fügen Sie ihn in ein neues Dokument in Ihrem bevorzugten Texteditor ein und speichern Sie ihn. Sie finden die in diesem Tutorial erstellten Tests im Beispielprojekt unter Jumblify/JumblifyTests/AutomationTests.js.

Um den Test auszuführen, wählen Sie die mittlere Registerkarte im Bereich rechts neben dem Skripteditor aus und wählen Sie Hinzufügen > Importieren.

Instruments screenshotInstruments screenshotInstruments screenshot

Sie werden aufgefordert, das zu importierende Skript auszuwählen. Navigieren Sie zum gespeicherten Skript und importieren Sie es. Sie können das Skript weiterhin im Skripteditor ändern. Alle Änderungen werden automatisch in der von Ihnen erstellten externen Datei gespeichert.

Schritt 4: Tippen auf eine Schaltfläche

Lassen Sie uns unseren Test aktualisieren, um die Interaktion mit der Schaltfläche zu testen. Unser Test fügt dem Textfeld bereits Text hinzu, sodass wir nur Code hinzufügen müssen, um auf die Schaltfläche zu tippen. Lassen Sie uns zunächst überlegen, wie Sie die Schaltfläche in der Ansicht finden, damit Sie darauf tippen können. Es gibt mindestens drei Möglichkeiten, dies zu erreichen, und jeder Ansatz hat seine Nachteile.

Ansatz 1

Wir können programmgesteuert auf eine (X, Y) -Koordinate auf dem Bildschirm tippen. Wir machen das mit der folgenden Codezeile:

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

Natürlich habe ich keine Ahnung, ob dies überhaupt die Koordinaten der Schaltfläche auf dem Bildschirm sind, und ich werde mir darüber keine Sorgen machen, da dieser Ansatz nicht das richtige Werkzeug für diesen Job ist. Ich erwähne es nur, damit Sie wissen, dass es existiert. Die Verwendung der tap-Methode auf das target zum Tippen auf eine Schaltfläche ist fehleranfällig, da sich diese Schaltfläche möglicherweise nicht immer an dieser bestimmten Koordinate befindet.

Ansatz 2

Es ist auch möglich, die Schaltfläche zu finden, indem Sie die Schaltflächen des Hauptfensters durchsuchen, ähnlich wie wir im ersten Test auf das Textfeld zugegriffen haben. Anstatt direkt mit einem Schlüssel auf die Schaltfläche zuzugreifen, können wir ein Array von Schaltflächen im Hauptfenster abrufen und einen Array-Index fest codieren, um einen Verweis auf die Schaltfläche zu erhalten.

1
target.frontMostApp().mainWindow().buttons()[0].tap();

Dieser Ansatz ist etwas besser. Wir codieren keine Koordinate fest, aber wir codieren einen Array-Index fest, um die Schaltfläche zu finden. Wenn wir zufällig eine weitere Schaltfläche auf der Seite hinzufügen, wird dieser Test möglicherweise versehentlich abgebrochen.

Ansatz 3

Dies bringt mich zum dritten Weg, um die Schaltfläche auf der Seite mithilfe von Eingabehilfen zu finden. Mithilfe eines Barrierefreiheits-Labels können wir direkt auf die Schaltfläche zugreifen, die uns gefällt, wenn wir mit einem Schlüssel ein Objekt in einem Wörterbuch finden würden.

1
target.frontMostApp().mainWindow().buttons()["Jumblify Button"].tap();

Wenn Sie jedoch die obige Zeile zum Skript hinzufügen und ausführen, wird eine Fehlermeldung angezeigt.

Instruments Error Message ScreenshotInstruments Error Message ScreenshotInstruments Error Message Screenshot

Dies liegt daran, dass wir die Barrierefreiheitsbezeichnung für die Schaltfläche noch nicht definiert haben. Wechseln Sie dazu zu Xcode und öffnen Sie das Storyboard des Projekts. Suchen Sie die Schaltfläche in der Ansicht und öffnen Sie rechts den Identitätsinspektor (Ansicht > Dienstprogramme > Identitätsinspektor). Stellen Sie sicher, dass die Barrierefreiheit aktiviert ist, und setzen Sie die Beschriftung für die Schaltfläche auf die Schaltfläche Durcheinander.

Interface Builder Accessibility Inspector ScreenshotInterface Builder Accessibility Inspector ScreenshotInterface Builder Accessibility Inspector Screenshot

Um den Test erneut auszuführen, müssen Sie die Anwendung über Xcode ausführen, indem Sie Produkt > Ausführen auswählen, und dann die Anwendung erneut profilieren, indem Sie Produkt > Profil auswählen. Dadurch werden die Tests ausgeführt und jeder Test sollte jetzt bestanden werden.

Schritt 5: Überprüfen Sie die durcheinandergebrachte Zeichenfolge

Wie bereits erwähnt, verwendet unsere Anwendung eine Textzeichenfolge als Eingabe und zeigt beim Tippen auf die Schaltfläche die umgekehrte Zeichenfolge an. Wir müssen einen weiteren Test hinzufügen, um zu überprüfen, ob die Eingabezeichenfolge ordnungsgemäß umgekehrt ist. Um zu überprüfen, ob das UILabel mit der richtigen Zeichenfolge gefüllt ist, müssen wir herausfinden, wie auf das UILabel verwiesen wird, und die angezeigte Zeichenfolge überprüfen. Dies ist ein häufiges Problem beim Schreiben von Automatisierungstests, dh beim Herausfinden, wie auf ein Element in der Anwendung verwiesen wird, um eine Aussage darüber zu treffen.

Für fast jedes Objekt in der UI-Automatisierungs-API gibt es die Methode logElementTree. Diese Methode protokolliert die verschachtelten Elemente eines bestimmten Elements. Dies ist sehr nützlich, um die Hierarchie der Elemente in der Anwendung zu verstehen und um herauszufinden, wie ein bestimmtes Element als Ziel ausgewählt werden soll.

Lassen Sie uns sehen, wie dies funktioniert, indem Sie den Elementbaum des Hauptfensters protokollieren. Schauen Sie sich die folgende Codezeile an.

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

Das Hinzufügen dieser Zeile zum Testskript führt zu der folgenden Ausgabe:

Instruments logElementTree screenshotInstruments logElementTree screenshotInstruments logElementTree screenshot

Wie Sie sehen können, gibt es ein UIAStaticText-Unterelement des UIAWindow, und Sie können auch sehen, dass es den Namen ih hat, was auch die umgekehrte Zeichenfolge ist, die wir überprüfen müssen. Um unseren Test abzuschließen, müssen wir nur noch Code hinzufügen, um auf dieses Element zuzugreifen und zu überprüfen, ob es vorhanden ist.

Warum müssen wir nur überprüfen, ob das UIAStaticText-Element vorhanden ist? Da der Name des Elements die umgekehrte Zeichenfolge der Eingabezeichenfolge ist, wird durch Überprüfen der Anwesenheit bestätigt, dass die Zeichenfolge korrekt umgekehrt wurde. Wenn das Element nicht existiert, wenn es mit dem Namen referenziert wird - der umgekehrten Zeichenfolge -, bedeutet dies, dass die Zeichenfolge nicht korrekt umgekehrt wurde.

1
var stringResult = target.frontMostApp().mainWindow().staticTexts()["ih"];
2
if (! stringResult.isValid()) UIALogger.logFail("The output text was NOT set with the correctly reversed string!");
3
else UIALogger.logPass("The output text was set with the correctly reversed string!");

4. Kratzen der Oberfläche

Es gibt so viele andere Möglichkeiten, wie ein Endbenutzer mit einem iOS-Gerät interagieren kann, während er Ihre App verwendet. Dies bedeutet, dass Sie die UI-Automatisierung auf viele andere Arten simulieren können. Anstatt zu versuchen, eine umfassende Liste dieser Interaktionen zu erfassen, verweise ich Sie auf die Referenzdokumentation zur UI-Automatisierung.

Für jeden Objekttyp, mit dem Sie interagieren können, können Sie die Liste der für dieses Objekt verfügbaren Methoden anzeigen. Einige Methoden dienen zum Abrufen von Attributen über das Objekt, während andere zum Simulieren der Berührungsinteraktion dienen, z. B. flickInsideWithOptions in UIAWindow.

Eine Sitzung aufzeichnen

Wenn Sie versuchen, immer kompliziertere Apps mit UI Automation zu testen, werden Sie feststellen, dass es manchmal ziemlich mühsam ist, logElementTree wiederholt zu verwenden, um das gesuchte Element zu finden. Dies wird auch für Anwendungen mit einer komplexen Ansichtshierarchie oder Navigation mühsam und komplex. In diesen Fällen können Sie eine andere Funktion von Instrumenten verwenden, um eine Reihe von Benutzerinteraktionen aufzuzeichnen. Noch cooler ist, dass Instruments den JavaScript-Code für die UI-Automatisierung generiert, der zur Reproduktion der aufgezeichneten Interaktionen benötigt wird. So können Sie es selbst ausprobieren.

Suchen Sie unter Instrumente und bei ausgewähltem Automatisierungsinstrument nach der Aufnahmetaste am unteren Rand des Fensters.

Instruments screenshot showing record buttonInstruments screenshot showing record buttonInstruments screenshot showing record button

Wenn Sie auf die Aufnahmetaste klicken, startet Instruments eine Aufnahmesitzung, wie im folgenden Screenshot gezeigt.

Instruments Screenshot showing capture in progressInstruments Screenshot showing capture in progressInstruments Screenshot showing capture in progress

Instruments startet Ihre Anwendung im iOS-Simulator und Sie können mit ihr interagieren. Instruments generiert ein Skript basierend auf Ihren Interaktionen in Echtzeit. Versuche es. Drehen Sie den iOS-Simulator, tippen Sie auf zufällige Stellen, führen Sie eine Wischgeste aus usw. Dies ist eine sehr nützliche Methode, um die Möglichkeiten der UI-Automatisierung zu erkunden.

Vermeiden einer monolithischen Codebasis

Wie Sie wahrscheinlich vorhersehen können, wird die Wartung schnell schwierig, wenn wir der Testdatei, die wir mit derselben Methode erstellt haben, weitere Tests hinzufügen. Was können wir tun, um dies zu verhindern? In meinen Tests mache ich zwei Dinge, um dieses Problem zu lösen:

  • Ein Test für eine Funktion: Dies bedeutet, dass sich die von uns geschriebenen Tests auf eine bestimmte Funktionalität konzentrieren müssen. Ich werde ihm sogar einen passenden Namen geben, wie zum Beispiel testEmptyInputField.
  • Gruppieren Sie verwandte Tests in einer Datei: Ich gruppiere auch verwandte Tests in derselben Datei. Dadurch bleibt der Code in einer Datei verwaltbar. Dies erleichtert auch das Testen einzelner Funktionen, indem die Tests in einer bestimmten Datei ausgeführt werden. Darüber hinaus können Sie ein Masterskript erstellen, in dem Sie die Funktionen oder Tests aufrufen, die Sie in anderen Testdateien gruppiert haben.

Im folgenden Codefragment importieren wir eine JavaScript-Datei, wodurch uns die Funktionen in dieser JavaScript-Datei zur Verfügung stehen.

1
#import “OtherTests.js”

Abschluss

In diesem Tutorial haben Sie gelernt, wie wichtig das Testen auf höherer Ebene ist und wie die UI-Automatisierung dazu beitragen kann, diese Lücke zu schließen. Es ist ein weiteres Werkzeug in Ihrer Werkzeugbox, mit dem Sie zuverlässige und robuste Anwendungen versenden können.

Verweise

JavaScript-Referenz zur UI-Automatisierung

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.