使用黄瓜重置XCUITest安装程序中的应用

时间:2018-08-29 13:22:18

标签: testing xcuitest

我正在尝试针对我公司当前开发的iOS应用程序开始使用XCUITests。另外,我正在使用Cucumberish来组织测试并使用我们已经存在的功能文件。

我们的应用程序要求用户在使用任何功能之前先登录第一件事,因此我想在每个测试场景之间重置应用程序状态以再次执行登录(Xcode重新安装了该应用程序,但用户数据仍然保留,并且该应用程序将永远登录第一次测试后)。我一直在尝试许多不同的方法来完成此操作,但到目前为止还没有运气。

自动执行跳板以重新安装应用程序不起作用(未删除数据),我无法使用“ @testable import”调用应用程序中定义的类(因此我可以通过编程方式清除数据),似乎不是在两次测试之间调用shell命令以硬重置模拟器的方法。

我有选择吗?还是在每个测试用例之后都必须手动通过UI来注销? (对我来说,这听起来很不可靠-特别是如果测试失败)

1 个答案:

答案 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进行查看。