How to access launchEnvironment and launchArguments set in XCUIApplication, running UI tests in XCode?

前端 未结 8 874
陌清茗
陌清茗 2020-12-08 00:30

I\'ve tried setting attributes in the XCUIApplication instance, in my UI Tests setUp()

let app = XCUIApplication()
app.launchEnviro         


        
相关标签:
8条回答
  • 2020-12-08 00:46

    Bear in mind a few details. Firstly, XCUIAppliction is not a singleton, therefore, if you call XCUIApplication().arguments.append("myargument") and then you call XCUIApplication().launch(), it won't send the arguments. Check it here.

    Second, if you modify the arguments after launching the app it won't work, it will send the new arguments to the next execution.

    0 讨论(0)
  • 2020-12-08 00:46

    I'm only aware of how this works in Objective-C

    NSDictionary *environment = [[NSProcessInfo processInfo] environment];
    
    0 讨论(0)
  • 2020-12-08 00:57

    It's also interesting to note that arguments passed to XCUIApplication.launchArguments are also available from UserDefaults.

    In your XCTestCase

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

    In your target under test

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

    From here you could create extensions on UserDefaults to provide handy run time toggles.

    This is the same mechanism the Xcode schemes "arguments passed on launch" uses. Launch arguments and their effect on UserDefaults are documented under Preferences and Settings Programming Guide.

    0 讨论(0)
  • 2020-12-08 01:00

    Building on Joey C.'s answer, I wrote a small extension to avoid using raw strings in the app. This way you avoid any typo issue and get autocompletion.

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

    This way you can use

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

    Going further, the various arguments should probably go into an enum that could be reused in the UITest when setting the launchArguments.

    0 讨论(0)
  • 2020-12-08 01:04

    If you need pass the environment variables from your schema to XCUITes, modify the XCTestCase -> app.launchEnvironment object, on each test class of this way:

    Swift 3

    override func setUp(){
        app.launchEnvironment = ProcessInfo.processInfo.environment
    }
    
    0 讨论(0)
  • 2020-12-08 01:06

    If you set launchArguments in a UI Test (Swift):

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

    Then read them in your App using:

    swift 2.x:

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

    Swift 3.0

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

    To set environment variables, use launchEnvironment and NSProcessInfo.processInfo().environment, respectively, instead.

    0 讨论(0)
提交回复
热议问题