我正在尝试使用Xcode 7 beta 2中提供的新UI测试编写一个测试用例。该应用程序有一个登录屏幕,它调用服务器登录。由于这是一个异步操作,因此存在与此相关的延迟。

在进行进一步的步骤之前,是否有一种方法可以在XCTestCase中引起延迟或等待机制?

没有合适的文档,我浏览了类的头文件。找不到任何与此相关的信息。

意见/建议吗?


当前回答

Xcode测试

在我的情况下,睡眠会产生副作用,所以我使用等待

let _ = XCTWaiter.wait(for: [XCTestExpectation(description: "Hello World!")], timeout: 2.0)

其他回答

编辑:

我突然想到在Xcode 7b4中,UI测试现在有 expectationForPredicate: evaluatedWithObject:处理程序:

原:

另一种方法是在一段时间内旋转运行循环。只有当你知道你需要等待多长时间时才有用

Obj-C: [NSRunLoop currentRunLoop] runMode: nsdefaultrunopmode befordate:[NSDate datetimeintervalcenow: << <time wait in sec >>]

迅速: NSRunLoop.currentRunLoop().runMode(nsdefuultrunloopmode, beforeDate: NSDate(timeIntervalSinceNow: <<time to wait in seconds>>)))

如果您需要测试某些条件才能继续测试,那么这并不是非常有用。要运行条件检查,请使用while循环。

   let app = XCUIApplication()
    app.launch()

     //Find the button in the UI 
    let SettingsButton =
        app.navigationBars["HomeView"].buttons["Settings"]
    XCTAssertTrue(settingButton.waitForExistence(timeout: 10))

iOS 11 / Xcode 9

<#yourElement#>.waitForExistence(timeout: 5)

这是一个伟大的替代所有自定义实现在这个网站!

一定要看看我的答案:https://stackoverflow.com/a/48937714/971329。在这里,我描述了一种替代等待请求的方法,它将大大减少测试运行的时间!

这将创建一个延迟,而不会使线程进入睡眠状态或在超时时抛出错误:

let delayExpectation = XCTestExpectation()
delayExpectation.isInverted = true
wait(for: [delayExpectation], timeout: 5)

因为期望颠倒了,它会悄悄超时。

Xcode测试

在我的情况下,睡眠会产生副作用,所以我使用等待

let _ = XCTWaiter.wait(for: [XCTestExpectation(description: "Hello World!")], timeout: 2.0)