UI-Tests in Xcode mit Embassy und Succulent

Hallo allerseits!

Eine weitere Neuheit in der Liste unserer Kurse: "iOS Developer" , was bedeutet, dass die Zeit für interessante Stücke gekommen ist, die wir während der Vorbereitung des Kurses gefunden haben. In diesem Artikel analysiert der Autor, wie API-Anforderungen für UI-Tests aufgezeichnet und wiedergegeben werden.



Lass uns gehen.

Ich habe kürzlich Embassy und Succulent in meine UI-Tests integriert. Wenn Sie UI-Tests für eine Anwendung ausführen müssen, die diese APIs verwendet, bietet dieses Handbuch möglicherweise eine Alternative zu mock / stub.

Die Probleme:

  • Die Anwendung verwendet die API-Daten, um die Benutzeroberfläche zu füllen.
  • Für die Verwendung von Stubs muss möglicherweise eine große Anzahl von Dateien geschrieben und verwaltet werden.
  • Bei Verwendung von Mocks kann die Anwendungslogik vom tatsächlichen Netzwerkaufruf abweichen.
  • Verwenden dieser Verbindungs-API - GENAU AUSGESCHLOSSEN, zu viele Variablen und Abstürze


Botschaft + saftige Lösung

Die Lösung besteht darin, einen lokalen Server zu erstellen, an den Ihre Anwendung gerichtet ist (mithilfe von Embassy), und Netzwerkanrufe aufzuzeichnen / zu beantworten (mithilfe von Succulent).

Wenn Sie den Test zum ersten Mal ausführen, werden Standardnetzwerkaufrufe getätigt und in die Tracedatei geschrieben.

Beim nächsten Mal werden dieselben Netzwerkanrufe automatisch beantwortet. Cool, nicht wahr? Sie müssen keine Mocks schreiben, Sie können Verzögerungen und Fehler simulieren, und all dies läuft in der Build-Maschine, in XCtest!

Wie benutzt man es?

1. Laden Sie unter Succulent herunter und installieren Sie es. Zum Zeitpunkt dieses Schreibens gab es auf cocoapods.com keinen Pod. Sie müssen daher die Quelle herunterladen und wie folgt zu Ihrer Unterdatei hinzufügen:

target “UI Tests” do inherit! :search_paths pod 'Succulent', :path => 'Succulent/' end 

Sukkulente wird von der Botschaft benötigt und automatisch installiert.

2. Erstellen Sie eine neue Test-UI-Datei und kopieren Sie die Anweisungen von Succulent GitHub . Als Ergebnis sollten Sie diese Datei erhalten:

 import Succulent @testable import TestAppUITests class SucculentTestUITest: XCTestCase { private var succulent: Succulent! var session: URLSession! var baseURL: URL! /// The name of the trace file for the current test private var traceName: String { return self.description.trimmingCharacters(in: CharacterSet(charactersIn: "-[] ")).replacingOccurrences(of: " ", with: "_") } /// The URL to the trace file for the current test when running tests private var traceUrl: URL? { let bundle = Bundle(for: type(of: self)) return bundle.url(forResource: self.traceName, withExtension: "trace", subdirectory: "Traces") } /// The URL to the trace file for the current test when recording private var recordUrl: URL { let bundle = Bundle(for: type(of: self)) let recordPath = bundle.infoDictionary!["TraceRecordPath"] as! String return URL(fileURLWithPath: "\(recordPath)/\(self.traceName).trace") } override func setUp() { super.setUp() continueAfterFailure = false if let traceUrl = self.traceUrl { // Replay using an existing trace file succulent = Succulent(traceUrl: traceUrl) } else { // Record to a new trace file succulent = Succulent(recordUrl: self.recordUrl, baseUrl: URL(string: "https//base-url-to-record.com/")!) } succulent.start() let app = XCUIApplication() app.launchEnvironment["succulentBaseURL"] = "http://localhost:\(succulent.actualPort)/" app.launch() } override func tearDown() { super.tearDown() } } 

Wenn Sie Succulent starten, können Sie die Basis-URL angeben, wodurch alle Anforderungen einschließlich der Basis-URL aufgezeichnet und alle anderen ignoriert werden.

3. Fügen Sie dem Info.plist-Ziel Ihrer Test-Benutzeroberfläche die folgende Zeile hinzu:

 <key>TraceRecordPath</key> <string>$(PROJECT_DIR)/Succulent/Traces</string> 

4. Richten Sie die Anwendung auf den lokalen Server.

Dazu müssen Sie in Ihrer Hauptanwendung überprüfen, ob die Umgebungsvariable "succulentBaseURL" vorhanden und konfiguriert ist.

Es zeigt die URL Ihres lokalen Webservers an und wird in der Funktion setUp konfiguriert, die oben in Schritt 2 kopiert wurde.

 #if DEBUG if let localServerUrl = ProcessInfo.processInfo.environment[“succulentBaseURL”] { return URL(string: localServerUrl)! } #endif 

Das ist vielleicht alles!

Wenn Sie nun einen einfachen Test durchführen und ausführen, schreibt Succulent eine API-Anforderung und erstellt eine .trace-Datei im Traces-Ordner des Zielverzeichnisses Ihres UI-Tests. Wenn Sie das nächste Mal denselben Test ausführen, wird überprüft, ob die Datei vorhanden ist, und sie wird ausgeführt.

Sie können .trace-Dateien direkt von Xcode aus öffnen, alle Netzwerkanforderungen überwachen und nach Bedarf ändern.

Hoffe, der Artikel hat sich als nützlich erwiesen, hier ist die Pizza:



DAS ENDE

Wie immer warten wir hier auf Kommentare, Fragen usw. oder Sie können sich den Tag der offenen Tür ansehen und dem Lehrer dort eine Frage stellen.

Source: https://habr.com/ru/post/de412955/


All Articles