如何在 iOS swift 中制作登录屏幕的单元测试用例

Posted

技术标签:

【中文标题】如何在 iOS swift 中制作登录屏幕的单元测试用例【英文标题】:How can i make unit test cases of Login screen in iOS swift 【发布时间】:2019-05-02 09:33:16 【问题描述】:

我在登录屏幕上遇到问题。如何使用登录屏幕制作单元测试用例?我有一个带有操作按钮的用户名和密码屏幕。单击按钮并制作一些单元测试用例时,我需要调用 API。请给我一些信息。提前致谢。

【问题讨论】:

我建议您模拟您的网络请求,以便您可以一致地控制预期的响应,然后测试是否完成了正确的操作 【参考方案1】:

最简单的方法是构建您的代码,使其实际上不会启动登录 API 调用。相反,它:

创建请求,但在发送前停止 处理响应

然后您可以测试填写字段并点击按钮会创建正确的请求。之后,您可以测试各种响应,包括在端到端测试中难以创建的各种错误情况。

要从单元测试中点击按钮,请使其测试可以访问该按钮。然后拨打sendActions(for: .touchUpInside)


示例:有很多方法可以构建它。假设我们有一个协议

protocol NetworkCalling 
    typealias CallResult = Result<(Data, URLResponse), Error>
    typealias CompletionHandler = (CallResult) -> Void

    func call(request: URLRequest, completionHandler: @escaping CompletionHandler)

我们的视图控制器将使用它给出的任何东西。它不在乎。它只知道如何从其属性中生成 URLRequest。它还知道如何处理结果,无论是成功还是失败。

class ViewController: UIViewController 
    var networkCall: NetworkCalling?
    
    @IBAction private func login(sender: AnyObject) 
        let request = URLRequest(url: URL(string: "http://foo.bar?baz")!)
        networkCall?.call(request: request)  [weak self] result in
            self?.handleResult(result)
        
    

    private func handleResult(_ result: NetworkCalling.CallResult) 
        switch result 
        case let .success(data, response):
            break
        case let .failure(error):
            break
        
    

协议引入了一个边界。视图控制器看不到那个边界。这不是视图控制器的业务。该协议让我们有机会提供不同的实现者:

可以进行真正的网络调用的东西。 包装另一个实现者的装饰器,进行日志记录。 一个为单元测试捕获其参数的测试间谍。 为 UI 测试重放已存储响应的伪造品。这使 UI 测试更快、更可靠。

【讨论】:

你能分享一个登录屏幕的例子吗? 添加了一个例子。【参考方案2】:

您可以通过发送不同的用户名和密码参数来编写多个测试用例。

错误的用户名和密码应该会给您错误消息,然后您可以检查您是否收到错误消息而不是成功消息。

输入正确的用户名和密码应该会给您成功消息作为响应。

使用 XCTAssertEqual 比较消息。

这个屏幕上可能会有更好的 UITest 用例。

【讨论】:

你能分享任何例子吗@Huned【参考方案3】:

虽然这个问题似乎有点宽泛,但让我提一些有用的观点:

在单元测试中,我们关心场景的功能,而不是关心可视化 UI 组件——例如——。那么,您对登录测试有何看法:

点击按钮时我需要调用 API 并制作一些单元 测试用例。

有效,是场景中的主要功能之一。

您应该专注于测试您的代码,而不是 API 本身。换句话说,您的测试用例应该以您期望某个响应(例如成功或失败)的方式实现,因此收到它时应该发生什么,这意味着不要尝试测试 API 响应本身(我们是不在这里做集成测试),你应该关心你的代码基于响应的行为。

关于以上几点,如何应用呢?您可以遵循“模拟”响应的方法。简而言之,您可以做的是为使用的网络管理器创建包含相同行为的模拟类,因此您可以将接收到的结果(假设)硬编码为 - 例如 - 失败的成功,从而测试接收到的“应该发生什么”嘲笑”的结果。

【讨论】:

以上是关于如何在 iOS swift 中制作登录屏幕的单元测试用例的主要内容,如果未能解决你的问题,请参考以下文章

如何在UITableView - Swift中制作清单?

如何制作登录流程IOS应用

iOS:如何在 SwiftUI 页面顶部制作我的图像徽标

无效的 JSON 需要 Swift iOS

带有 Swift 和 iOS 8 故事板的登录屏幕

如何为登录屏幕ios swift编写测试用例?