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

我已经尝试在XCUIApplication实例中设置属性,在我的UItestingsetUp()

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

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

但我似乎无法find我所设定的论据和环境。 任何人都知道如何抓住他们?

如果您在UI Test(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") { } 

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

build立在乔伊C.的答案,我写了一个小的扩展,以避免在应用程序中使用原始string。 这样你可以避免任何错字问题,并获得自动完成。

 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中重用。

下面是launchArguments和Objective-C的例子:

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

迅速:

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

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

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

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

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

从这里采取。

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

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

如果您需要将模式中的环境variables传递给XCUITes,请在每种testing类上修改XCTestCase – > app.launchEnvironment对象:

Swift 3

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