在继续之前等待 NSNotification
Wait for NSNotification before continuing
我确定有一个简单的解决方案,但我不知道如何实现。我正在为我的 iOS 应用程序编写 UI 单元测试(目前在 Objective C 但也很高兴 Swift 解决方案)以便我可以使用 Fastlane 的 snapshot
命令,但由于该应用程序是基于云的,因此只需在 tabs/views 和截屏之间切换是行不通的,因为截屏将只有 "Loading...",因为我希望其中包含有效数据。
我目前的解决方案丑陋且不可靠。目前我只是通过 sleep(3)
等待 3 秒然后继续。我正在使用 AFNetworking 来执行请求,所以我只能监听传入的任何 HTTP 请求,如果它与我想要的请求匹配,我可以继续,但我不确定:
- A:如何抓取所有入站流量
- B:如何在我传递 "ok" 消息之前停止进一步执行。
任何想法或帮助将不胜感激,因为我不喜欢手动拍摄数百张屏幕截图 =)
大多数时候,当我看到开发人员遇到此类问题时,那是因为系统架构不佳。但是我想对于如何构建系统从来没有正确的答案。无论如何,不要创建线性测试用例,而是创建使用事件的状态机测试用例。这样你就可以设置你的测试。设置完成后,您告诉您的线程去等待您的事件队列。 thread/process 将等待事件。然后,当您收到 httpRequest 时,10 秒 - 或分钟 - 或者无论以后需要多长时间,您都可以通过事件通过测试。如果状态机超时,则测试失败。
有效 UI 测试的编写方式与单元测试和生产代码不同。 UI 应该从用户的角度编写测试,而不关心应用 "under the hood" 发生了什么。例如,您的测试应该等待特定的 UI 元素出现,而不是等待 NSNotification 触发或特定网络请求完成。
等待元素出现
假设您的第一个 tab/screen 显示用户信息。该数据中包含用户的用户名。您可以使用 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 Testing cheat sheet I put together. It also has a working example app,您可以 运行 在 Xcode 中使用代码和测试。
我确定有一个简单的解决方案,但我不知道如何实现。我正在为我的 iOS 应用程序编写 UI 单元测试(目前在 Objective C 但也很高兴 Swift 解决方案)以便我可以使用 Fastlane 的 snapshot
命令,但由于该应用程序是基于云的,因此只需在 tabs/views 和截屏之间切换是行不通的,因为截屏将只有 "Loading...",因为我希望其中包含有效数据。
我目前的解决方案丑陋且不可靠。目前我只是通过 sleep(3)
等待 3 秒然后继续。我正在使用 AFNetworking 来执行请求,所以我只能监听传入的任何 HTTP 请求,如果它与我想要的请求匹配,我可以继续,但我不确定:
- A:如何抓取所有入站流量
- B:如何在我传递 "ok" 消息之前停止进一步执行。
任何想法或帮助将不胜感激,因为我不喜欢手动拍摄数百张屏幕截图 =)
大多数时候,当我看到开发人员遇到此类问题时,那是因为系统架构不佳。但是我想对于如何构建系统从来没有正确的答案。无论如何,不要创建线性测试用例,而是创建使用事件的状态机测试用例。这样你就可以设置你的测试。设置完成后,您告诉您的线程去等待您的事件队列。 thread/process 将等待事件。然后,当您收到 httpRequest 时,10 秒 - 或分钟 - 或者无论以后需要多长时间,您都可以通过事件通过测试。如果状态机超时,则测试失败。
有效 UI 测试的编写方式与单元测试和生产代码不同。 UI 应该从用户的角度编写测试,而不关心应用 "under the hood" 发生了什么。例如,您的测试应该等待特定的 UI 元素出现,而不是等待 NSNotification 触发或特定网络请求完成。
等待元素出现
假设您的第一个 tab/screen 显示用户信息。该数据中包含用户的用户名。您可以使用 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 Testing cheat sheet I put together. It also has a working example app,您可以 运行 在 Xcode 中使用代码和测试。