在继续之前等待NSNotification

时间:2016-04-21 04:00:03

标签: ios objective-c swift xcode-ui-testing fastlane-snapshot

我确信有一个简单的解决方案,但我不知道如何实现它。我正在为我的iOS应用程序编写UI单元测试(目前在Objective C中,但也对Swift解决方案感到高兴),因此我可以使用Fastlane的snapshot命令,但由于该应用程序基于云的简单在标签/视图之间切换并拍摄屏幕截图不会起作用,因为屏幕截图只会有#34;正在加载......"在哪里,我喜欢它们中的有效数据。

我目前的解决方案是丑陋和不可靠的。目前,我只需等待3秒钟sleep(3),然后继续进行。我使用AFNetworking来执行请求,所以我只是可以听到任何HTTP请求,如果它与我想要的那个匹配,我可以继续,但我不确定:<\ n / p>

  • 答:如何捕获所有入站流量
  • B:如何停止进一步执行,直到我通过&#34; ok&#34;消息。

任何想法或帮助都会受到高度赞赏,因为我不喜欢手动拍摄数百个屏幕截图=)

2 个答案:

答案 0 :(得分:1)

大多数时候,当我看到开发人员遇到这种问题时,这是因为系统架构很差。但是,我想对于如何构建系统永远不会有正确的答案。无论如何,不​​是创建线性测试用例而是创建使用事件的状态机测试用例。这样你就可以设置你的测试。设置完成后,告诉您的线程等待事件队列。线程/进程将等待事件。然后,当您获得httpRequest,10秒 - 或分钟 - 或者稍后需要多长时间时,您可以通过事件传递测试。如果状态机中存在超时,则表示您未通过测试。

答案 1 :(得分: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 Testing cheat sheet。它还有一个working example app,您可以在Xcode中运行并使用代码和测试。