0

我确信有一个简单的解决方案,但我不知道如何实现它。我正在为我的 iOS 应用程序编写 UI 单元测试(目前在 Objective C 中,但也对 Swift 解决方案感到高兴),以便我可以使用 Fastlane 的snapshot命令,但由于应用程序是基于云的,因此只需在选项卡/视图之间切换并拍摄屏幕截图不会'不起作用,因为屏幕截图只会有“正在加载...”,因为我想要其中的有效数据。

我目前的解决方案是丑陋且不可靠的。目前我只是等待 3 秒钟sleep(3),然后继续。我正在使用 AFNetworking 来执行请求,所以我只是可以收听任何传入的 HTTP 请求,如果它与我想要的匹配,我可以继续,但我不确定:

  • A:如何捕获所有入站流量
  • B:如何在我传递“ok”消息之前停止进一步执行。

任何想法或帮助将不胜感激,因为我不喜欢手动拍摄数百张屏幕截图 =)

4

2 回答 2

1

有效的 UI 测试是用不同于单元测试和生产代码的思维方式编写的。UI 测试应该从用户的角度编写,而不是关心应用程序的“幕后”发生了什么。例如,您的测试应该等待特定的 UI 元素出现,而不是等待 NSNotification 触发或特定网络请求完成。

等待一个元素出现

假设您的第一个选项卡/屏幕显示用户信息。该数据中包含用户的用户名。您可以使用 XCTest 的异步测试 API 暂停框架,直到找到元素(或发生超时)。

let app = XCUIApplication()
let username = self.app.staticTexts["joemasilotti"]
let exists = NSPredicate(format: "exists == true")
expectationForPredicate(exists, evaluatedWithObject: username, handler: nil)

waitForExpectationsWithTimeout(5, handler: nil)
XCTAssert(username.exists)

这直接来自我整理的UI 测试备忘单。它还有一个工作示例应用程序,您可以在 Xcode 中运行并使用代码和测试。

于 2016-04-21T11:44:12.963 回答
1

大多数时候,当我看到开发人员遇到此类问题时,这是因为系统架构不佳。但是,我想如何构建系统永远没有正确的答案。无论如何,与其创建一个线性测试用例,不如创建一个使用事件的状态机测试用例。这样你就可以设置你的测试了。设置完成后,你告诉你的线程去等待你的事件队列。线程/进程将等待事件。然后,当你得到你的 httpRequest,10 秒 - 或几分钟 - 或者之后需要多长时间,你可以通过一个事件通过测试。如果状态机超时,则测试失败。

于 2016-04-21T04:08:11.527 回答