在 iOS 应用程序中测试认知身份验证



我有一个iOS应用程序,其Cognito身份验证实现与CognitoYourUserPoolsSample非常相似。最重要的片段位于 SignInViewController 中.swift:

  1. 当用户点击"登录"时,将添加异步任务:

    var passwordAuthenticationCompletion: AWSTaskCompletionSource<AWSCognitoIdentityPasswordAuthenticationDetails>?
    ...
    @IBAction func signInPressed<...> {
    ...
    let authDetails = AWSCognitoIdentityPasswordAuthenticationDetails(username: self.username.text!, password: self.password.text! )
    self.passwordAuthenticationCompletion?.set(result: authDetails)
    ...
    
  2. 稍后我们得到成功或错误响应:

    extension SignInViewController: AWSCognitoIdentityPasswordAuthentication {
    public func getDetails<...> {
    DispatchQueue.main.async {
    // do something in case of success
    ...
    public func didCompleteStepWithError<...> {
    DispatchQueue.main.async {
    // do something in case of failure
    ...
    

我还有一个 UI 测试,用于填写用户名和密码,单击"登录"并验证响应:

class MyAppUITests: XCTestCase {
...
func loginTest() {
let usernameField = <...>
usernameField.tap()
usernameField.typeText("user@domain.com")
... 
// same for password field
// then click Sign In
<...>.buttons["Sign In"].tap()

目前,此测试针对实际的 AWS 基础设施工作,由于多种原因,这并不理想。我想要的是模拟来自 AWS 的各种响应

我该怎么做?

我认为最好的办法是嘲笑或刺伤任务队列,但我不确定如何处理。任何方向将不胜感激。如果您以其他方式处理类似的任务,我也想听听您的想法,谢谢。

好的,我对 AWS iOS 开发工具包以及它如何实现身份验证流并不熟悉,因此请对以下内容持保留态度。我希望这不是一个完整的答案,而更像是一个一般的"策略"。我在当前的项目中实现了类似的方法,不仅用于登录,而且实际上用于我建立的所有远程连接。

您需要做三件事:

  1. 在 UI 测试目标中运行小型本地 Web 服务器。我在目前的项目中使用大使馆和大使。将其配置为返回 Cognito(或其他端点(通常给出的任何响应。我只是手动curl编辑请求并将响应保存在某处,但就我而言,我收到了纯数据(例如,不是要在 Web 视图中显示的完整登录页面......我的猜测是,Cognito实际上显示了一个登录(Web(视图,并且在成功登录后使用深层链接"返回"到您的应用程序,最终调用您的AWSCognitoIdentityPasswordAuthentication方法(成功或错误(。您可以设置测试目标,即,如果您知道深层链接的外观,则 Web 服务器直接调用它(应该可以找到吗?

  2. 添加一些机制以在测试期间切换 Cognito 终结点。不幸的是,这需要添加生产代码,但如果做得好,应该不会太困难。我通过使用我在测试期间设置的启动环境变量(见下文(来做到这一点。除非您的Web服务器支持https(Embassy 不是开箱即用的(,否则还需要以某种方式配置应用程序传输安全性。最困难的部分肯定是弄清楚该端点在SDK中的构造位置以及如何更改它。快速浏览文档使我相信webDomain是保存它的位置,但我看不到它是如何设置的。该属性甚至是只读的,这使事情复杂化。不过,我假设您可以在项目中的某些配置中更改它?否则,它就像是方法旋转的情况......抱歉,我无法在这里提供更多声音方向。

  3. 在测试期间,请确保在相关应用流期间将访问的实际终结点切换到http://localhost/...。我通过使用XCUIApplication().launchEnvironment["somekey"] = "TESTINGKEY"来做到这一点,这与我在第二步中的生产代码准备相匹配。就我而言,我可以简单地加载不同的端点(具有本地主机域,否则具有与原始域相同的路径(。根据测试用例(成功登录、无效凭据等(配置 Web 服务器的响应。

我承认这是/是很多工作,但对我来说这是值得的,因为我可以轻松地运行整个应用程序流(涉及大量传出请求(,而无需任何网络访问。无论如何,我都必须自己实现我们的身份验证系统,这让我可以很好地控制使用哪些 URL 以及在哪里使用,从而可以轻松地根据启动环境变量有一个地方来存根它们。在我的案例中,最丑陋的部分实际上是仅在我的测试中启用 ATS 异常,为此我不得不使用运行脚本出于各种原因。

相关内容

  • 没有找到相关文章