代码之家  ›  专栏  ›  技术社区  ›  Paul T.

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

  •  0
  • Paul T.  · 技术社区  · 5 年前

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

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

    我有几个想法:

    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 后台会接受这个 代币 ,以便我的应用程序知道它必须将我路由到主屏幕,并且所有请求都将成功,因为我的网络服务具有此假 代币

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

    你知道什么是最好的方法吗?也许你能给出更好的方法的建议?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Roman Zakharov    5 年前

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

    此外,如果您以同样的方式实现深度链接,那么它将为QA和开发团队带来更多的速度增强。

    当然,这些“捷径”只能在运行 debug 配置(使用 #if DEBUG... )

        2
  •  1
  •   denis_lor    5 年前

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

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

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

        3
  •  1
  •   Oletha    5 年前

    最真实的测试套件将在每个测试开始时登录(如果需要),并在拆卸过程中注销(如果合适)。这将使每个测试保持独立,并允许每个测试使用不同的凭据集,而无需检查它是否已登录/需要更改为不同的用户帐户,因为测试将始终在最后注销。

    这并不是一个简单的方法,因为如果测试失败(因为应用程序可能不是teardown所期望的状态,这取决于您的实现),那么teardown代码不一定能够正确执行,但是如果您正在寻找端到端的测试,只使用生产用户使用的代码路径,这是一种可以做到的方法。

    引入mocking/stubing可以使您的测试更加独立和可靠—您可以选择在测试中要多少反映生产用户体验。