gpt4 book ai didi

ios - 我如何编写一个 UI 测试来启动带有推送通知有效负载的应用程序并验证您是否被路由到正确的 View ?

转载 作者:搜寻专家 更新时间:2023-10-31 08:17:43 26 4
gpt4 key购买 nike

我正在 iOS 应用程序中实现推送通知,在这样做的过程中,我想编写一个 UI 测试来验证应用程序在使用特定推送通知有效负载(即应用导航到正确的表格 View 并突出显示正确的单元格)。

这能做到吗?我似乎找不到任何人以前做过这个或以前问过这个问题。

感谢任何指点。

最佳答案

借助 Xcode 9,您现在可以在 UITest 中实际测试远程通知处理。我使用一个名为 NWPusher 的框架实现了它

我写了很长blogpost关于我的实现并向 github 添加了一个演示项目.

这是我所做的简短描述:

准备

  1. 将 NWPusher 添加到您的 UITest 目标(我使用 Carthage)
  2. 从 Apple 的开发中心为您的应用下载 APN 开发证书
  3. 在 Keychain 中打开该证书并将其导出为 p12 文件
  4. 将此文件添加到 IUTest 目标
  5. 使 deviceToken 对 UITestRunner 可用

编写测试

测试执行以下步骤:

  1. 创建对应用和 Springboard 的引用
  2. 启动应用程序并通过点击主页按钮将其关闭(如果弹出系统对话框请求许可,请关闭它)
  3. 触发远程通知(使用 NWPusher)
  4. 从 Springboard 查询远程通知横幅并点击它
  5. 测试您的应用是否正确处理了远程通知
  6. 关闭应用程序并测试下一种远程通知

在我的演示中,不同类型的通知会在应用程序中触发不同颜色的模态视图 Controller 。所以我的测试类看起来像这样

import XCTest
import PusherKit

class PushNotificationUITests: XCTestCase {

override func setUp() {
super.setUp()
continueAfterFailure = false
}

func testPushNotifications() {
let app = XCUIApplication()
app.launchArguments.append("isRunningUITests")
let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")

app.launch()

// dismiss the system dialog if it pops up
allowPushNotificationsIfNeeded()

// get the current deviceToken from the app
let deviceToken = app.staticTexts.element(matching: .any, identifier: "tokenLabel").label

// close app
XCUIDevice.shared.press(XCUIDevice.Button.home)
sleep(1)

// trigger red Push Notification
triggerPushNotification(
withPayload: "{\"aps\":{\"alert\":\"Hello Red\"}, \"vcType\":\"red\"}",
deviceToken: deviceToken)

// tap on the notification when it is received
springboard.otherElements["PUSHNOTIFICATION, now, Hello Red"].tap()

// check if the red view controller is shown
XCTAssert(app.staticTexts["Red"].exists)

// dismiss modal view controller and close app
app.buttons["Close"].tap()
XCUIDevice.shared.press(XCUIDevice.Button.home)
sleep(1)

// trigger green Push Notification
triggerPushNotification(
withPayload: "{\"aps\":{\"alert\":\"Hello Green\"}, \"vcType\":\"green\"}",
deviceToken: deviceToken)

// tap on the notification when it is received
springboard.otherElements["PUSHNOTIFICATION, now, Hello Green"].tap()

// check if the green view controller is shown
XCTAssert(app.staticTexts["Green"].exists)

// dismiss modal view controller and close app
app.buttons["Close"].tap()
XCUIDevice.shared.press(XCUIDevice.Button.home)
sleep(1)

// trigger blue Push Notification
triggerPushNotification(
withPayload: "{\"aps\":{\"alert\":\"Hello Blue\"}, \"vcType\":\"blue\"}",
deviceToken: deviceToken)

// tap on the notification when it is received
springboard.otherElements["PUSHNOTIFICATION, now, Hello Blue"].tap()

// check if the blue view controller is shown
XCTAssert(app.staticTexts["Blue"].exists)

// dismiss modal view controller
app.buttons["Close"].tap()
}
}

extension XCTestCase {
func triggerPushNotification(withPayload payload: String, deviceToken: String) {
let uiTestBundle = Bundle(for: PushNotificationUITests.self)
guard let url = uiTestBundle.url(forResource: "pusher.p12", withExtension: nil) else { return }

do {
let data = try Data(contentsOf: url)
let pusher = try NWPusher.connect(withPKCS12Data: data, password: "pusher", environment: .auto)
try pusher.pushPayload(payload, token: deviceToken, identifier: UInt(arc4random_uniform(UInt32(999))))
} catch {
print(error)
}
}

func allowPushNotificationsIfNeeded() {
addUIInterruptionMonitor(withDescription: "“RemoteNotification” Would Like to Send You Notifications") { (alerts) -> Bool in
if(alerts.buttons["Allow"].exists){
alerts.buttons["Allow"].tap();
}
return true;
}
XCUIApplication().tap()
}
}

这只适用于物理设备,因为远程通知在模拟器中不起作用。

关于ios - 我如何编写一个 UI 测试来启动带有推送通知有效负载的应用程序并验证您是否被路由到正确的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42396500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com