【问题标题】:Android Integration tests without emulator没有模拟器的 Android 集成测试
【发布时间】:2017-02-02 14:42:08
【问题描述】:

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

用例可能是:

有一个名为“A”的库,它需要 android 的上下文(从中提取数据)和 Google 服务(可以是模拟的)。然后调用 A.sendData(context) 收集广告id、电话信息等数据...

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

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

我到处读到 Robolectric 不能用作集成框架。我创建了一个带有一些 UI 的 Instrumented 测试,它完成了这个技巧,但运行它需要很长时间并且在远程 CI 上无法正常工作(超时,有时它通过有时它没有)。

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

有这样的东西吗?

【问题讨论】:

标签: android unit-testing integration-testing robolectric


【解决方案1】:

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

不过,如果您要做的只是确保您的网络组件正常工作。那么您可能实际上并不需要 Android 框架。您可以改用纯 Java 重写您的类。只需从 Context 中删除您需要的项目,然后将它们注入到您的类中。然后您可以使用在计算机而不是设备上运行的 JUnit 测试框架。它速度更快,不需要手机。只要它们不是 Android 特定组件(例如 Drawable),它就可以工作。如果您需要 Google 服务,这也不起作用。

一个非常繁琐的方法是使用MockitoPowerMock 来模拟你的上下文和播放服务的方法。您只需模拟您的 Context 类将使用的方法。不过,这可能会变得非常复杂。您可以将它与 Robolectric 一起使用,因此您只需模拟您需要模拟的内容。

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

不过,这有时甚至会很痛苦,即使没有任何 UI,仪器测试也需要更长的时间。但是,如果您想确保它与实际的 Android 上下文和实际的 Google 服务一起工作,这是最好的方法。

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

【讨论】:

  • 谢谢@DeeV。你完美地描述了它,我有点认为没有超级简单的答案。我可能会使用没有 UI 的 Instrumentation,然后看看效果如何。
猜你喜欢
  • 1970-01-01
  • 2012-04-25
  • 2021-11-07
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 2022-08-11
  • 2017-01-23
  • 1970-01-01
相关资源
最近更新 更多