web-dev-qa-db-fra.com

Comment accéder à launchEnvironment et launchArguments définis dans XCUIApplication, exécutant des tests d'interface utilisateur dans XCode?

J'ai essayé de définir des attributs dans l'instance XCUIApplication, dans mes tests d'interface utilisateur setUp()

let app = XCUIApplication()
app.launchEnvironment = ["testenv" : "testenvValue"]
app.launchArguments = ["anArgument"]
app.launch()

dans didFinishLaunch J'ai essayé de les afficher à l'écran lorsque j'exécute mes UITests

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    if launchOptions != nil {
        for (key, value) in launchOptions! {  
            let alertView = UIAlertView(title: key.description, message: value.description, delegate: nil, cancelButtonTitle: "ok")
            alertView.show()
        }
    }

Mais je n'arrive pas à trouver les arguments et l'environnement que j'ai définis. Quelqu'un sait-il comment les obtenir?

41
bogen

Si vous définissez launchArguments dans un test d'interface utilisateur (Swift):

let app = XCUIApplication()
app.launchArguments.append("SNAPSHOT")
app.launch()

Lisez-les ensuite dans votre application en utilisant:

Swift 2.x:

if NSProcessInfo.processInfo().arguments.contains("SNAPSHOT") {
   // Do snapshot setup
}

Swift 3.

if ProcessInfo.processInfo.arguments.contains("SNAPSHOT") {
}

Pour définir les variables d'environnement, utilisez à la place launchEnvironment et NSProcessInfo.processInfo().environment.

56
Joey C.

En s'appuyant sur la réponse de Joey C., j'ai écrit une petite extension pour éviter d'utiliser des chaînes brutes dans l'application. De cette façon, vous évitez tout problème de frappe et obtenez la saisie semi-automatique.

extension NSProcessInfo {
    /**
     Used to recognized that UITestings are running and modify the app behavior accordingly

     Set with: XCUIApplication().launchArguments = [ "isUITesting" ]
     */
    var isUITesting: Bool {
        return arguments.contains("isUITesting")
    }

    /**
     Used to recognized that UITestings are taking snapshots and modify the app behavior accordingly

     Set with: XCUIApplication().launchArguments = [ "isTakingSnapshots" ]
     */
    var isTakingSnapshots: Bool {
        return arguments.contains("isTakingSnapshots")
    }
}

De cette façon, vous pouvez utiliser

if NSProcessInfo.processInfo().isUITesting {
   // UITesting specific behavior,
   // like setting up CoreData with in memory store
}

Pour aller plus loin, les différents arguments devraient probablement entrer dans une énumération qui pourrait être réutilisée dans UITest lors de la définition de launchArguments.

16
Nycen

Voici un exemple avec launchArguments et Objective-C:

if ([[NSProcessInfo processInfo].arguments containsObject:@"SNAPSHOT"]) {
        //do snapshot;
}

Rapide:

    let arguments = ProcessInfo.processInfo.arguments
    if arguments.contains("SNAPSHOT") {
        //do snapshot
    }
8

Il est également intéressant de noter que les arguments passés à XCUIApplication.launchArguments sont également disponibles à partir de UserDefaults.

Dans votre XCTestCase

let app = XCUIApplication()
app.launchArguments.append("-ToggleFeatureOne")
app.launchArguments.append("true")
app.launch()

Dans votre cible en cours de test

UserDefaults.standard.bool(forKey: "ToggleFeatureOne") // returns true

De là, vous pouvez créer des extensions sur UserDefaults pour fournir des bascules d'exécution pratiques.

Il s'agit du même mécanisme utilisé par les schémas Xcode "arguments transmis au lancement". Les arguments de lancement et leur effet sur UserDefaults sont documentés sous Guide de programmation des préférences et paramètres .

7
Jessedc

Pour les arguments de lancement, passez-les en deux arguments distincts:

let app = XCUIApplication()  
app.launchArguments.append("-arg")  
app.launchArguments.append("val")  
app.launch()

Tiré de ici .

6
Avi Cohen

Gardez à l'esprit quelques détails. Premièrement, XCUIAppliction n'est pas un singleton, par conséquent, si vous appelez XCUIApplication().arguments.append("myargument") puis vous appelez XCUIApplication().launch(), il n'enverra pas les arguments. Vérifiez-le ici .

Deuxièmement, si vous modifiez les arguments après le lancement de l'application, cela ne fonctionnera pas, il enverra les nouveaux arguments à la prochaine exécution.

Je sais seulement comment cela fonctionne dans Objective-C

NSDictionary *environment = [[NSProcessInfo processInfo] environment];
3
Ceetn

Si vous devez passer les variables d'environnement de votre schéma à XCUITes, modifiez l'objet XCTestCase -> app.launchEnvironment, sur chaque classe de test de cette façon:

Swift

override func setUp(){
    app.launchEnvironment = ProcessInfo.processInfo.environment
}
1
Maetschl