如何在 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 中制作登录屏幕的单元测试用例的主要内容,如果未能解决你的问题,请参考以下文章