Swift 中的异步 UI 测试

Posted

技术标签:

【中文标题】Swift 中的异步 UI 测试【英文标题】:Asynchronous UI testing in Swift 【发布时间】:2020-05-20 16:52:53 【问题描述】:

我在 UI 测试中有一个用于登录应用的按钮。自动化的用户流程是这样的:

    用户点击按钮 按钮文本从“登录”变为“处理中...” 登录成功后按钮消失

我的 UI 测试代码对于功能测试来说非常简单:

let loginButton = app.buttons["LOG IN"]
let welcomeText = app.staticTexts["Welcome!"]
loginButton.tap()
XCTAssertTrue(welcomeText.waitForExistence(10))

但是,它不会验证按钮将状态更改为“处理中...”

如果我尝试像这样在代码中进行检查,它不起作用,因为当 UI 测试走过屏幕寻​​找文本时,它可能已经消失了。

let loginButton = app.buttons["LOG IN"]
let loginButtonProcessingText = app.buttons.staticTexts["Processing..."]
let welcomeText = app.staticTexts["Welcome!"]
loginButton.tap()
XCTAssertTrue(loginButtonProcessingText.exists)
XCTAssertTrue(welcomeText.waitForExistence(10))

所以我的想法是,我需要以某种方式开始检查处理测试同时点击按钮,或者可能在它之前一秒钟。

有没有办法在 XCUI 测试中异步启动这样的检查?

【问题讨论】:

应用流程是什么? Welcome! 文本在哪个控制器中? 您能描述一下您所说的应用程序流是什么意思吗? loginButton 和随后的欢迎文本有不同的控制器。应用流程非常简单:WebView 实例化所有按钮和字段。 loginButton 是一个 webView 按钮 loginButton,点击后开始身份验证,同时将文本更改为“处理中...” 【参考方案1】:

您可以使用expectation 来测试异步任务。 但首先,如果您将步骤分开如下所示,会更清楚;

let loginButton = app.buttons["LOG IN"]
loginButton.tap()

let loginButtonProcessingText = app.buttons.staticTexts["Processing..."]
XCTAssertTrue(loginButtonProcessingText.exists)

let welcomeText = app.staticTexts["Welcome!"]
XCTAssertTrue(welcomeText.waitForExistence(10))

【讨论】:

以上是关于Swift 中的异步 UI 测试的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据