在 UITest 中模拟推送通知

Posted

技术标签:

【中文标题】在 UITest 中模拟推送通知【英文标题】:Simulate Push Notification in UITest 【发布时间】:2017-11-15 09:24:06 【问题描述】:

我们想在 UITest 中测试推送通知的接收(当应用程序处于活动状态时)。发送真实推送通知的 goto 解决方案听起来有点矫枉过正(并且仅适用于真实设备):请参阅http://www.pixeldock.com/blog/testing-push-notifications-with-xcode-uitests/

我的问题是:是否可以从(UI)XCTestCase 调用(直接或间接)UIAppicaltionDelegate 的didReceiveRemoteNotification

【问题讨论】:

否,但您可以使用一些软件发送推送通知,而无需在服务器上实现 您能否提供有关您的建议的更多信息? 它将帮助您在不使用服务器的情况下发送测试推送通知。 github.com/noodlewerk/NWPusher 【参考方案1】:

您不能从 UITest 调用应用代码中的函数。 UITests 在单独的进程中运行,并且无法访问您应用的函数和方法。

来自 Apple 的文档:

UI 测试在根本上不同于单元测试。单元测试 使您能够在应用程序的范围内工作并允许您锻炼 可以完全访问您的应用程序变量的函数和方法,以及 状态。 UI 测试以与用户相同的方式练习您的应用程序的 UI 无需访问您应用的内部方法、函数和 变量。这使您的测试能够以与用户相同的方式查看应用程序 确实,暴露了用户遇到的 UI 问题。

UnitTest 中可以从测试中直接调用 didReceiveRemoteNotification。我不知道您的应用如何处理推送通知,但您是否可以使用可能是有效替代方案的单元测试来测试所需的结果。

【讨论】:

【参考方案2】:

您可以在 UITest 中触发应用中的事件。我之前通过将按钮放在我的视图上来做到这一点(一个限制是我必须将按钮添加到我希望事件发生的每个视图中)。

为确保仅在 UITesting 时添加按钮,请在 setUp() 函数中通过将元素附加到 launchArguments 数组来传入 launchArguments。

launchArguments.append("push_notification_button")

从应用内访问:

if ProcessInfo.processInfo.arguments.contains("push_notification_button") 
    // Add button

【讨论】:

这可行,但我对生产代码中的测试代码不满意。

以上是关于在 UITest 中模拟推送通知的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 模拟器中从 firebase 推送通知

无法在 ios 设备上模拟推送通知

Firebase 推送通知无法在手机上使用,但可以在模拟器中使用

在 Apple Watch 模拟器上推送通知

ios 8 Simulator,是不是可以向模拟器发送推送通知[重复]

解析推送通知仅在模拟器中工作