2

我有一个基于网络服务的应用程序,即每个活动都调用一个特定的网络服务并将数据填充到视图中。我还没有做任何测试,但我正在切换到Volley并认为我也可以添加一些测试。

我想知道此类应用程序应该采用什么测试策略。我正在玩gradle-android-test-plugin,虽然Robolectric还不能很好地玩Volley,但应该很快(我希望)。

无论如何,所以我用于我的应用程序的结构是这样的:

  • ObjectJacksonRequest从 web 服务获取数据并将其解析为 POJO 的类
  • RequestQueue标准截击请求队列
  • BaseActivity我的应用程序的所有活动的父活动,其中包含RequestQueue对象和其他常见的东西
  • 我用来将 UI 代码与网络代码分开的各种抽象活动。例如,AbstractAppleActivity 被任何需要苹果的活动扩展。抽象活动做一些事情,比如在返回时检查 Apple 是否仍在内存中,加载新的,为列表视图设置适配器等。

这是我目前的问题。我对答案应该有一些直觉,但我想听听社区的意见。我相信人们可能还有其他问题,我们可以将这些问题添加到此列表中:

  • ObjectJacksonRequest为各种 Web 服务测试对象的好方法是什么?我应该为每个返回和对象的 Web 服务编写单独的测试吗?
  • 我应该使用实际的 Web 服务测试网络请求还是模拟响应?
  • 我应该测试BaseActivity抽象活动还是扩展它的功能的活动?
  • 在网络请求完成之前测试没有插入任何值的活动的最佳方法是什么?例如,加载苹果列表的活动。
4

2 回答 2

1
  • 为各种 Web 服务测试 ObjectJacksonRequest 对象的好方法是什么?我应该为每个返回和对象的 Web 服务编写单独的测试吗?

如果我理解正确,您想测试 Web 服务后端。在这种情况下,我会为每个调用编写一个测试,甚至每个调用一个测试多个响应的多个测试。

  • 我应该使用实际的 Web 服务测试网络请求还是模拟响应?

我会嘲笑这些回应。根据我的经验,如果您针对真正的 Web 服务进行测试,您将随机失败,因为连接速度变慢或超时或其他原因,您最终会运行两次测试以确保它不是随机失败。

  • 我应该测试 BaseActivity 和抽象活动还是扩展它的功能的活动?

除非它们有很多逻辑,否则我不会测试 BaseActivities。

  • 在网络请求完成之前测试没有插入任何值的活动的最佳方法是什么?例如,加载苹果列表的活动。

模拟 Web 服务响应,使其具有值。你可以用 Robolectric 做到这一点。我相信相关的方法是Robolectric.addRequestInterceptor

于 2013-10-26T11:26:27.260 回答
0

我现在有更多的测试经验,所以这里是我为各种来源收集的建议:

- What's a good way to test the ObjectJacksonRequest object for the various web services ? 
- Should I be writing a separate test for each web service that returns an object ?
- Should I be testing the BaseActivity and the abstract activities or the activities that extend it for it's functionality ?

所有这些问题都可以合并为一个。这是测试继承层次结构的问题。不幸的是,答案是视情况而定。然而,在大多数情况下,对于抽象类,测试子类也会测试父类。除非您的方法在不同的子类中有不同的用例,否则在这种情况下,您可能需要测试抽象类,以便在编写代码时测试所有用例(尽管如果发生这种情况,您最好定义更多对象)。

- Should I be testing network requests with the actual webservices or mock the responses ?

这是个简单的。总是嘲讽。正如另一个答案所提到的,flaky如果您使用真正的 Web 服务,您将面临编写测试的风险。更不用说测试网络服务不是你的责任。您应该只测试您负责的代码。

- What is the best way to test an activity that doesn't have any values inserted until the web request is completed ? For example, an activity that loads a list of apples

这应该遵循模拟服务。一旦你有了模拟服务。您可以使用它以可靠的方式将数据发送到活动并测试结果。

其他注意事项:

虽然以上是具体的答案。总的来说,我发现做出一些不仅有助于测试而且有助于应用程序模块化的工程决策很有用。因此,根据问题,这些是我在应用程序设计中遇到的工程错误中的一些提示和注意事项。

  • 为服务使用自定义包装器:在我的问题中,我试图从 Android 的原始 HTTP 转移到 Volley。这些问题的部分原因是应用程序设计将应用程序与网络库耦合在一起。解决此问题的一种方法是使用injected代码中的包装类。然后可以更改包装类的底层实现,而不会影响其他源代码。我在这里有一篇关于这个主题的博文。
  • 使用 Java 模块:基于 gradle java 插件的 Android gradle 插件。因此,您可以在 Android 应用项目中创建 Java 库模块。我发现这是unit test不与 Android API 交互的代码的最佳方式。这比 Android 测试框架和Robolectric. 我发现当我使用 Java 库模块时,我的 UI 代码变得更轻,因为我试图在 Java 模块中完成尽可能多的工作。
于 2014-03-07T06:50:02.367 回答