首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Robolectric测试框架

Robolectric测试框架
EN

Stack Overflow用户
提问于 2013-08-16 10:44:04
回答 4查看 29.9K关注 0票数 60

罗波列克Android 相比有什么明显的好处吗?我已经阅读了关于这两个框架的文档,但据我所知,Robolectric唯一明显的好处是它运行在JVM上,而不是运行在DalvikVM上,这使得它比DalvikVM框架运行得更快。

还有其他突出的主要好处吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-16 10:54:12

更新2015年4月-:Gradle构建工具和android.jar 现在正式支持单元测试并防止android.jar抛出存根(没有真正的实现)错误。因此,是的,当存根被适当地模拟时,可以在Java上运行测试。这是一个开始,但仍然比不上罗波列克的力量。还有第三种选择,滚动到这个答案的底部。

现在,关于罗波利克:

Pros:以下是关于它在单元测试中如何被证明是有用的几点:

  1. 您不需要运行仿真器,因此您可以测试项目的一些非UI部件,而不需要模拟器或设备。这也适用于在持续集成/构建服务器上运行的测试,不需要启动模拟器实例。
  2. 使用Android,您可以在处理实现以满足测试用例时快速运行一个特定的测试类。您可以在编写代码时调试。这是一个巨大的生产力增长。
  3. 几乎所有与安卓相关的东西都可以伪装成影子对象,甚至是SQLite。另外,每个阴影对象都公开了许多它们正常的android对应方所不提供的有用功能。通过android对象的影子对应,您可以进行内部检查或调用特殊方法。
  4. 当测试多线程代码(如AsyncTasks、LoopersHandlers等)时,您可以暂停和快速转发线程包,甚至是主线程。非常适合基于Handler的回调测试。
  5. 支持JUnit 4格式。据我所知,安卓仍然保留着JUnit 3。
  6. 可与其他测试工具相结合,如Mockito,Espresso等。
  7. 支持通过Robolectric.buildActivity()创建模拟活动实例及其控件。片段/视图操作也适用于此类模拟活动实例。
  8. 现在已经提供了涵盖多重dex、v4支持、播放服务、地图和http客户端的加载项模块。因此,现在使用这些库函数测试代码也很容易。

Cons:在那里我发现它不太好:

  1. Robolectric擅长于辅助单元测试,但并不涵盖真正的设备或仿真器所能提供的所有功能。例如传感器,全球定位系统,开放-gl等。
  2. 在进行集成或UI测试时,您将需要一个模拟器或真正的设备,以便活动和服务可以与整个android环境(其他应用程序,比如使用相机应用程序为应用程序获取图片)进行交互,而不是有限的。在这里,您需要使用默认的测试框架,因为它也具有测试UI的功能。
  3. 似乎不支持JNI加载。因此,不能测试具有本机依赖关系的代码。
  4. 到目前为止,Robolectric有一个硬连线依赖谷歌地图jar的工作。并将从maven下载另一个android.jar。因此,项目设置可能需要一些修补。更新:就v3而言,它似乎通过Gradle拉出了所有的依赖项,而没有太大的麻烦。
  5. 较新的Android工具支持覆盖率和报表生成等,但只有在设备上运行测试时才支持。因此,使用Robolectric,您将不得不创建额外的Gradle任务(运行Jacoco)来完成它。更新:GRADEL2.9+带有jacoco插件的工具。
  6. 由于gradle和android构建工具都在以较快的速度推出新的构建版本,稳定的Robolectric版本有时会在修改后的构建工具方面出现问题。最典型的问题包括: sdk版本不兼容、清单未找到、生成输出路径不匹配、资源未加载、构建配置问题等。一些问题也与android工具中的bug有关。有时,您甚至不得不编写您自己的自定义测试运行程序,或者应用解决方法,直到下一个版本修复这些问题。检查未决问题并相应地配置测试。

另一种选择是简单地模拟你自己的东西,而不涉及框架。这是“艰难的道路”,但最可定制的方式。普通JUnit与JMockit

代码语言:javascript
复制
@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),并将其包装在完全隔离的环境中,为测试做准备。

票数 84
EN

Stack Overflow用户

发布于 2015-02-05 14:55:43

来分享我的表现..。

对于SQL,活动流,对于那些需要上下文的对象。

JUnit4 for api的java模块,以确保数据正确返回。

用于正确检查ui显示的浓缩咖啡。

当我修改api时.我只运行jUnit4。

当我修改api和UI或Sqlite之间的数据绑定时,我将只运行Robolectric。

当我修改UI时,我只运行Espresso。

有时我会把罗波莱咖啡和浓咖啡一起喝,但很少见。

但是我会在出版之前把所有的东西都运行到商店里去。

因为我认为目前还没有真正的好处。但是看看你如何使用它来加快你的产品质量和开发速度。

如果我错了,请纠正我。

票数 34
EN

Stack Overflow用户

发布于 2019-04-12 08:42:48

您只在需要模拟或伪造Android框架的情况下才使用,例如,如果需要上下文。在使用Android 时,您必须运行仪表化的测试,这是非常慢的。

如果您编写让它们频繁运行的测试,例如,因为您遵循tdd方法,这不是一个选项。因此,在本例中,Robolectric派上用场。

因此,Robolectric的主要好处是它比、Espresso、仪器化测试的速度快得多。

缺点是它伪造了你应该注意的Android环境。要验证现实世界的问题,最好使用经典的方法。

最好还是以一种可以单元测试的方式编写代码,并且不需要上下文或任何其他Android框架依赖项

Robolectric从2018年开始被集成到安卓测试框架中-在官方罗波列克网页上查看更多,并从2018年I/O查看这段视频

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18271474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档