与Android测试框架相比,Robolectric能提供任何明显的好处吗?我已经阅读了有关这两个框架的文档,但据我所知,Robolectric唯一明确的好处是它在JVM而不是DalvikVM上运行,使其比Android框架更快。
还有其他突出的主要好处吗?
2015年4月更新:Gradle构建工具和Android Studio now officially support unit testing,防止android.jar抛出存根(没有真正的实现)错误。所以,是的,当存根被适当地模拟时,它可以在Java VM上运行测试。它是一个开始,但仍然无法与Robolectric的功率相媲美。还有第三种选择,滚动到这个答案的底部。
现在,关于Robolectric:
优点:以下是关于如何证明它在单元测试中有用的几点:
AsyncTask
s,Loopers
和Handlers
等多线程代码时真的很闪耀。你可以暂停和快进线程Loopers,甚至是主线程。非常适合基于Handler的回调测试。Robolectric.buildActivity()
及其通过ActivityController
控制。片段/视图操作也适用于此类模拟活动实例。缺点:我发现它不太好:
另一个替代方案是自己简单地模拟东西,不涉及任何框架。它是“艰难的方式”,但最可定制的方式。它的简单JUnit与JMockit:
@RunWith(JMockit.class)
public class OtherTest {
public void testHandlerCallback(@Mocked final FragmentTransaction transaction,
@Mocked final FragmentManager manager,
@Mocked final Activity activity,
@Mocked final LayoutInflater inflater,
@Mocked final ViewGroup parent) {
final List<Fragment> fragments = new ArrayList<>();
new Expectations() {{
activity.getFragmentManager(); result = manager;
manager.beginTransaction(); result = transaction;
transaction.add(withCapture(fragments), anyString);
transaction.commit(); result = new Delegate<Void>() {
public int commit() {
View v = fragments.get(0).onCreateView(inflater,parent,null);
Deencapsulation.invoke(v,"onMeasure",0,0);
return 0;
}
};
}};
}
}
以上是粗略的内联示例。您实际上可以创建适当的可重用类(比如FragmentTestHarness
),它将测试一个组件(比如Fragment
)并将其包装在完全隔离的环境中,为测试做好准备。
分享我的做法......
Robolectric对于SQL,活动流程,用于那些需要上下文的对象。
JUnit4用于api的java模块,以确保数据正确返回。
浓咖啡用于正确检查ui显示。
当我修改api ...我只运行jUnit4。
当我修改api和UI或Sqlite之间的数据绑定时,我只会运行Robolectric。
当我修改UI时,我只运行Espresso。
有时我会一起运行Robolectric和浓缩咖啡,但非常罕见。
但是我会在发布之前运行所有商店。
因为我认为现在没有真正的好处。但是看看你如何使用它来加快产品质量和开发速度。
如果我错了,请纠正我。
Robolectric的主要优点是速度。使用Robolectric进行单元测试不需要运行仿真器或设备来运行测试,因此速度要快得多。
您可能仍希望拥有一套针对真实设备运行的集成测试,这只是一个小得多的套件。
只有在需要模拟或伪造Android框架的情况下才使用Robolectric,例如:如果你需要一个上下文。使用Android测试框架时,您必须为超慢速运行Instrumented测试。
如果您为了让它们经常运行而编写测试,例如因为你遵循tdd方法,这不是一个选择。所以在这种情况下,Robolectric会派上用场。
因此,Robolectric的主要优点是它比一般的Espresso或Instrumented测试快得多。
缺点是它假装了一个你应该注意的Android环境。要验证现实世界的问题,最好使用经典的Android Framework方法。
最好的方法仍然是以可以对其进行单元测试的方式编写代码,并且不需要上下文或任何其他Android框架依赖项。
自I / O 2018以来,Robolectric已经集成到Android测试框架中 - 在official Robolectric page上查看更多内容并在I / O 2018上观看this video