Stellen Sie sich vor, Sie könnten Skripts schreiben, die automatisch mit Ihrer iOS-Anwendung interagieren und die Ergebnisse überprüfen können. Mit UI Automation können Sie. Die UI-Automatisierung ist ein von Apple bereitgestelltes Tool, mit dem Sie Ihre iOS-Anwendung über das mit XCTest erreichbare Niveau hinaus testen können.
Sie haben vielleicht den Vergleich von White-Box-Tests mit Black-Box-Tests in Bezug auf den Test einer Software gehört. Wenn Sie mit diesen Konzepten nicht vertraut sind, lassen Sie mich erklären, wie sie funktionieren.
Stellen Sie sich vor, in einer Box läuft eine Software. Mit dem White-Box-Test können Sie in die Box schauen und sich alle wichtigen Details der Software ansehen. Anschließend können Sie fundierte Entscheidungen zum Testen der Software treffen. Sie können auch tiefer gehende Ebenen in die Software einbinden, wenn Sie die Tests schreiben.
Unit-Tests sind White-Box-Tests. Beim Schreiben von Unit-Tests hat der Tester einen feinkörnigen Zugriff auf den zu testenden Code. Der Tester kann tatsächlich Tests schreiben, die die zu testende Software auf Methoden- oder Einheitenebene nutzen.
Bei der iOS-Softwareentwicklung verwenden wir die XCTest Rahmen für diese Art von Tests. Sehen Sie sich ein anderes Tutorial an, das ich über die ersten Schritte mit XCTest geschrieben habe.
Im Black-Box-Test 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ß nicht. Stattdessen ist der Tester gezwungen, die Anwendung als Endbenutzer zu verwenden, indem er mit der Anwendung interagiert und auf seine Antwort wartet, um die Ergebnisse zu überprüfen.
Es gibt mindestens zwei Möglichkeiten, diese Art von Tests auszuführen.
Bei der iOS-Anwendungsentwicklung stellt Apple ein Werkzeug bereit UI-Automatisierung Black-Box-Tests durchführen.
Die UI-Automatisierung ist ein Tool, das Apple für automatisierte Tests 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 für Elemente der Benutzeroberfläche in Ihrer Anwendung Zugriffskennzeichnungen verwenden. Keine Sorge, wenn Sie diese nicht definiert haben, gibt es Alternativen.
Der UI-Automatisierungs-API fehlt das typische xUnit-basierte Format zum Schreiben von Tests. Ein Unterschied beim Gerätetest ist, dass der Tester Erfolg und Fehler manuell protokollieren muss. UI-Automatisierungstests werden vom Automatisierungsinstrument aus ausgeführt Instrumente Werkzeug, das mit den Entwicklerwerkzeugen von Apple geliefert wird. Die Tests können im iOS-Simulator oder auf einem physischen Gerät ausgeführt werden.
Ich habe das im vorherigen Tutorial verwendete Beispielprojekt für iOS-Tests mit einigen zusätzlichen Benutzeroberflächenelementen aktualisiert, die einige nützliche Hooks zum Hinzufügen von UI-Automatisierungstests bereitstellen. 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 sehen, die der unten gezeigten ähnelt.
Bevor wir Tests schreiben, testen Sie die Beispielanwendung, 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, in der die umgekehrte eingegebene Zeichenfolge angezeigt wird.
Nun, da Sie mit der Beispielanwendung vertraut sind, ist es Zeit, einen UI-Automatisierungstest hinzuzufügen. Die Benutzeroberflächenautomatisierung ist ein Tool, das Sie in finden können Instrumente. Um die Beispielanwendung in Instruments auszuführen, wählen Sie Produkt> Profil aus dem Xcode-Menü. Wählen Automatisierung aus der Liste der Werkzeuge.
Das Hauptinstrument-Fenster wird mit einem einzigen Instrument geöffnet, das betriebsbereit ist, das Automatisierungsinstrument (das Automatisierungsinstrument führt UI-Automatisierungs-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. Für diesen ersten Test folgen Sie den Anweisungen unten und fügen Sie jede Zeile zum Skript im Skript-Editor hinzu.
Speichern Sie zunächst einen Verweis auf das Textfeld in einer Variablen.
var inputField = target.frontMostApp (). mainWindow (). textFields () ["Eingabefeld"];
Legen Sie den Wert des Textfelds fest.
inputField.setValue ("hi");
Stellen Sie sicher, dass der Wert erfolgreich festgelegt wurde, und bestehen Sie den Test, falls dies der Fall war. Den Test nicht bestehen, wenn es nicht war.
if (inputField.value ()! = "hi") UIALogger.logFail ("Das Eingabefeld konnte NICHT mit der Zeichenfolge gesetzt werden!"); else UIALogger.logPass ("Das Eingabefeld konnte mit der Zeichenfolge gesetzt werden!");
Dieser Test ist zwar ziemlich unbedeutend, hat aber einen 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 des Textfelds 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 demonstriert drei wichtige Teile der UI-Automatisierungstests. Zunächst wird erläutert, wie Sie auf ein einfaches Benutzeroberflächenelement, das Textfeld, zugreifen. Konkret greifen wir über ein Wörterbuch aller Textfelder in der Basisansicht der Anwendung über zu target.frontMostApp (). mainWindow (). textFields ()
und dann finden wir das Textfeld, das uns interessiert, indem wir nach dem mit Schlüssel suchen Eingabefeld
. Dieser Schlüssel ist eigentlich die Eingabehilfe des Textfelds. In diesem Fall wird es im Storyboard definiert. Wir können das Accessibility-Label auch mit dem Code im Code setzen accessibilityLabel
Eigentum an NSObject
.
Bei der Arbeit mit der Benutzeroberflächenautomatisierung wird häufig auf das Hauptfenster der Anwendung, die vorderste Anwendung und das Ziel zugegriffen. Ich werde Ihnen zeigen, wie Sie dies später in diesem Tutorial einfacher und weniger ausführlich machen.
Zweitens zeigt dies Ihnen, 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, um zu überprüfen, was in der Anwendung passiert. Wenn der Wert erfolgreich eingestellt wurde, ist der Test erfolgreich. Wenn der Wert nicht festgelegt ist, schlägt der Test fehl.
Das Schreiben von Tests im Skripteditor ist zwar bequem, wird jedoch schnell umständlich und lässt sich nur schwer warten. Wenn Sie Instruments beenden, werden alle nicht gespeicherten Änderungen verworfen. Wir müssen die Tests speichern, die wir schreiben. Kopieren Sie Ihren Test einfach in ein neues Dokument in Ihrem bevorzugten Texteditor und speichern Sie ihn. Die in diesem Tutorial erstellten Tests finden Sie im Beispielprojekt unter Jumblify / JumblifyTests / AutomationTests.js.
Wählen Sie zum Ausführen des Tests die mittlere Registerkarte im rechten Bereich neben dem Skripteditor aus, und wählen Sie aus Hinzufügen> Importieren.
Sie werden aufgefordert, das zu importierende Skript auszuwählen. Navigieren Sie zu dem 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.
Lassen Sie uns unseren Test aktualisieren, um die Interaktion mit der Schaltfläche zu testen. Unser Test fügt bereits Text in das Textfeld ein, so dass wir nur noch Code hinzufügen müssen, um die Schaltfläche zu berühren. 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.
Wir können programmatisch eine (X, Y) -Koordinate auf dem Bildschirm antippen. Wir machen dies mit der folgenden Codezeile:
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 mache mir darüber keine Sorgen, da dieser Ansatz nicht das richtige Werkzeug für diesen Job ist. Ich erwähne es nur, damit Sie wissen, dass es existiert. Verwendung der Zapfhahn
Methode auf Ziel
Ein Tippen auf eine Schaltfläche ist fehleranfällig, da sich diese Schaltfläche möglicherweise nicht immer an dieser bestimmten Koordinate befindet.
Sie können die Schaltfläche auch finden, indem Sie die Anordnung der Schaltflächen des Hauptfensters durchsuchen, ähnlich wie beim ersten Test auf das Textfeld zugegriffen wurde. Anstatt auf die Schaltfläche direkt mit einer Taste zuzugreifen, können wir ein Array von Schaltflächen im Hauptfenster abrufen und einen Arrayindex fest codieren, um eine Referenz auf die Schaltfläche zu erhalten.
target.frontMostApp (). mainWindow (). buttons () [0] .tap ();
Dieser Ansatz ist etwas besser. Wir codieren keine Koordinaten hart, aber wir codieren einen Array-Index hart, um die Schaltfläche zu finden. Wenn wir auf der Seite eine weitere Schaltfläche hinzufügen, kann dieser Test versehentlich abgebrochen werden.
Dies bringt mich zur dritten Möglichkeit, die Schaltfläche auf der Seite mithilfe von Eingabehilfen zu finden. Durch die Verwendung eines Eingabehilfekennzeichens können wir direkt auf die Schaltfläche zugreifen, und zwar so, als würden wir ein Objekt in einem Wörterbuch mit einem Schlüssel finden.
target.frontMostApp (). mainWindow (). buttons () ["Jumblify Button"]. tap ();
Wenn Sie dem Skript jedoch die obige Zeile hinzufügen und ausführen, wird eine Fehlermeldung angezeigt.
Dies liegt daran, dass wir noch nicht die Eingabehilfe für die Schaltfläche definiert haben. Wechseln Sie dazu zu Xcode und öffnen Sie das Storyboard des Projekts. Suchen Sie den Button in der Ansicht und öffnen Sie die Identitätsinspektor zur Rechten (Ansicht> Dienstprogramme> Identitätsinspektor). Sicher gehen, dass Zugänglichkeit ist aktiviert und setzt das Etikette für den Button zu Jumblify-Taste.
Um den Test erneut auszuführen, müssen Sie die Anwendung von Xcode aus ausführen, indem Sie auswählen Produkt > Lauf und profilieren Sie die Anwendung dann erneut, indem Sie auswählen Produkt > Profil. Dadurch werden die Tests ausgeführt und jeder Test sollte jetzt bestanden werden.
Wie bereits erwähnt, verwendet unsere Anwendung eine Textzeichenfolge als Eingabe. Wenn der Benutzer auf die Schaltfläche tippt, wird die umgekehrte Zeichenfolge angezeigt. Wir müssen einen weiteren Test hinzufügen, um zu überprüfen, ob die Eingabezeichenfolge ordnungsgemäß umgekehrt ist. Um das zu überprüfen UILabel
mit der richtigen Zeichenfolge gefüllt ist, müssen wir herausfinden, wie auf die Zeichenfolge verwiesen wird UILabel
und überprüfen Sie die angezeigte Zeichenfolge. Dies ist ein häufiges Problem beim Schreiben von Automatisierungstests, d. H. Beim Herausfinden, wie ein Element in der Anwendung referenziert wird, um eine Assertion darauf vorzunehmen.
Es gibt für fast jedes Objekt in der UI-Automatisierungs-API eine Methode, logElementTree
. Diese Methode protokolliert die verschachtelten Elemente eines bestimmten Elements. Dies ist sehr nützlich, um die Hierarchie von Elementen in der Anwendung zu verstehen, und hilft dabei herauszufinden, wie ein bestimmtes Element anvisiert werden soll.
Lassen Sie uns sehen, wie dies funktioniert, indem Sie den Elementbaum des Hauptfensters protokollieren. Schauen Sie sich die folgende Codezeile an.
target.frontMostApp (). mainWindow (). logElementTree ();
Das Hinzufügen dieser Zeile zum Testskript führt zu folgender Ausgabe:
Wie Sie sehen können, gibt es eine UIAStaticText
Unterelement der UIAWindow
und Sie können auch sehen, dass es einen Namen hat ich h
, Dies ist auch der umgekehrte String, den wir überprüfen müssen. Um unseren Test abzuschließen, müssen wir lediglich Code hinzufügen, um auf dieses Element zuzugreifen und zu überprüfen, ob es vorhanden ist.
Warum müssen wir nur überprüfen, ob die UIAStaticText
Element ist vorhanden?Da der Name des Elements die umgekehrte Zeichenfolge der Eingabezeichenfolge ist, wird durch die Überprüfung der Anwesenheit des Elements bestätigt, dass die Zeichenfolge korrekt umgekehrt wurde. Wenn das Element nicht vorhanden ist, wenn es mit dem Namen (der umgekehrten Zeichenfolge) referenziert wird, bedeutet dies, dass die Zeichenfolge nicht korrekt umgekehrt wurde.
var stringResult = target.frontMostApp (). mainWindow (). staticTexts () ["ih"]; if (! stringResult.isValid ()) UIALogger.logFail ("Der Ausgabetext wurde NICHT mit der korrekt umgekehrten Zeichenfolge festgelegt!"); else UIALogger.logPass ("Der Ausgabetext wurde mit der korrekt umgekehrten Zeichenfolge festgelegt!");
Es gibt so viele andere Möglichkeiten, dass ein Endbenutzer während der Verwendung Ihrer App mit einem iOS-Gerät interagieren kann. Dies bedeutet, dass Sie die Interaktion mit der Benutzeroberflächenautomatisierung auf viele andere Arten simulieren können. Anstatt zu versuchen, eine umfassende Liste dieser Interaktionen zu erfassen, leite ich Sie zur 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 dazu dienen, Berührungsinteraktionen zu simulieren, wie z flickInsideWithOptions
auf UIAWindow
.
Wenn Sie versuchen, immer kompliziertere Apps mit UI-Automatisierung zu testen, werden Sie feststellen, dass die wiederholte Verwendung manchmal sehr langwierig ist logElementTree
um das Element zu finden, nach dem Sie suchen. Dies wird auch für Anwendungen mit einer komplexen Ansichtshierarchie oder Navigation langwierig und komplex. In diesen Fällen können Sie eine andere Funktion von verwenden Instrumente um eine Reihe von Benutzerinteraktionen aufzuzeichnen. Noch cooler ist, dass Instruments den JavaScript-Code der UI-Automatisierung generiert, der zum Reproduzieren der aufgezeichneten Interaktionen erforderlich ist. So können Sie es selbst ausprobieren.
Suchen Sie in Instruments und bei ausgewähltem Automation-Instrument nach der Aufnahmetaste am unteren Rand des Fensters.
Wenn Sie auf die Aufnahmeschaltfläche klicken, startet Instruments eine Aufnahmesitzung wie in der Abbildung unten gezeigt.
Instruments startet Ihre Anwendung im iOS-Simulator und Sie können damit interagieren. Instruments erstellt ein Skript, das auf Ihren Interaktionen in Echtzeit basiert. Versuche es. Drehen Sie den iOS-Simulator, tippen Sie auf zufällige Positionen, führen Sie eine Wischgeste usw. aus. Dies ist eine wirklich nützliche Methode, um die Möglichkeiten der Benutzeroberflächenautomatisierung zu erkunden.
Wie Sie wahrscheinlich voraussehen können, wird die Wartung der von uns erstellten Testdatei, wenn wir mit der gleichen Methode fortfahren, weitere Tests hinzufügen. Was können wir tun, um das zu verhindern. In meinen Tests mache ich zwei Dinge, um dieses Problem zu lösen:
testEmptyInputField
.Im folgenden Codeausschnitt importieren wir eine JavaScript-Datei. Dadurch werden die Funktionen in dieser JavaScript-Datei für uns verfügbar.
#import "OtherTests.js"
In diesem Lernprogramm haben Sie den Wert von Tests auf höherer Ebene kennen gelernt und erfahren, wie UI-Automatisierung diese Lücke schließen kann. Dies ist ein weiteres Tool in Ihrer Toolbox, mit dem Sie zuverlässige und robuste Anwendungen bereitstellen können.
JavaScript-Referenz für die Benutzeroberflächenautomatisierung