我正在尝试针对我公司当前开发的iOS应用程序开始使用XCUITests。另外,我正在使用Cucumberish来组织测试并使用我们已经存在的功能文件。
我们的应用程序要求用户在使用任何功能之前先登录第一件事,因此我想在每个测试场景之间重置应用程序状态以再次执行登录(Xcode重新安装了该应用程序,但用户数据仍然保留,并且该应用程序将永远登录第一次测试后)。我一直在尝试许多不同的方法来完成此操作,但到目前为止还没有运气。
自动执行跳板以重新安装应用程序不起作用(未删除数据),我无法使用“ @testable import”调用应用程序中定义的类(因此我可以通过编程方式清除数据),似乎不是在两次测试之间调用shell命令以硬重置模拟器的方法。
我有选择吗?还是在每个测试用例之后都必须手动通过UI来注销? (对我来说,这听起来很不可靠-特别是如果测试失败)
答案 0 :(得分:2)
是的,有一种方法可以实现,我也可以在测试中使用它。
您应该使用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
}
}
}
}
我写了一篇有关在应用程序中设置本地状态的博客文章,您可以通过here进行查看。