2016-07-02 11 views
1

So habe ich vor ein paar Tagen begonnen, das "neue" XCUI-Testing-Framework für Tech-Evaluierungszwecke zu verwenden. Ich finde das System ziemlich wackelig, da sehr oft die Tests fehlschlagen (normalerweise drücken Tastenbetätigungen mit .tap() einfach nicht die Tastenaktion) und ich muss Xcode neu starten und die DerivedData-Caches löschen, damit es wieder funktioniert. Aber diese eine Sache kann ich überhaupt nicht funktionieren - und es ist über den einfachsten UI-Test Anwendungsfall verfügbar:UILabels neuer Textwert aktualisiert sich nicht im XCUI-Test

Ich habe ein UIButton und ein UILabel. Das UILabel hat zunächst einen Text "initial text". Das Label der Schaltfläche lautet "SHOW MESSAGE". Wenn die Schaltfläche gedrückt wird, wird der Text des Labels in "Neuer Text" geändert. Und natürlich funktioniert das beim Ausführen der App. ;)

Allerdings, wenn ich (initialisiert und Start (nach App-Instanz wurde) ed in setup()) laufen die folgenden XCUI Test:

app.buttons["SHOW MESSAGE"].tap() 
    XCTAssert(app.staticTexts["new text"].exists) 

Der Test schlägt fehl 100% der Zeit. Wenn ich (nach dem Aufruf von .tap()) die statischen Texte mit print(app.staticTexts.debugDescription) ausdrucke, kann ich dort mein Etikett sehen, aber mit dem Originaltext von "initial text".

Ist all dieses XCUI-Zeug immer noch nur wirklich Alpha-Zeug oder was?

Antwort

0

Legen Sie eine Eingabehilfe-ID auf dem Etikett fest und rufen Sie den Text mit XCUIElement.label ab.

XCTAssertEqual("new text", app.staticTexts["yourAccessibilityLabel"].label) 

Dies sollte den neuesten Text vom Etikett abrufen.

Nach dem Tippen auf die Schaltfläche sollte ein neuer Ansichtshierarchie-Snapshot erstellt werden. Wenn Sie versuchen, den neuen Wert des Labels zu finden, sollte ein Debug-Protokoll angezeigt werden. Es sollte nicht erwähnt werden, einen zwischengespeicherten Snapshot zu verwenden.

+0

Nun, siehe, ich habe das auch ausprobiert. Ich habe den Accessibility Identifier des Labels auf 'messageLabel' gesetzt und so versucht, aber folgenden Fehler bekommen: 'Assertion Failure: XCTAssertEqual ist fehlgeschlagen: (" Optional ("new text") ") ist nicht gleich (" Optional ("initial text ")") - ' – Matti

+0

Es klingt, als ob die Ansichtshierarchie nicht aktualisiert wurde, um den neuen Wert zu finden. Versuchen Sie es mit expectationForPredicate (oder expectationWithDescription) und waitForExpectationsWithTimeout für einige Sekunden. Dies sollte eine Ansichtshierarchie bei jeder Überprüfung erzwingen. – Oletha

+0

Alternativ kann der Wert an mehr als einer Stelle in Ihrem App-Code festgelegt werden. Hast du einen Wert für das Label im Storyboard oder in der Feder? Dies kann den Wert für XCTest überschreiben, wenn Sie den Wert im Ereignishandler für die gedrückte Schaltfläche ändern. Setze alle Label-Werte programmgesteuert und entferne Werte aus dem Storyboard/der Nib. – Oletha

0

versuchen Sie es mit expectationForPredicate. Hier ist der Code:

let exists = NSPredicate(format: "exists == 1") 
let label = app.staticTexts["new text"] 
expectationForPredicate(exists, evaluatedWithObject: label, handler: nil) 
waitForExpectationsWithTimeout(5) { error in 
      if error != nil { 
       assertionFailure("error") 
      } 
     } 

Prost

+0

Versuchte das. Die Sache ist, dass das Label schon von Anfang an exists = true hat. Das eigentliche Problem hier ist, dass die 'app.buttons [" foobutton "]. Tap()' nicht die Aktion des Knopfes am häufigsten auslösen, was ich als einen Fehler im Testrahmen betrachten muss. Es gibt keinen Fehler durch den tap(), es tut einfach nichts. – Matti

0

So stellt sich heraus diese über das Müssen war eine 1 Sekunde Schlaf() in der setUp() -Methode hinzufügen, damit für den Rahmen richtig initialisiert werden. Seufzer.