2017-10-10 3 views
0

Mon application utilise les services de localisation et j'ai du code qui alerte l'utilisateur si les services de localisation sont désactivés. Cela a un bouton qui leur permet de passer à l'application Paramètres et l'activer. Cela fonctionne bien, mais je veux écrire un test d'interface utilisateur qui le détecte, si possible.Test de l'interface utilisateur IOS: comment déterminer si l'application testée est passée à l'application Paramètres?

Actuellement, mes tests d'interface utilisateur fonctionnent correctement en vérifiant l'apparition de l'alerte et son bouton Paramètres. Je peux confirmer que l'application passe aux paramètres via le simulateur ou le périphérique physique lorsque le bouton est appuyé.

Je ne suis pas sûr que je peux dire que les paramètres lui-même l'application apparaît à travers le UITest (ce serait bien!), Mais je pourrais vérifier que l'application en cours de test est entré dans l'arrière-plan (ce serait assez bon!)

Dans mon AppDelegate je imprimer des relevés qui confirment l'application traverse applicationWillResignActive (...) et applicationDidEnterBackground (...)

J'ai essayé les éléments suivants:

let predicate = NSPredicate(format: "self.state = XCUIApplication.State.runningBackground", argumentArray: nil) 

_ = self.expectation(for: predicate, evaluatedWith: app, handler: nil) 
waitForExpectations(timeout: 10.0, handler: nil) 

XCTAssertTrue(app.state == .runningBackground, "Doesn't look like the Settings App was launched") 

et la console est en berne que c'est wai Ting sur l'attente - il se connecte chaque seconde. Notez que 'app' est l'instance de XCUIApplication() que j'utilise dans le test. Finalement, l'attente expire et le test se termine parce qu'il n'a pas été rempli. À ce stade, mes deux instructions d'impression (démission active, entrée en arrière-plan) apparaissent sur la console.

Il semblerait que mon application fonctionne comme prévu mais que l'attente ne détermine pas le changement d'état de l'application. J'ai essayé de régler la période d'attente à 60 secondes, mais le résultat est le même, donc ce n'est pas le cas de ne pas attendre assez longtemps.

Sans l'attente, c'est-à-dire que le code passe directement d'appuyer sur le bouton de réglages pour vérifier l'affirmation, l'assertion échoue parce que l'état de l'application est .runningForeground. Je pensais que l'exécution se passait trop vite, d'où la tentative d'attendre le changement d'état. Dans ce cas, l'assertion échoue, le test se termine et "Resigning active" apparaît dans la console, mais pas "Entrer en arrière-plan".

Ceci est ios11 sur Xcode 9 et le comportement est le même dans le simulateur et le périphérique physique. En résumé, la question est la suivante: quelle est la meilleure façon de tester par programme que l'application Settings a été lancée?

Répondre

1

Donc, il semblerait que je suis trop compliqué! En attendant une réponse, j'ai pensé que je verrais si je pouvais vérifier si un élément de l'interface utilisateur devenait inactif ou similaire. C'est à ce moment que j'ai découvert:

app.wait(for: .runningBackground, timeout: 10) 

Ce qui retourne vrai lorsque cet état est atteint! Et il fonctionne. Évidemment, je ne sais pas si l'application en cours d'exécution est des paramètres, mais il est assez bon que la seule raison pour que cet état soit atteint dans ce test d'interface utilisateur est si l'URL des paramètres activé.