安卓单元测试自动化:Robolectric库 vs 安卓测试框架

47

想知道在编写 Android 应用和库的单元测试用例时,使用 Robolectric 库还是坚持使用 Android Testing 框架哪个更好。我希望在命令行上运行测试套件,并且不需要配置模拟器或让设备连接构建机。你们有没有人对这两者或其他更好的东西进行过比较分析?你们的经验将会帮助我决定更好的解决方案。


1
这个问题很老了。根据我现在阅读的文档,似乎Android测试框架是正确的选择。虽然这些不是命令行,但对于那些刚开始入门的人,这里有一些示例 - Suragch
2个回答

103
我使用分层系统,尽可能使用早期的层级:
1. 纯单元测试。我尽可能使代码完全独立于Android API,并使用“纯”单元测试,可以在任何JVM上运行。这些测试是最快的,有助于保持没有必要特定于Android的可移植代码。
2. 支持Robolectric的单元测试。当我的代码只对Android API有小的依赖,并且可以通过Robolectric shadows满足时,我会用Robolectric进行测试。与纯测试相比,Robolectric需要更多的设置时间,但它仍然比在模拟器上启动/运行更快。
3. Android框架测试。当Robolectric不够用时——无论是因为阴影不存在,还是因为我正在大量使用Android API(因此希望针对真实情况进行测试)——我编写的测试将在默认框架下在模拟器/设备上运行。
层次的重点是尽可能保持简单,这使得整个测试套件更快,并有助于促进更清洁的代码。

1
你是否创建多个专用测试项目来实现层次结构? - bianca
1
我只使用了两个项目:一个用于纯单元测试和Robotium测试,另一个用于框架测试。 - Jason Sankey
我最近的设置中没有使用Robotium,但主要是因为它不适合我正在开发的应用程序(该应用程序具有大量的OpenGL用户界面)。 - Jason Sankey
@JasonSankey,你在哪里测试纯单元测试?通过Roboelectric还是模拟器?后者只会再次增加执行时间,我希望缩短“纯”测试的时间。 - bhootjb
纯单元测试是那些不需要 Robolectric 或模拟器的测试,因为它们不涉及 Android API。它们在普通 JVM 上运行,使用标准 Java API,因此非常快速。 - Jason Sankey
是的,Adam,我使用JUnit 4,尽管您可以使用任何您熟悉的框架进行这些测试。 - Jason Sankey

11

我同时使用了两种工具,我的发现如下:

1)Robolectric不支持API 19,其文档中有说明-http://robolectric.org/eclipse-quick-start/。这是它的一个巨大劣势。

2)Robolectric在JVM上运行而不是DVM上。因此,我们无法检测设备上是否启用了GPS等功能。我们只能传递预先决定好的值。

3)与junit相比,Robolectric的代码编写更加复杂,特别是对于Fragment,存在许多复杂性和问题。

4)Robolectric需要外部jar包和配置文件,而对于junit测试,我们不需要任何外部库。

5)Robolectric更快,因为它在JVM上运行,但这也有劣势,即我们无法看到屏幕上正在执行哪些代码。

对于Android,我喜欢使用jUnit进行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接