Ich versuche, einen Testfall mit dem neuen UI-Test zu schreiben, der in Xcode 7 Beta 2 verfügbar ist. Die App verfügt über einen Anmeldebildschirm, auf dem sie den Server anruft, um sich anzumelden. Damit ist eine Verzögerung verbunden, da es sich um eine asynchrone Operation handelt.
Gibt es eine Möglichkeit, im XCTestCase einen Verzögerungs- oder Wartemechanismus zu verursachen, bevor Sie mit weiteren Schritten fortfahren?
Es ist keine ordnungsgemäße Dokumentation verfügbar, und ich habe die Header-Dateien der Klassen durchgesehen. Konnte nichts im Zusammenhang damit finden.
Irgendwelche Ideen / Vorschläge?
ios
ios9
xcode-ui-testing
xcode7-beta2
xctwaiter
Tejas HS
quelle
quelle
NSThread.sleepForTimeInterval(1)
sollte funktionierendispatch_after
,dispatch_queue
stuff)Antworten:
Asynchrones UI-Testen wurde in Xcode 7 Beta 4 eingeführt. Warten auf ein Etikett mit dem Text "Hallo Welt!" Um zu erscheinen, können Sie Folgendes tun:
Weitere Details zu UI-Tests finden Sie in meinem Blog.
quelle
waitForExpectationsWithTimeout
Ihr Test wird automatisch nicht bestanden, was ziemlich unglücklich ist.app.launch()
scheint nur die App neu zu starten. Ist es nötig?Außerdem können Sie einfach schlafen:
Da die UITests in einem anderen Prozess ausgeführt werden, funktioniert dies. Ich weiß nicht, wie ratsam es ist, aber es funktioniert.
quelle
usleep
Xcode 9 hat mit XCTWaiter neue Tricks eingeführt
Testfall wartet explizit
Kellnerinstanz delegiert zum Testen
Die Kellnerklasse gibt das Ergebnis zurück
Beispielnutzung
Vor Xcode 9
Ziel c
VERWENDUNG
Schnell
VERWENDUNG
oder
QUELLE
quelle
iOS 11 / Xcode 9
Dies ist ein großartiger Ersatz für alle benutzerdefinierten Implementierungen auf dieser Site!
Schauen Sie sich unbedingt meine Antwort hier an: https://stackoverflow.com/a/48937714/971329 . Dort beschreibe ich eine Alternative zum Warten auf Anfragen, die die Laufzeit Ihrer Tests erheblich verkürzt!
quelle
XCTestCase
und er funktioniert wie ein Zauber. Ich verstehe nicht, warum Ansätze wiesleep(3)
hier hier so hoch bewertet werden, da dies die Testzeit künstlich verlängert und wirklich keine Option ist, wenn Ihre Testsuite wächst.Ab Xcode 8.3 können wir
XCTWaiter
http://masilotti.com/xctest-waiting/ verwenden.Ein weiterer Trick besteht darin, eine
wait
Funktion zu schreiben. John Sundell ist es zu verdanken, dass er sie mir gezeigt hatund benutze es gerne
quelle
Basierend auf der Antwort von @ Ted habe ich diese Erweiterung verwendet:
Sie können es so verwenden
Sie können auch darauf warten, dass ein Element verschwindet oder eine andere Eigenschaft geändert wird (mithilfe des entsprechenden Blocks).
quelle
Bearbeiten:
Mir ist gerade eingefallen, dass in Xcode 7b4 jetzt UI-Tests durchgeführt wurden
expectationForPredicate:evaluatedWithObject:handler:
Original:
Eine andere Möglichkeit besteht darin, die Laufschleife für eine festgelegte Zeitspanne zu drehen. Wirklich nur nützlich, wenn Sie wissen, auf wie viel (geschätzte) Zeit Sie warten müssen
Obj-C:
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow: <<time to wait in seconds>>]]
Schnell:
NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeIntervalSinceNow: <<time to wait in seconds>>))
Dies ist nicht besonders nützlich, wenn Sie einige Bedingungen testen müssen, um Ihren Test fortzusetzen. Verwenden Sie eine
while
Schleife, um bedingte Prüfungen durchzuführen.quelle
Der folgende Code funktioniert nur mit Ziel C.
Rufen Sie einfach diese Funktion wie unten angegeben auf.
quelle
In meinem Fall
sleep
entstand ein Nebeneffekt, den ich benutztewait
quelle
Gemäß der API für XCUIElement
.exists
kann überprüft werden, ob eine Abfrage vorhanden ist oder nicht, sodass die folgende Syntax in einigen Fällen hilfreich sein kann!Wenn Sie sicher sind, dass Ihre Erwartungen irgendwann erfüllt werden, können Sie versuchen, dies auszuführen. Es sollte beachtet werden, dass ein Absturz vorzuziehen ist, wenn die Wartezeit zu lang ist. In diesem Fall
waitForExpectationsWithTimeout(_,handler:_)
sollte der Beitrag von @Joe Masilotti verwendet werden.quelle
Schlaf blockiert den Thread
"Während der Thread blockiert ist, findet keine Run-Loop-Verarbeitung statt."
Sie können waitForExistence verwenden
quelle
Dies führt zu einer Verzögerung, ohne den Thread in den Ruhezustand zu versetzen oder beim Timeout einen Fehler auszulösen:
Da die Erwartung umgekehrt ist, tritt eine leise Zeitüberschreitung auf.
quelle