使用登录系统进行 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】:经过一番研究,在XCUIApplication
launch 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 11.1 尝试在 Safari 浏览器的登录屏幕中记录以编写 UI 测试时崩溃