Xcode UI 使用登录系统测试

Xcode UI tests with login system

我有一个带有登录系统的应用程序,所以一旦用户登录该应用程序,我就会将他们的会话存储在本地数据库中,这样可以防止用户每次使用该应用程序时都必须登录。显然,如果用户尚未登录,应用程序会显示 LoginViewController,但如果应用程序检测到用户的当前会话,则会显示 HomeViewController

我已经为我的 HomeViewController 创建了一些测试,它们都运行良好。但是,我意识到它们工作正常,因为该应用程序当前存储了一个会话。如果我进入应用程序并注销当前用户,当我 运行 和 UI 测试时,它们将失败。这是有道理的,因为测试期望显示 HomeViewController,而不是显示 LoginViewController

考虑到我还想为 LoginViewController 创建 UI 测试,创建一个解决方案似乎是合理的,在每个测试中,我设置用户是否登录.我该怎么做?

经过一些研究,在 XCUIApplication 启动 arguments/environments 找到了答案。这允许您在执行测试时发送某些配置,稍后可以由您的主代码解释。

为了让我的案例生效,我放置了以下代码:

// UI Test
func testWelcomeIsShown() {
   let app = XCUIApplication()
   app.launchArguments.append("isUITestingLogin")
   app.launch()
   // Rest of your test steps
}

// AppDelegate or wherever you fetch your current session
func getCurrentSession() {
    if NSProcessInfo.processInfo().arguments.contains("isUITestingLogin") {
        session = nil
    } else {
        session = DatabaseManager.getSession()
    }
}

注意:此代码将用于记录和执行您的测试。但是,如果您确实有多个具有相同逻辑的测试,您可能会将 testWelcomeIsShown() 的前 3 行移动到测试 class 的 setUp()。不过需要注意的是,这个设置在录制测试的时候并没有执行,所以你需要手动设置一个没有当前会话的环境。

您也可以使用 SBTUITestTunnel,除其他外,它允许您将文件从测试目标上传到应用程序的沙箱。准备一个带有预填充登录信息的数据库就足够了,然后在启动时将其发送到应用程序的目标。

库的美妙之处在于应用程序的代码不会被测试代码污染。