2015-09-19 2 views
19

Ich entwickle ein iOS-Projekt, und ich muss auf die Codes der Host-App vom UI-Testziel zugreifen, habe jedoch Linkfehler festgestellt: undefiniert Symbol, als ich es versuchte. Ich habe festgestellt, dass der Test-Host und der Bundle-Loader für dieses Ziel leer sind. Daher habe ich diese auf meine Host-App gesetzt und konnte den Link-Fehler umgehen. Zur Laufzeit schlägt es jedoch immer noch fehl, wenn XCUIApplication.launch() aufgerufen wird. Hat jemand herausgefunden, wie man von diesem UI-Testziel auf die Codes der Host-App zugreifen kann? Ohne dazu in der Lage zu sein, sind wir gezwungen, alle UI-Tests durchzuführen, was sehr flockig ist. Wir müssen definitiv Nicht-UI-Schritte in Testszenarien haben. Ich benutze Swift für mein Projekt.Zugriff auf den Host-App-Code vom Xcode 7 UI-Testziel

+0

Ich habe genau das gleiche Problem. Ich habe [link] (http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/) für Bundle Loader/Test Host und [link] (http://savvyapps.com/blog/how-to-implement-ui-testing-in-an-existing-ios-app), das verifiziert wurde, um "Testbarkeit aktivieren" im Hauptziel zu bestätigen. Ich bin genau zum selben Punkt gekommen wie du. Hast du in den letzten Tagen Glück gehabt, seit du diese Frage gestellt hast? – Chris

+0

Wie @Konnor in seiner Antwort sagt, können Sie nicht über einen UI-Test auf den Prozess Ihrer App zugreifen. Was versuchst du zu machen? Ich habe einige Erfolge bei diesen Tests gemacht. – kubi

+0

@kubi: Ich bin an Ihrer Problemumgehung interessiert. Ich möchte ein Attribut in einem Singleton-Objekt setzen/lesen. Natürlich kann dies durch Hinzufügen einer UI dafür in der getesteten Anwendung geschehen, aber das fühlt sich etwas übertrieben an. Haben Sie eine bessere Lösung gefunden? –

Antwort

6

Mithilfe des neuen UI-Automatisierungsframeworks, das Apple in WWDC 15 eingeführt hat, ist es nicht möglich, über den UI-Automatisierungstest auf den Code Ihrer App zuzugreifen. Es soll simulieren, wozu ein Benutzer Zugang hat, was manchmal frustrierend sein kann.

+2

Haben Sie eine Quelle für Ihre Aussage, dass der App-Code nicht von den ui-Tests aus zugänglich ist? – singingAtom

+0

@singingAtom Die UI-Tests sind ein von der App getrenntes Modul und werden daher nicht in Ihrer App ausgeführt, wie es ein Logiktest tun würde. Die einzige Möglichkeit, Code zu teilen, besteht darin, alle App-Dateien, die Sie zwischen den beiden Modulen teilen müssen, zu kompilieren. Ich hoffe, das hilft. – cakes88

+0

@ cakes88 Haben Sie irgendwelche Hinweise darauf, wie Ihre letzte Aussage funktioniert? –

32

Ich verwende die folgende Technik, um Werte in meiner App vor dem Ausführen von UI-Tests festzulegen. Nützlich für das Setzen von Standardeinstellungen oder das Einschalten von Netzwerk-Mocks, etc. Zum größten Teil habe ich nicht gelesen noch nichts aus der App. Alles spiegelt sich in der Benutzeroberfläche wider und kann auf diese Weise getestet werden. Demnächst werden Tests hinzugefügt, um sicherzustellen, dass die App bestimmte Netzwerkanrufe tätigt. Ich bin mir noch nicht sicher, wie wir das in einem UI-Testfall testen werden.

Set Argumente in Ihrem UI Test

let app = XCUIApplication() 
app.launchArguments = ["ResetDefaults", "NoAnimations", "UserHasRegistered"] 
app.launch() 

lesen Argumente in Ihrer App

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    var arguments = NSProcessInfo.processInfo().arguments 
    arguments.removeFirst() 
    print("App launching with the following arguments: \(arguments)") 

    // Always clear the defaults first 
    if arguments.contains("ResetDefaults") { 
     destroyUserDefaults() 
     clearKeychain() 
    } 

    for argument in arguments { 
     switch argument { 
     case "NoAnimations": 
     UIView.setAnimationsEnabled(false) 
     case "UserHasRegistered": 
     Defaults.userRegistered = true 
     default: 
     break 
    } 
    } 
} 

Weiterer Pluspunkt: Wenn Sie Start Argumente verwenden, um Ihre App zu konfigurieren, ist es trivial Flaggen zu Ihrem Xcode hinzufügen planen. Zum Beispiel habe ich ein Schema, das alle gespeicherten Daten löscht und jeden Login-Versuch mit einer Erfolgs-Antwort stubsiert. Ich kann mich jetzt über den Simulator "anmelden", ohne irgendwelche Server zu treffen.

+0

Haha, das habe ich gerade umgesetzt. Und in einem zweiten Schritt habe ich versucht, Informationen über eine Dateischnittstelle zurück zu geben. Ich schreibe Datei 'a' in der App und versuche, es in den Tests zu lesen, aber es ist nicht das Gleiche. Ich weiß nicht warum ... @ "/ var/mobile/Container/Daten/Anwendung/8EDD0F16-005B-49E7-B8E3-726F195989DD/Dokumente/a" @ "/ var/mobile/Container/Daten/Anwendung/DD4A912D-5808-40AC-9BAD- 047584190DA/Dokumente/a " –

+0

Wenn Sie etwas herausfinden, schreiben Sie einen Blog-Post! Ich bin mir sicher, dass sich viele Leute dafür interessieren würden. Ich denke, der Weg nach vorne könnte sein, einen API-Aufruf an einen lokalen Server zu machen. Klingt etwas kompliziert, aber ich wette, es könnte mit einem 30-Zeilen-Python-Skript behandelt werden. – kubi

+0

Beachten Sie, dass für die von NSUserDefaults analysierten Argumente der Schlüssel und der Wert, z. '-AppleLanguages' und' (en) 'müssen zwei separate Array-Elemente sein. –