推送通知用户界面测试

如果您曾经尝试过手动测试推送通知,则知道它们会很痛苦。 首先,您必须将应用程序加载到设备(而不是模拟器)上,通过应用程序流程,确保已关闭/打开应用程序,等等。能够自动执行这种测试不是很好吗?

  • 确保您的应用一般设置为推送通知(已启用权利,从开发人员门户生成的推送证书)
  • 确保在运行UI测试时将您的应用配置为指向localhost:8080作为其域
  • 您应用的info.plist必须在App Transport Security Settings NSAllowsLocalNetworkingApp Transport Security Settings NSAllowsLocalNetworking 。 没有此设置,您的应用将无法连接到localhost域。

模拟服务器

这里有几个Swift服务器库。 有一些用于生产就绪的Web服务器(例如Perfect,Vapor等框架),但是我们想要的是轻便的东西。 我一直在使用Swifter(https://github.com/httpswift/swifter),但是您也可以尝试使用Embassy(https://github.com/envoy/Embassy)。 本文中的示例使用Swifter。

在我的UI测试目标中,我为模拟服务器添加了以下类:

如果将它分解成小块,这很简单。 它只有3种方法:1)启动方法2)清理方法,以及3)设置设备令牌端点的方法(在此示例中为/pushEndpoint

现在,确保将设备令牌发送到模拟服务器

设置应用

在您的代码中,几乎可以肯定,您有一个将设备令牌发送到远程服务器的功能。 您必须做的是确保在运行UI测试时,将此URL请求的主机设置为localhost:8080

实际上,您应该做的是1)运行UI测试时通过启动选项发送一个标志,或者2)设置一个表明您正在运行要切换到的UI测试的编译器标志。 为了简洁起见,我只是在下面的AppDelegate类中对/pushEndpoint的请求进行硬编码localhost:8080

我们设置的最后一步是设置一种方法,以从测试运行程序发送推送通知。

从测试运行器发送推送通知

以下是我用于从UI测试运行程序发送推送的代码(将此代码放入UI测试目标中):

如您在上面看到的,我们要做的第一件事是将为推送通知生成的证书加载到内存中(确保它是沙箱版本!)。 您应该将此文件添加到项目中,并确保它是UI测试目标的一部分。

之后,剩下要做的就是通过NWPusher库发送您的推送通知。 请确保您的通知格式正确。 样本推送通知有效负载可能如下所示:

  {“ aps”:{“ alert”:“测试消息”,“徽章”:1}} 

当然,通知会比这复杂得多,但这只是一个示例。

运行测试

现在终于可以进行测试了! 这是一个示例测试:

您会在上面的测试中注意到,我们同时利用了之前创建的模拟服务器和triggerPushNotification(withPayload:)函数。 如果一切顺利,您的测试应启动该应用程序,然后将其放在后台,然后将推送通知发送到您的设备,然后在UI测试上点击它!

而且我们完成了!

设置所有这些有点麻烦,但是我认为这是值得的。 测试推送通知始终是一件繁琐的事情,我觉得很多开发人员可能做得还不够。 有了像我们在这里介绍的那样的测试框架,在修改应用程序中的推送通知逻辑时,您可以更加放心。

一旦您的第一个测试启动并开始运行,别忘了测试应用程序的状态,例如被暂停,应用程序完全关闭并对不同的应用程序状态/视图做出反应。 但我会将其留给读者作为练习。

同样,请随时查看我在此处设置的示例项目:https://github.com/mds6058/PushNotificationUITesting。 如果您有任何疑问或想进一步讨论,请随时在Twitter(https://twitter.com/MattStanford3)上与我联系。

谢谢阅读!