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

Posted

技术标签:

【中文标题】如何在 Xcode UI 测试中获得授权部分【英文标题】:How to get to Authorized part in Xcode UI Tests 【发布时间】:2019-10-21 06:36:04 【问题描述】:

我有带有登录屏幕的应用程序和登录后出现的屏幕(授权部分)。

从授权部分测试这些屏幕的最佳方法是什么?

我有几个想法:

1) 不知何故,我需要在每次测试之前从钥匙串中删除所有数据,然后我每次都通过整个流程进入登录后的第一个屏幕。当我需要向后端发送登录请求时,我使用

等待主屏幕
let nextGame = self.app.staticTexts["Main Screen Text"]
let exists = NSPredicate(format: "exists == true")
expectation(for: exists, evaluatedWithObject: nextGame, handler: nil)
waitForExpectations(timeout: 5, handler: nil)

2) 我在这里传递了一些参数

app = XCUIApplication(bundle:….)
    app.launchArguments = [“notEmptyArguments”:”value”]
    app.launch()

所以我可以传递一个假的token 并且后端将接受这个token,这样我的应用程序就会知道它必须将我路由到主屏幕并且所有请求都会成功,因为我的网络服务有这个假的token

但我认为这是一种不安全的方式。

你有什么想法什么是最好的方法,也许你可以提供更好的方法的建议?

【问题讨论】:

【参考方案1】:

您提到的第二个想法是在测试中跳过登录屏幕的好方法。此外,实现令牌传递也将有助于开发团队。这些启动参数可以存储在运行方案设置中。

此外,如果您以相同的方式实施深度链接,它将为 QA 和开发团队带来更多的速度提升。

当然,这些“快捷方式”只能在运行debug 配置时访问(使用#if DEBUG...

【讨论】:

感谢您的想法,现在我将您的答案标记为正确,除非其他人提供了一些新的想法来存档该目的【参考方案2】:

在我看来,您的登录服务或任何service 您的应用可能需要执行或显示一些用例,都应该是mocked。这意味着在您的自动化unit/ui testing 环境中,您的应用程序将与模拟服务实现进行对话,这意味着登录服务或授权服务响应应该被模拟为成功或失败,因此您可以同时测试它们。

要实现您的服务都应该表示为接口/protocols,并且实现/实现细节应该在生产、开发或自动化testing 环境中。

我绝不会在自动化测试中涉及任何网络。您应该创建授权服务的模拟实现,例如,在自动化测试环境中可以模拟根据您正在运行的测试给出成功或失败的响应(并且您可以在 setup() 方法中执行此设置)。

【讨论】:

这对于单元测试来说是正确的,我也是这样做的,但是对于 UI 测试来说这是不可能的,因为 UI 测试会在模拟器上启动你的真实应用程序 可以通过测试运行检测应用程序是否启动(您需要另一个启动参数)。然后,如果需要,您可以切换到假服务器。在 UI 测试中模拟事物的另一种(有时是更好的)方法是使用 EarlGrey 框架,尽管它仍处于测试阶段。【参考方案3】:

最真实的测试套件会在每次测试开始时登录(如果需要),并在适当的情况下在拆卸期间退出。这样可以使每个测试保持独立,并允许每个测试使用一组不同的凭据,而无需检查它是否已经登录/是否需要更改为不同的用户帐户,因为测试总是会在最后退出。

这不是一个万无一失的方法,因为如果测试失败,拆卸代码可能并不总是能够正确执行(因为应用程序可能不处于拆卸预期的状态,具体取决于您的实现)但是如果您正在寻找端到端测试,仅使用生产用户使用的代码路径,这是您可以做到的一种方式。

引入模拟/存根可以使您的测试更加独立和可靠 - 您可以选择在测试中反映生产用户体验的程度。

【讨论】:

以上是关于如何在 Xcode UI 测试中获得授权部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xcode10 Ui 测试中点击标签的特定单词?

Xcode UI 测试 - UITableView 部分

在 Xcode UI 测试中是不是可以获取视图的方向

如何在 Xcode 中运行单个 UI 测试

我如何在 Xcode 9 中录制(用于 UI 测试)

如何在现有的 ios 测试项目中启用 xcode 7 UI 测试