使用 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