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

j'ai essayé de définir des attributs dans le XCUIApplication Exemple, dans mes tests D'interface utilisateur setUp()

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

didFinishLaunch j'ai essayé de les montrer à l'écran quand j'ai lancé mes Uitest

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 mis. Quelqu'un sait comment obtenir une prise de eux?

36
demandé sur jarlh 2015-10-07 12:11:09

8 réponses

Si vous définissez launchArguments dans un Test de l'INTERFACE utilisateur (Swift):

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

puis les lire dans votre application en utilisant:

swift 2.x:

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

Swift 3.0

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

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

47
répondu Joey C. 2017-02-23 11:14:31

en me basant 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 typographie et obtenir autocomplete.

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 un enum qui pourrait être réutilisé dans les UITest lors de la mise en place des launchArguments.

13
répondu Nycen 2016-02-22 07:35:30

voici un exemple avec launchArguments et Objective-C:

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

Swift:

    let arguments = ProcessInfo.processInfo.arguments
    if arguments.contains("SNAPSHOT") {
        //do snapshot
    }
7
répondu AlekseiPetrovski 2017-09-25 18:01:45

pour les arguments de lancement, passez - les comme deux arguments séparés:

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

Pris ici.

4
répondu Avi Cohen 2016-07-09 10:33:26

je suis seulement conscient de la façon dont cela fonctionne dans L'objectif-C

NSDictionary *environment = [[NSProcessInfo processInfo] environment];
3
répondu Ceetn 2015-10-07 10:31:25

garder à l'esprit quelques détails. Tout d'abord, XCUIAppliction n'est pas un singleton, donc, si vous appelez XCUIApplication().arguments.append("myargument") et puis vous appelez XCUIApplication().launch(), il n'envoie pas les arguments. Vérifier ici.

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

2
répondu Hola Soy Edu Feliz Navidad 2018-02-24 08:09:29

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 sous test

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

A partir de là vous pouvez créer des extensions sur UserDefaults pour fournir des basculements de temps de course pratiques.

c'est le même mécanisme que le schéma Xcode "arguments transmis au lancement" utilise. Les arguments de lancement et leur effet sur UserDefaults sont documenté sous Préférences et des Paramètres Guide de Programmation.

2
répondu Jessedc 2018-05-28 07:28:50

si vous avez besoin passer le variables d'environnement de votre schéma vers XCUITes, modifiez XCTestCase - > app.objet launchEnvironment, sur chaque classe test de cette façon:

Swift 3

override func setUp(){
    app.launchEnvironment = ProcessInfo.processInfo.environment
}
1
répondu Maetschl 2017-04-08 16:32:11