Android集成测试没有模拟器

时间:2017-02-02 14:42:09

标签: android unit-testing integration-testing robolectric

我想知道是否有一个测试客户端库的选项,它使用Android(模拟)并调用在某个端点上运行的后端?

用例可以是:

有一个名为' A'这需要android的上下文(从中提取数据)和Google Services(可能是模拟的)。然后调用A.sendData(context)收集广告ID,电话信息等数据......

所以测试生命周期可能是:

A.sendData(context) → waits for server response → assert result.

我到处都读到Robolectric不能用作集成框架。我已经创建了一个带有一些用户界面的仪器化测试,但是这样做了但是运行它需要很长时间才能在远程CI上正常工作(超时,有时它有时会通过它没有)。

我需要嘲笑'只是' Android设备的一部分(不需要UI)并测试后端是否返回有效数据,因此可能不需要模拟器。或者如果需要模拟器,我想创建一个使用模拟器的测试,但不需要编写UI测试。

有没有这样的东西?

1 个答案:

答案 0 :(得分:2)

在我看来,您尝试做的只是验证网络组件将适当的数据发送到服务器并处理相应的响应。对于这种测试,我认为Robolectric可以很好地满足需求。它应该能够填充您的应用程序的上下文,然后可以将其注入您的组件。所有这些都是通过JUnit框架运行的,这比仪器测试要快得多。

但是,如果您要做的就是确保您的网络组件正常运行。那么你可能实际上并不需要Android框架。您可以使用纯Java重写您的类。只需从Context中删除您需要的项目,然后将它们注入您的课程。然后,您可以使用在计算机上运行的JUnit测试框架而不是设备。它要快得多,不需要电话。只要他们不是特定于Android的组件(例如Drawable),此功能就可以使用。如果您需要Google服务,这也无效。

一种非常繁琐的方法是使用MockitoPowerMock来模拟上下文和播放服务的方法。您只需模拟Context类将要使用的方法。但这可能变得非常复杂。你可以和Robolectric一起使用它,所以你只需要模拟你需要模拟的东西。

就集成测试而言,在编写集成测试时绝对不需要编写UI测试。基本上,集成测试的作用是创建一个在手机上运行的测试应用程序。如果您没有提供用户界面,那么您将无法使用用户界面。测试运行时,它只会显示一个空白屏幕。您可以使用InstrumentationRegistery#getContext()来检索应用程序中使用的上下文。然后将上下文注入到需要它的组件中。

尽管如此,即使没有任何UI,这有时甚至会很痛苦,仪器测试需要更长的时间。但是,如果您想确保它与实际的Google服务使用实际的Android上下文,这是最佳方式。

因此,基本策略是在JUnit框架上使用Robolectric编写一大堆小型,快速的单元测试,这些测试可以运行多次。然后使用检测框架编写全面的验证测试,以确保一切都很好地协同工作。