2017-02-22 11 views
4

Я внедряю push-уведомления в приложении iOS, и по мере того, как я это делаю, я хочу написать тест UI, который проверяет, что приложение делает правильную вещь, когда оно запускается с определенной полезной нагрузкой push-уведомления (то есть приложение переходит к правильному представлению таблицы и подсвечивает правильную ячейку).Как написать тест пользовательского интерфейса, который запускает приложение с помощью полезной нагрузки push-уведомления и проверяет, что вы перенаправлены в правильное представление?

Можно ли это сделать? Я не могу найти кого-либо, кто сделал это раньше или задал этот вопрос раньше.

Благодарен за любые указатели.

+0

Можете ли вы добавить код, который обрабатывает полезную нагрузку push-уведомления, когда пользователь открывает приложение через push-уведомление? – joern

+0

Ну, конечно, я мог бы, но это очень специфично для проекта. Приложение, над которым я работаю, принимает push-уведомления из 6 разных типов, поэтому сначала он пытается определить, какой тип push-уведомления он получил. Затем, в зависимости от того, какой тип уведомления он получил, он переходит к правильному виду. Иногда это означает одно, а иногда это означает делать несколько вещей. – vrutberg

ответ

3

С Xcode 9 теперь вы можете фактически проверить Remote обработку в UITest Notification. Я реализовал это с использованием рамки под названием NWPusher

Я написал длинную blogpost о своей реализации и добавил демонстрационный проект на github.

Вот краткое описание того, что я сделал:

Подготовка

  1. Добавить NWPusher к цели UITest (я использовал Карфаген)
  2. Загрузить сертификат APN развития для вашего приложения из Apple Dev Center
  3. Открыть этот сертификат в Keychain и экспортировать его как файл p12
  4. Добавить этот файл t О, IUTest целевой
  5. Сделать deviceToken доступны UITestRunner

Написать тест

Тест выполняет следующие действия:

  1. Создать ссылку на приложение а Springboard
  2. Запустите приложение и закройте его, нажав кнопку «домой» (отклоните системный диалог с просьбой разрешить, если он появится)
  3. Trigger удаленного оповещения (с использованием NWPusher)
  4. запрос дистанционное уведомление баннера от трамплин и нажмите на него
  5. Test, если удаленные уведомления было обработано правильно приложение
  6. Закройте приложение и проверить следующее тип удаленного уведомления

В моей демонстрации различные типы уведомлений запускают по-разному цветной вид контроллера вида в приложении. Так что мой тестовый класс выглядит следующим образом

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() 
    } 
} 

это работает только на физическом устройстве, так как удаленные уведомления не работают в тренажере.

0

Вы можете отправить уведомление с этим library. К сожалению, вы должны добавить тестовый код в свой класс AppDelegate. Я использую собственные макросы препроцессора в отдельной целевой программе приложения (UITEST=1).

Build Settings Tab Где-то в вашем коде:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // ... 
    #if UITEST 
     // setup listening 
    #endif 
} 
0

Основано на joern замечательной статье, I took a step forward и нашел способ программно взаимодействовать с полученным уведомлением, поскольку он идентифицируется каркасом XCTest как XCUIElement.

Как мы можем получить ссылку на Sprinboard

let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") 

Например, при вводе приложение на заднем плане мы могли бы получить ссылку на полученное уведомление (в то время как оно отображается в верхней части экран), как это:

let notification = springboard.otherElements["NotificationShortLookView"] 

Позволяющие нажмите на уведомление:

notification.tap() 

Потяните его вниз, чтобы увидеть его действия (если таковые имеются.Кроме того, делая это может позволить нам увидеть содержание Rich оповещения):

notification.swipeDown() 

Взаимодействовать с его действиями:

let action = springboard.buttons["ACTION BUTTON TITLE"] 
action.tap() 

И даже взаимодействовать с действием уведомления ввода текста (в примере, получив ссылку на уведомление текстовое поле по его заполнителем, который вы можете определить в коде):

let notificationTextfield = springboard.textFields["Placeholder"] 
notificationTextfield.typeText("this is a test message") 

наконец, вы можете также получить ссылку на уведомление, в непосредственной б utton для того, чтобы отклонить его:

let closeButton = springboard.buttons["Dismiss"] 
closeButton.tap() 

По возможности автоматизировать это взаимодействие мы могли бы проверить, например, аналитику, как описано в этом article.

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/18959900) – technerd

+0

@technerd Спасибо за обзор. Надеюсь, последние изменения в ответе сделают его понятным и ценным. –