我有一个基于Web服务的应用程序,即每个活动调用特定的Web服务并将数据填充到视图中。我还没有做过任何测试,但是我正在切换到Volley
并认为我可能会添加一些测试。
我想知道这些应用的测试策略应该是什么。我正在玩gradle-android-test-plugin
,虽然Robolectric
与Volley
的搭配不合适,但很快就会(我希望)。
无论如何,我用于我的应用程序的结构是:
ObjectJacksonRequest
类从Web服务获取数据并将其解析为POJO RequestQueue
标准排球请求队列BaseActivity
我所有应用活动的父活动,包含RequestQueue
对象和其他常见内容以下是我目前的问题。我应该对答案有一些直觉,但我想听听社区的意见。我确信人们可能还有其他问题,我们可以将这些问题添加到此列表中:
ObjectJacksonRequest
对象有什么好方法?我应该为每个返回并反对的Web服务编写单独的测试吗?BaseActivity
和抽象活动或为其功能扩展它的活动?答案 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
这应该来自模拟服务。一旦你有了模拟服务。您可以使用它以可靠的方式将数据发送到活动并测试结果。
其他说明:
虽然以上是具体答案。总的来说,我发现制定一些工程决策非常有用,这些决策不仅可以测试应用程序,还可以模块化。因此,根据问题,这些是我在应用程序设计中遇到的工程错误的一些技巧和建议。
injected
的包装类。然后可以更改包装器类的底层实现,而不会影响其他源代码。我有一篇关于此主题的博客文章here。unit test
您的代码不与Android API交互的最佳方式。这比Android测试框架和Robolectric
更容易,更快捷。我发现当我使用Java库模块时,我的UI代码变得更轻,因为我试图在Java模块中尽可能多地完成工作。