xcode 7.3 UI测试随机传递或失败

时间:2016-05-20 09:49:22

标签: xcode swift unit-testing xcode-ui-testing

我刚刚练习TDD并为测试应用编写了一个非常简单的功能。用户界面很简单:它最初有一个标题为“0”的按钮。在我的视图控制器中,我有一个局部变量“得分”。每次点击按钮都会增加“得分”。按钮标题将使用新的“分数”值进行更新。按钮ui更新逻辑位于“得分”的“didSet”属性观察器中。

除了UI测试之外,一切都很酷。我有两个ui测试功能,一个是点击按钮一次,另一个是按两次按钮。现在发生了奇怪的事情。以下是我的两个ui测试功能的截图。

enter image description here

每次我运行测试时,有时两个函数都会通过,而有时一个或两个函数都会失败。错误始终如“aNumber不等于aNumber + 1”所示。看起来有一些响应时间问题。看起来UI更新比按钮标签结果检索慢得多。我不确定在真正更新之前我是否过早得到了button.label的值。我是否应该更新属性观察者的UI?有没有通过ui测试的解决方案?感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

关于

  

两个函数都通过了,有时一个或两个函数失败

UITest在单独的进程中执行。因此,如果按钮标题更新比XCTAssert慢,它将失败,因为将oldValue与期望值进行比较

点击按钮后,等待正确测试

使用此功能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")
}

我希望它适用于你:)

答案 1 :(得分:1)

我在iPhone模拟器中遇到了同样的问题,测试通过了。

我最终为模拟器添加了这样的延迟:

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)
        }
    }
}

希望有所帮助。