使用登录系统进行 Xcode UI 测试

Posted

技术标签:

【中文标题】使用登录系统进行 Xcode UI 测试【英文标题】:Xcode UI tests with login system 【发布时间】:2016-07-12 15:20:21 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

经过一番研究,在XCUIApplicationlaunch 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 行移动到测试类的setUp()。不过需要注意的是,这个设置在录制测试的时候是不会执行的,所以需要手动设置一个无当前会话环境。

【讨论】:

终于吓坏了...非常感谢...这解决了一个占用我生命 4 小时的问题【参考方案2】:

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

该库的美妙之处在于应用的代码没有被测试代码污染。

【讨论】:

以上是关于使用登录系统进行 Xcode UI 测试的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 在尝试进行涉及 web 视图的 UI 测试时崩溃

在 xcode 8 中登录的 UI 测试

Xcode 11.1 尝试在 Safari 浏览器的登录屏幕中记录以编写 UI 测试时崩溃

如何在 Xcode UI 测试中获得授权部分

iCloud UI 测试显示警报登录到 iCloud,尽管已登录并为应用程序启用了 iCloud

Xcode 7 UI 测试顺序