我尝试在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()
}
}
但我似乎无法找到我设置的参数和环境。有人知道怎么抓住他们吗?
答案 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") {
}
要设置环境变量,请分别使用launchEnvironment
和NSProcessInfo.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
}