【问题标题】:Recommendations to test API request layer in iOS apps using NSOperations and Coredata使用 NSOperations 和 Coredata 在 iOS 应用程序中测试 API 请求层的建议
【发布时间】:2012-01-29 10:40:53
【问题描述】:

我开发了一个使用 REST API 的 iOS 应用。 iOS 应用程序在工作线程中请求数据并将解析结果存储在核心数据中。所有视图都使用核心数据来可视化信息。 REST API 变化很快,我无法真正控制界面。

我正在寻求如何尽可能轻松地为应用程序执行集成测试的建议。我应该针对 API 还是针对 Mock 数据进行测试?但是,如果您可以使用 POST 创建资源或使用 PUT 修改它们,如何正确模拟 GET 请求?

您使用什么框架来解决这类问题?我玩过Frank,它看起来不错,但由于 iOS 应用程序中的快速 UI 变化而变得复杂。您将如何测试应用程序中的“API 请求层”?工作线程是队列中的 NSOperations - 一切都是异步构建的。有什么建议吗?

【问题讨论】:

  • 您是否阅读了 Graham Lee 最近出版的《测试驱动的 iOS 开发》一书?第 8 章和第 11 章讨论并发,本书涵盖了测试服务 API 的异步使用的各个方面。我知道在你发帖的时候,这本书还没有出版,这就是我提到它的原因。
  • @cardinal 感谢您的提示。我去查一下!
  • 对于 iOS 集成测试,请一直使用 KIF

标签: ios testing rest core-data nsoperation


【解决方案1】:

我强烈建议您模拟服务器。服务器宕机,行为发生变化,如果测试失败暗示“也许我的代码仍然有效”,你手头就有问题,因为你的测试没有告诉你代码是否坏了,这是整点

至于如何模拟服务器,对于这样做的单元测试:

first_results = list_things()
delete_first_thing()
results_after_delete = list_thing()

我有一个如下所示的模拟数据结构:

{ list_things_request : [first_results, results_after_delete], 
  delete_thing_request: [delete_thing_response] }

它以您的请求为键,值是该请求的响应数组,按出现顺序排列。因此,您可以支持重复运行相同的请求(例如列出事物)并获得不同的结果。我使用这种格式是因为在我的情况下,我的 API 调用的运行顺序可能与上次略有不同。如果您的测试更简单,您也许可以使用一个简单的请求/响应对列表。

我的单元测试中有一个标志,表明我是处于“记录”模式(即与真实服务器通信并将此数据结构记录到磁盘)还是处于“回放”模式(谈话到数据结构)。当我需要进行测试时,我会“记录”与服务器的交互,然后回放它们。

我使用鲜为人知的 SenTestCaseDidStartNotification 来跟踪正在运行的单元测试并适当地隔离我的数据文件。

要记住的另一件事是,不稳定是万恶之源。如果您的代码可以处理集合或获取当前日期等,这往往会更改请求和响应,这在离线场景中不起作用。所以要小心那些。

【讨论】:

    【解决方案2】:

    (由于还没有人介入并给你一个完整的演练)我的谦虚建议:退一步,拿出异步的魔力,把一切都看作同步(api调用、解析、持久化),并将每个步骤隔离为消费者/生产者。毕竟您不想对 NSURLConnection、JSONKit 或其他任何东西进行单元测试(如果您使用它们,它们应该已经过测试),您想测试您的代码。您的代码接受一些输入并产生输出,但不知道输入实际上是在某处的后台线程中生成的输出。您可以进行隔离测试全部同步。

    我们是否同意您的视图不关心他们的模型数据是如何提供的?如果是,那么请使用模拟对象测试您的视图。

    我们能否就您的解析器不关心数据是如何提供的这一事实达成一致?如果是,那么,用模拟数据测试你的解析器。

    网络层:和上面描述的一样,最后你会得到一个 NSDictionary 的 headers 和一些 NSData 或 NSString 的内容。我认为您不想对 NSURLConnection 或您信任的任何第 3 方网络 api(asihttp、afnetworking ......?)进行单元测试,那么最后,要测试什么? 您可以为您拥有的每个用例模拟 URL、请求标头和 POST 数据,并为预期响应设置测试用例。

    最后,恕我直言,这都是关于“规范化” asyc。

    【讨论】:

      【解决方案3】:

      看看Nocilla

      如需了解更多信息,请查看this other answer 到类似问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多