使用 Cucumberish 在 XCUITest 设置中重置应用程序
Posted
技术标签:
【中文标题】使用 Cucumberish 在 XCUITest 设置中重置应用程序【英文标题】:Resetting app in XCUITest setup with Cucumberish 【发布时间】:2018-08-29 13:22:17 【问题描述】:我正在尝试为我公司目前开发的 ios 应用程序开始使用 XCUITests。另外,我正在使用 Cucumberish 来组织测试并使用我们已经存在的功能文件。
我们的应用程序要求用户在使用任何功能之前首先登录,所以我想在每个测试场景之间重置应用程序状态以再次执行登录(Xcode 重新安装应用程序,但用户数据仍然存在,应用程序将永远登录第一次测试后)。我一直在尝试很多不同的方法来实现这一点,但到目前为止都没有运气。
自动化 Springboard 以重新安装应用程序不起作用(数据未删除),我无法使用“@testable import”调用应用程序中定义的类(因此我可以以编程方式清除数据),那里似乎不是一种在测试之间调用 shell 命令来硬重置模拟器的方法。
我有选择吗?或者我是否必须在每个测试用例后手动运行 UI 才能注销? (对我来说这听起来很不可靠——特别是如果测试失败)
【问题讨论】:
【参考方案1】:是的,有一种方法可以实现这一点,我也在测试中使用它。
您应该使用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。
【讨论】:
有趣的是,我设法让它完全像这样工作。只是没有调用注销方法(开发人员沟通不畅,所以我不太了解代码),我只是使用 SecItemDelete 删除所有钥匙串项。无论如何感谢您的回答!以上是关于使用 Cucumberish 在 XCUITest 设置中重置应用程序的主要内容,如果未能解决你的问题,请参考以下文章