伪造HTTP请求响应以便在Android中进行测试

时间:2011-05-17 02:10:29

标签: android testing

我正在编写一个Android应用程序,有时需要通过HTTP从REST API请求数据。我正在使用Apache DefaultHttpClient来执行请求。有没有办法为这个应用程序编写测试并在运行测试时“替换”DefaultHttpClient的响应,以便测试结果始终保持一致?

作为我想测试的一个例子,我正在访问的一个Web服务接受一个字符串并执行文本搜索,返回一个分页的对象列表。我需要测试列表为空,列表适合第一页,或列表大于页面的情况,应用程序需要多次请求才能获得完整列表。

我不是此Web API的开发人员,也不能修改其响应,因此我无法更改它返回的内容。对于上面的例子,如果我想测试返回的列表是空的情况,我可以只搜索一个我肯定不会返回任何结果的字符串,但是其他两个案例更难,因为服务可以回归总是在变化。

我认为理想情况下,我可以在运行测试时获得修改后的DefaultHttpClient,它会返回给定URL的请求的硬编码结果,而不是实际执行网络请求。这样,我总能获得与真实Web服务响应无关的一致结果。

我目前正在使用Robotium进行测试,但我也愿意使用其他工具。

4 个答案:

答案 0 :(得分:2)

是的,在使用HttpClient框架时,您绝对可以“伪造”响应。这很复杂,我将不得不将大部分细节留给您,但我会给您一个快速概述:

  1. 实施ClientHttpRequestFactory,主要是为了覆盖createRequest()方法,以便您可以...

  2. 返回ClientHttpRequest的自定义实现,您可以在其中覆盖execute()方法以便...

  3. 返回ClientHttpResponse的自定义实施,您最终可以在其中返回虚假的回复数据,例如getBody()可以返回文件内容,您可以在getHeaders()等中对标题进行硬编码。

  4. 其他人正在弄清楚如何最好地将所有这些恶作剧绑定到您的服务层。

答案 1 :(得分:2)

你可以试试Charles这样的事情。排序非代码解决方案。

http://www.charlesproxy.com/

我使用Charles的反向代理和地图本地工具来做这样的事情。

您所做的是将您的请求指向反向代理端口上的本地方框。反过来,Charles可以配置为提供静态硬编码的平面文件,但对于您的应用程序,它看起来像100%真正的Web服务响应。

您可以使用Charles做很多其他很酷的事情 - 观察Android应用程序与服务器和断点之间的流量(允许您在发送和接收之前调整请求和响应)。绝对值得一试。

答案 2 :(得分:0)

另一种选择是使用依赖注入,以便在运行测试时更改HttpClient。如果您有兴趣,请查看Guice

答案 3 :(得分:0)

我猜你有兴趣使用标准的Android Junit测试框架编写功能测试。因此,您可以在自己的Web服务器上实现所使用的API部分,并在运行测试时指向该服务器。

如果您希望测试是自包含的,则可以实现在设备上运行的Http服务器。使用Android类库中可用的Http服务器的示例包括herehere