2016-05-05 11 views
2

Meine iOS-App hat derzeit ein Implementierungsziel von iOS 7 (obwohl mein System den iOS 9.2-Simulator ausführt) und Links zu den Frameworks AddressBook, AddressBookUI und CoreLocation. Ich habe eine Reihe von Swift UI-Tests in Xcode 7 (nicht in Instruments). Wenn ein Nutzer meine App zum ersten Mal nutzt, werden sie aufgefordert, während der Laufzeit der App auf ihre Kontakte und deren Standort zuzugreifen. Da dies eine Menge Code erfordert, der perfekt ausgeführt werden muss, würde ich gerne alle möglichen Ergebnisse automatisieren und sicherstellen, dass die Benutzeroberfläche im gewünschten Zustand ist.Kann ich die Kontakt- und Standortberechtigungseinstellungen des Simulators für meine App zurücksetzen, um ein erstmaliges Nutzungsszenario zu simulieren?

Kann ich den Xcode UI-Test verwenden, um die Einstellungen des Simulators für den Zugriff auf Kontakte und Standorte zurückzusetzen? Zum Beispiel könnte ich dies in der setUp() Funktion innerhalb meiner Testfallklasse implementieren. Ich habe einige Anleitungen darüber gefunden, wie ich auf die Dialoge reagieren soll, aber bevor ich zu diesem Punkt komme, muss ich den Zustand simulieren, in dem die Berechtigungen angefordert werden. Here's a question that explains how to respond to such an alert.

Antwort

4

Kurze Antwort: Nein. Es gibt keine API für UI-Tests, um den Simulator zurückzusetzen (und daher die Berechtigungsdialoge zurückzusetzen). Ich schlage vor, einen Fehlerbericht mit Apple einzureichen, der erklärt, warum Sie das brauchen.

UI-Tests machen es nicht einfach, "unglückliche Pfade" zu testen. In Ihrer Frage haben Sie erwähnt, dass Sie alle Abläufe auf Berechtigungen testen. Ohne das manuelle Zurücksetzen des Simulators zwischen den Tests wird dies unmöglich sein. Ich schlage vor, nur den glücklichen Pfad mit dem UI-Test zu testen und die anderen Fälle Unit-Tests zu überlassen.

Ich verstehe, dass dies nicht ideal ist, aber für jetzt ist es ein guter Workaround. Was es wert ist, ist der Ansatz, den ich beim Testen unserer App anwende. (Die App fragt nach Push-Benachrichtigungen und Standortberechtigungen.)

+0

Danke! Bis jetzt habe ich die UI-Tests trotzdem implementiert, mit dem Vorbehalt, dass der Simulator zuerst einen manuellen Reset für gültige Ergebnisse benötigt. Ich kann diese Auflistung (eine Oberklasse mit gemeinsamen vars und funcs und vier Unterklassen zum Behandeln von Warnungen und Verifizieren von Ergebnissen) aus dem Testziel ausschließen und aktivieren und manuell ausführen, wenn dies erforderlich ist. Das Ziel der Kern-UI-Tests konzentriert sich dann auf Tests, die vollständig automatisiert sind und von denen erwartet wird, dass sie immer bestehen. Ich werde den Bug ablegen, aber erwarte, dass er nicht repariert wird (obwohl ich mir einen einfachen Sandbox-Ansatz vorstellen kann). Ich muss auch eine bessere Unit-Test-Abdeckung anstreben. – bneely

-1

Hier ist, wie ich es tun würde. Ich würde die Simulatordaten löschen, die die gespeicherten Einstellungen löschen, hoffentlich funktioniert das in Ihrer Situation. In Swift:

let filemanager = NSFileManager.defaultManager() 

do { 
    try filemanager.removeItemAtPath(NSHomeDirectory()) 
} 
catch let error as NSError { 
    print("Ooops! Something went wrong: \(error)") 
} 

Einfach herauszufinden, einen guten Platz, um das in Ihrem Code und Puff - Simulator Daten gegangen.

+1

Es ist ein guter Vorschlag, obwohl es scheint, dass diese Datenschutzeinstellungen nicht im Home-Verzeichnis gespeichert sind. Wenn sie sich im Dateisystem befinden, ist es wahrscheinlich kein schreibbarer Pfad. Ich probierte dies in meiner setUp() - Funktion für die Testklasse, wo ich Unterbrechungsmonitore für die Warnungen erstellen, aber diese Handler nicht ausgeführt werden (ich überprüft mit einem NSLog und einem Haltepunkt), wenn ich alle Tests in dieser Klasse ausführen . Trotzdem danke! – bneely

+1

Ich denke, ein Ansatz, der funktionieren könnte, obwohl er wahrscheinlich nicht unterstützt wird, besteht darin, das gesamte Simulatorverzeichnis vom Entwicklungscomputer zu entfernen, anstatt auf welche Pfade innerhalb von iOS zugegriffen werden kann (ob simuliert oder auf einem Gerät). Ich werde das erkunden. – bneely

-1

Ich habe die Berechtigungseinstellungen mit einigen privaten Kopfzeilen zurückgesetzt, um auf das Sprungbrett und die Einstellungen-App zuzugreifen. Überprüfen Sie meine Antwort here