如何访问在XCUIApplication中设置的launchEnvironment和launchArguments,在XCode中运行UI测试?

时间:2015-10-07 09:11:10

标签: ios xcode swift ui-testing

我尝试在XCUIApplication实例中设置属性,在我的UI测试中setUp()

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

didFinishLaunch我尝试在运行我的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()
        }
    }

但我似乎无法找到我设置的参数和环境。有人知道怎么抓住他们吗?

8 个答案:

答案 0 :(得分:52)

如果在UI测试(Swift)中设置launchArguments

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

然后使用以下内容在您的应用中阅读:

swift 2.x

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

Swift 3.0

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

要设置环境变量,请分别使用launchEnvironmentNSProcessInfo.processInfo().environment

答案 1 :(得分:14)

基于Joey C.的回答,我写了一个小扩展,以避免在应用程序中使用原始字符串。这样就可以避免任何错字问题并获得自动完成功能。

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

这样你可以使用

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

更进一步,各种参数应该进入枚举,可以在设置launchArguments时在UITest中重用。

答案 2 :(得分:7)

以下是launchArguments和Objective-C的示例:

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

夫特:

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

答案 3 :(得分:6)

对于启动参数,将它们作为两个单独的参数传递:

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

取自here

答案 4 :(得分:5)

值得注意的是,传递给XCUIApplication.launchArguments的参数也可以从UserDefaults获得。

在您的XCTestCase

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

在您的目标中

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

从这里开始,您可以在UserDefaults上创建扩展程序,以便提供方便的运行时切换。

这是Xcode方案"在启动时传递的参数的相同机制"使用。启动参数及其对UserDefaults的影响记录在Preferences and Settings Programming Guide下。

答案 5 :(得分:4)

请记住一些细节。首先,XCUIAppliction不是单例,因此,如果你调用XCUIApplication().arguments.append("myargument")然后调用XCUIApplication().launch(),它将不会发送参数。 Check it here

其次,如果在启动应用程序后修改参数它将无效,它会将新参数发送到下一次执行。

答案 6 :(得分:3)

我只知道它在Objective-C中是如何工作的

Tuple<List<string>, int>

答案 7 :(得分:1)

如果您需要将环境变量从架构传递给XCUITes,请修改XCTestCase - &gt; app.launchEnvironment对象,在这种方式的每个测试类上:

Swift 3

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