2016-05-20 10 views
2

Ich habe gerade TDD praktiziert und schrieb eine sehr einfache Funktion für eine Test-App. Die Benutzeroberfläche ist einfach: Sie hat zunächst eine Schaltfläche mit "0" als Titel. In meiner Sicht Controller, ich habe eine lokale Variable "score". Jedes Mal, wenn ich auf den Knopf tippe, würde es die "Punktzahl" erhöhen. Der Button-Titel wird mit dem neuen "score" -Wert aktualisiert. Die Aktualisierungslogik der Schaltfläche ui befindet sich in der "didset" -Eigenschaftsbeobachtung von "score".xcode 7.3 UI-Test zufällig bestanden oder nicht bestanden

Alles ist cool außer dem UI-Test. Ich habe zwei ui Testfunktionen, eine ist, den Knopf einmal anzutippen und ein anderer ist, den Knopf zweimal anzutippen. Jetzt passiert das Seltsame. Im Folgenden finden Sie die Screenshots meiner beiden Testfunktionen.

enter image description here

Jedes Mal, wenn ich den Test lief, manchmal bestanden beide Funktionen während manchmal ein oder zwei von ihnen versagt. Der Fehler ist immer wie gezeigt "aNummer ist nicht gleich aNumber + 1". Sieht so aus, als gäbe es ein Problem mit der Antwortzeit. Es sieht so aus, als ob das UI-Update viel langsamer ist als das Abrufen des Label-Ergebnisses. Ich bin mir nicht sicher, ob ich den Wert von button.label zu früh bekomme, bevor er wirklich aktualisiert wurde. Sollte ich sogar die Benutzeroberfläche in Immobilienbeobachtern aktualisieren? Gibt es eine Lösung, um den UI-Test zu bestehen? Schätze für deine Hilfe!

+0

Ich habe auch versucht, das Projekt zu reinigen. Das Testergebnis ist das gleiche. Manchmal bestanden beide Testfunktionen, manchmal auch nicht. – fans3210

+0

TDD mit UITests in iOS ... Ich wünsche Ihnen viel Glück, Sie werden es brauchen – Daniel

+0

Dank @simpleBob, der ui Test scheint einige probs haben – fans3210

Antwort

1

Bezüglich

beide Funktionen übergeben, während manchmal ein oder zwei von ihnen versagt

UITest ist in separaten Prozess auszuführen. so, wenn die Taste Titel-Update ist langsamer als XCTAssert, es wird scheitern, weil vergleichen oldValue mit einem erwarteten Wert

Nach tippen Sie Ihre Taste nur richtig zu testen, wartet

mit dieser Funktion waitForExpectationsWithTimeout(3,nil)

func testTapNumberButtonIncrementScore() { 
    let app = XCUIApplication() 

    app.buttons["numberButton"].tap() 

    waitForExpectationsWithTimeout(3, handler: nil) 
    XCTAssertEqual(app.buttons["numberButton"].title, "1") 
} 

func testTapNumberButtonTwiceIncrementTo2() { 
    let app = XCUIApplication() 

    app.buttons["numberButton"].tapWithNumberOfTaps(2, numberOfTouches: 1) 
    waitForExpectationsWithTimeout(3, handler: nil) 
    XCTAssertEqual(app.buttons["numberButton"].title, "2") 
} 

Ich hoffe, dass es funktioniert für Sie :)

+0

Dank @SwiftyCruz. Ich werde diese Antwort akzeptieren, sobald ich es für alle meine anderen Fälle gefunden habe. Hope Apple wird mehr über ui Tests in der kommenden WWDC vorstellen – fans3210

+0

Sorry @SwiftyCruz, ich denke, ich habe ein Problem nach der Verwendung von waitForExpectationsWithTimeout: API-Verletzung, Anruf zu warten, ohne irgendwelche Erwartungen gesetzt worden. Ich denke, wir müssen 'expectationForPredicate' vor jedem waitForExpectationsWithTimeout setzen – fans3210

0

Ich hatte das gleiche Problem im Simulator, während in meinem iPhone der Test bestanden.

landete ich für den Simulator wie dies eine Verzögerung addieren:

struct Platform { 
    static let isSimulator: Bool = { 
     var isSim = false 
     #if arch(i386) || arch(x86_64) 
      isSim = true 
     #endif 
     return isSim 
    }() 
} 

class YourUITests: XCTestCase { 
    override func setUp() { 
     super.setUp() 
     if Platform.isSimulator { 
      sleep(1) 
     } 
    } 
} 

Hoffnung, das hilft.