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

How to get to Authorized part in Xcode UI Tests

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

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

我有几个想法:

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

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

您知道什么是最好的方法吗?也许您可以提供更好的建议?

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

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

当然,这些 "shortcuts" 只能在 运行 一个 debug 配置(使用 #if DEBUG...

时访问

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

为此,您的服务应全部表示为接口/protocols,并且 implementation/implementation 详细信息应在生产、开发或自动化 testing 环境中。

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

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

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

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