使用 Cucumberish 在 XCUITest 设置中重置应用程序
Resetting app in XCUITest setup with Cucumberish
我正在尝试开始使用 XCUI测试我公司目前正在开发的 iOS 应用程序。此外,我正在使用 Cucumberish 来组织测试并使用我们现有的功能文件。
我们的应用程序要求用户在使用任何功能之前先登录,所以我想在每个测试场景之间重置应用程序状态以再次执行登录(Xcode 重新安装应用程序,但用户数据仍然存在并且该应用程序在第一次测试后将永远登录)。我一直在尝试很多不同的方法来实现这一点,但到目前为止没有运气。
自动启动 Springboard 以重新安装应用程序不起作用(数据未删除),我无法使用“@testable import”调用应用程序中定义的 类(所以我可以以编程方式清除数据),似乎没有办法在测试之间调用 shell 命令来硬重置模拟器。
我有选择吗?或者我是否必须在每个测试用例后通过 UI 手动 运行 来注销? (这对我来说听起来很不可靠 - 特别是如果测试失败)
是的,有一种方法可以实现这一点,我也在测试中使用它。
您应该使用 launchArguments
(或最终 launchEnvironment
)与您的应用对话。首先,在您的 setUp()
方法中,告诉您的应用它处于 UI-TESTING
模式:
override func setUp() {
super.setUp()
continueAfterFailure = true
app.launchArguments += ["UI-TESTING"]
}
然后,在您希望用户注销的每个测试中,通知您的应用它应该在调用 XCUIApplication.launch()
方法之前注销:
let app = XCUIApplication()
func testWithLoggedOutUser() {
app.launchArguments += ["logout"]
app.launch()
// Continue with the test
}
然后,在您的 AppDelegate.swift
文件中,阅读参数并采取相应行动:
class AppDelegate: UIResponder, UIApplicationDelegate {
static var isUiTestingEnabled: Bool {
get {
return ProcessInfo.processInfo.arguments.contains("UI-TESTING")
}
}
var shouldLogout: Bool {
get {
return ProcessInfo.processInfo.arguments.contains("logout")
}
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if AppDelegate.isUiTestingEnabled {
if shouldLogout {
// Call synchronous logout method from your app
// or delete user data here
}
}
}
}
我写了一篇关于在应用程序中设置本地状态的博客post,你可以看看here。
我正在尝试开始使用 XCUI测试我公司目前正在开发的 iOS 应用程序。此外,我正在使用 Cucumberish 来组织测试并使用我们现有的功能文件。
我们的应用程序要求用户在使用任何功能之前先登录,所以我想在每个测试场景之间重置应用程序状态以再次执行登录(Xcode 重新安装应用程序,但用户数据仍然存在并且该应用程序在第一次测试后将永远登录)。我一直在尝试很多不同的方法来实现这一点,但到目前为止没有运气。
自动启动 Springboard 以重新安装应用程序不起作用(数据未删除),我无法使用“@testable import”调用应用程序中定义的 类(所以我可以以编程方式清除数据),似乎没有办法在测试之间调用 shell 命令来硬重置模拟器。
我有选择吗?或者我是否必须在每个测试用例后通过 UI 手动 运行 来注销? (这对我来说听起来很不可靠 - 特别是如果测试失败)
是的,有一种方法可以实现这一点,我也在测试中使用它。
您应该使用 launchArguments
(或最终 launchEnvironment
)与您的应用对话。首先,在您的 setUp()
方法中,告诉您的应用它处于 UI-TESTING
模式:
override func setUp() {
super.setUp()
continueAfterFailure = true
app.launchArguments += ["UI-TESTING"]
}
然后,在您希望用户注销的每个测试中,通知您的应用它应该在调用 XCUIApplication.launch()
方法之前注销:
let app = XCUIApplication()
func testWithLoggedOutUser() {
app.launchArguments += ["logout"]
app.launch()
// Continue with the test
}
然后,在您的 AppDelegate.swift
文件中,阅读参数并采取相应行动:
class AppDelegate: UIResponder, UIApplicationDelegate {
static var isUiTestingEnabled: Bool {
get {
return ProcessInfo.processInfo.arguments.contains("UI-TESTING")
}
}
var shouldLogout: Bool {
get {
return ProcessInfo.processInfo.arguments.contains("logout")
}
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if AppDelegate.isUiTestingEnabled {
if shouldLogout {
// Call synchronous logout method from your app
// or delete user data here
}
}
}
}
我写了一篇关于在应用程序中设置本地状态的博客post,你可以看看here。