iOS - 在UITests Target中使用推送通知

时间:2017-07-08 12:55:00

标签: ios xcode testing configuration xcode-ui-testing

我需要在AppUITests中使用推送通知。有没有办法使用自定义权利文件添加/更新AppUITests目标的设置?

1 个答案:

答案 0 :(得分:1)

使用Xcode 9,您可以使用名为NWPusher

的框架在您的UITests中使用远程通知

要在您的UITests中测试远程通知,您必须执行以下步骤:

  1. 将NWPusher添加到您的UITest目标
  2. 从Apple的开发中心下载APN开发证书并将其添加到您的钥匙串(如果它还没有)
  3. 将证书导出为p12文件
  4. 编写测试
  5. 我试过了,这是我的测试文件:

    我的演示应用程序根据收到的推送通知提供三种不同的模态视图控制器。因此,此测试中有三种不同的推送通知。

    import XCTest
    import PusherKit
    
    class PushNotificationUITests: XCTestCase {
    
        override func setUp() {
            super.setUp()
            continueAfterFailure = false
        }
    
        func testPushNotifications() {
            let app = XCUIApplication()
            app.launchArguments.append("isRunningUITests")
            app.launch()
    
            // access to the springboard (to be able to tap the notification later)
            let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
    
            // 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()
        }
    }
    

    我写了详细的blogpost,您可以下载演示here