基于Web服务的Android应用程序的测试策略

时间:2013-09-04 17:06:39

标签: android robolectric android-testing android-gradle

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

我想知道这些应用的测试策略应该是什么。我正在玩gradle-android-test-plugin,虽然RobolectricVolley的搭配不合适,但很快就会(我希望)。

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

  • ObjectJacksonRequest类从Web服务获取数据并将其解析为POJO
  • RequestQueue标准排球请求队列
  • BaseActivity我所有应用活动的父活动,包含RequestQueue对象和其他常见内容
  • 我用来将UI代码与网络代码分开的各种抽象活动。例如,AbstractAppleActivity由任何需要apple的活动扩展。抽象活动会检查返回时Apple是否仍在内存中,加载新内​​容,为列表视图设置适配器等等。

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

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

2 个答案:

答案 0 :(得分:1)

  
      
  • 测试各种Web服务的ObjectJacksonRequest对象有什么好方法?我应该为每个人写一个单独的测试   返回和反对的Web服务?
  •   

如果我理解正确,你想测试webservice后端。在这种情况下,我会为每个呼叫编写一个测试,或者甚至每次调用多次测试,每个测试都会测试每个响应。

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

我会嘲笑这些回复。根据我的经验,如果你对一个真正的网络服务进行测试,你会得到随机的失败,因为连接速度很慢或超时,或者你最终运行你的测试两次只是为了确保它不是随机的失败。 / p>

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

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

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

模拟webservice响应,使其具有值。你可以用Robolectric做到这一点。我认为相关方法是Robolectric.addRequestInterceptor

答案 1 :(得分: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 ?

这很简单。总是嘲笑。正如提到的另一个答案,如果您使用的是真正的Web服务,则会冒着编写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的包装类。然后可以更改包装器类的底层实现,而不会影响其他源代码。我有一篇关于此主题的博客文章here
  • 使用Java模块:基于gradle java插件的Android gradle插件。因此,您可以在Android应用程序项目中创建Java库模块。我发现这是unit test您的代码不与Android API交互的最佳方式。这比Android测试框架和Robolectric更容易,更快捷。我发现当我使用Java库模块时,我的UI代码变得更轻,因为我试图在Java模块中尽可能多地完成工作。