【问题标题】:What to test with Robolectric?用 Robolectric 测试什么?
【发布时间】:2014-12-08 08:56:02
【问题描述】:

在我看来,我从根本上误解了 Robolectric 的目的。我已经与它斗争了一个星期,到目前为止,收到一条新的错误消息被认为是取得了进展。我可以在活动中测试一些基本的东西,比如静态视图,但是当一些更复杂的事情开始发挥作用时,事情就会分崩离析。我不得不扩展 Robolectric 以支持具有某些参数的 3 方库、Appcompat 操作栏和许多其他非常耗时且没有真正记录在任何地方的东西,而且事情正在以非常缓慢的速度发展。我开始认为我以错误的方式使用它,它根本不应该做我想让它做的事情。

一般应用程序逻辑非常简单,因此没有太多要进行单元测试的内容,最复杂的部分在于 UI 和远程 API 调用。 Robolectric 是否应该让 Android 的单元测试比使用 JUnit 更痛苦,因为它可以在 JVM 上运行并支持一些 Android 类?也许像 Espresso 这样的黑盒行为测试框架会更适合我的需求?但是我们使用的是连续集成,而且 Robolectric 很不错,而且很容易设置以在 CI 服务器上运行测试,我有点想保持这种状态。

您使用 Robolectric 做什么?很多博客文章都推荐它用于“活动生命周期测试”,但由于我在 Android 世界中也是新手,我并不真正理解它的目的,特别是因为我正在测试的应用程序是纯纵向的.有人可以概述一下您使用 Robolectric 的用途,以及您是如何做到的,最好是使用代码示例,并解释这些测试为何以及如何重要?

【问题讨论】:

  • 我认为你在the programmers exchange 会更好。这是关于概念性问题。
  • 感谢您的建议,但那里有一个somewhat similar question,它没有非常相关的答案并且已关闭。在这里,我要求更多关于人们实际使用代码示例的特定用例。

标签: java android unit-testing junit robolectric


【解决方案1】:

我们将其用于:

  • 单元测试:从解析器和实用程序到控制器和演示器的所有组件
  • 集成/验收测试:应用的业务逻辑,每个屏幕(属于集成和/或验收测试)

我们不将它用于(并且发现很难用于这些):

  • 测试网络层(我们通过以与网络层相同的方式注入测试数据来运行所有测试;解析器单独测试)
  • 用户流经不同的屏幕

如果您正在寻找更多后者,也许 Espresso/Robotium 更适合您的需求。您绝对可以将这些作为 CI 管道的一部分运行,但您需要投入一些时间进行设置,或与 Appurify 之类的工具集成。

如果您发现编写测试非常困难,那么与您使用 robolectric 的方式相比,您的应用程序的架构方式可能更多。也可以在这里查看我的答案,它可能会对您有所帮助:Writing Android acceptance tests with robolectric: how could it be done?

【讨论】:

  • 一个很好的答案,谢谢!您能否详细说明“用户流程”部分 - 我使用 Robolectric 来测试正确的活动/片段是否从按钮按下或事件开始,它是否属于“应用程序的业务逻辑,每个屏幕”类别,还是“用户流”类别?您能否举例说明您的控制器和演示者单元测试?
  • 很容易测试,对于一个屏幕上的某些操作,会打开另一个屏幕。我建议不要同时测试两个屏幕(例如测试屏幕 A,测试转换到屏幕 B,然后测试屏幕 B),这很可能是一个有效的用户流程。这在 UI 测试中做得更好。
  • 哦,是的,我不会同时测试两个屏幕。该测试似乎仍然不是“真正的”单元测试,因为它们有时涉及类中的一些方法,但我绝对将它们限制为最多一个活动/片段。
猜你喜欢
  • 2013-08-04
  • 2013-08-19
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多