2016-07-12 20 views
5

Ich habe eine App mit einem Login-System, also sobald Benutzer in der App angemeldet sind, speichern ich ihre Sitzung in einer lokalen DB, die Benutzer bei jeder Verwendung der App anmelden verhindert. Wenn Benutzer sich nicht angemeldet haben, zeigt die App offensichtlich eine LoginViewController an. Wenn die App jedoch eine aktuelle Sitzung für den Benutzer erkennt, wird HomeViewController angezeigt.Xcode UI-Tests mit Login-System

Ich habe ein paar Tests für meine HomeViewController erstellt und alle funktionieren gut. Ich habe jedoch festgestellt, dass sie gut funktionieren, da die App momentan eine Sitzung gespeichert hat. Wenn ich die App eintrage und mich vom aktuellen Benutzer abmelde, schlägt sie beim Ausführen der UI-Tests fehl. Dies ist sinnvoll, da der Test erwartet, dass ein HomeViewController angezeigt wird und stattdessen der LoginViewController angezeigt wird.

In Anbetracht dessen, dass ich auch UI-Tests für die LoginViewController erstellen möchte, scheint es sinnvoll, eine Lösung zu erstellen, bei der ich in jedem Test festlege, ob der Benutzer angemeldet ist oder nicht. Wie kann ich das tun?

Antwort

2

Nach einigem Nachforschungen fand die Antwort bei XCUIApplication Start Argumente/Umgebungen. Dadurch können Sie beim Ausführen des Tests bestimmte Konfigurationen senden, die später von Ihrem Hauptcode interpretiert werden können.

Für meinen Fall zu arbeiten, legte ich den folgenden Code:

// UI Test 
func testWelcomeIsShown() { 
    let app = XCUIApplication() 
    app.launchArguments.append("isUITestingLogin") 
    app.launch() 
    // Rest of your test steps 
} 

// AppDelegate or wherever you fetch your current session 
func getCurrentSession() { 
    if NSProcessInfo.processInfo().arguments.contains("isUITestingLogin") { 
     session = nil 
    } else { 
     session = DatabaseManager.getSession() 
    } 
} 

Hinweis: Dieser Code wird für die Aufzeichnung arbeiten und Ihren Test ausgeführt wird. Wenn Sie jedoch mehrere Tests mit derselben Logik durchführen, würden Sie wahrscheinlich die ersten drei Zeilen von testWelcomeIsShown() in die setUp() der Testklasse verschieben. Beachten Sie jedoch, dass dieses Setup bei der Aufzeichnung des Tests nicht ausgeführt wird. Daher müssen Sie eine Sitzung ohne aktuelle Sitzung manuell einrichten.

1

Sie könnten alternativ SBTUITestTunnel verwenden, mit dem Sie unter anderem eine Datei von Ihrem Testziel in die Sandbox der App hochladen können. Es sollte genügen, eine DB mit vorgefertigten Login-Informationen vorzubereiten, die dann beim Start an das Ziel der Apps gesendet wird.

Das Schöne an der Bibliothek ist, dass der Code der App nicht mit Testcode verschmutzt ist.