本文介绍了android里常用的几种单元测试框架:JUnit、Mockito、PowerMock、Robolectric、Espresso 各自的特点和适用场景。

JUnit

JUnit是Java编程语言的单元测试框架。

JUnit 只能运行在本地开发环境的 Java 虚拟机上,主要测试方法就是断言,即assertEquals()方法。

然后,通过实现TestRule接口的方式重写apply()方法去自定义Junit Rule,这样就可以在执行测试方法的前后做一些通用的初始化或释放资源等工作,接着在想要的测试类中使用@Rule注解声明使用JsonChaoRule即可。(注意被@Rule注解的变量必须是final的。最后,我们直接运行对应的单元测试方法或类,如果你想要一键运行项目中所有的单元测试类,直接点击运行Gradle Projects下的app/Tasks/verification/test即可,它会在module下的 build/reports/tests/下生成对应的index.html报告。

Junit4它的优点是速度快,支持代码覆盖率如jacoco等代码质量的检测工具。缺点就是无法单独对 Android UI,一些类进行操作,与原生Java有一些差异。

Mockito

Mock 就是模拟的意思,Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。

适用场景是我们不需要某个对象真实执行某个方法的代码,只是需要该对象在调用该方法时按照我们的预期返回特定值,这时就可以使用mock()方法模拟这个对象。

除此之外,它还有很多 验证方法调用的方式如Mockit.when(调用方法).thenReturn(验证的返回值)、verfiy(模拟对象).验证方法 等等。 这里有一点要补充下:简单的测试会使整体的代码更简洁,更可读、更可维护。如果你不能把测试写的 很简单,那么请在测试时重构你的代码。 最后,对于Mockito来说,它的优点是有各种各样的方式去验证"模仿对象"的互动或验证发生的某些行 为。而它的缺点就是不支持mock匿名类、final类、static方法private方法。

PowerMock

PowerMock是一个框架,它以更强大的功能扩展了其他模拟库,例如EasyMock。 PowerMock使用自定义的类加载器和字节码操作来对静态方法,构造函数,最终类和方法,私有方法,静态初始化程序的删除等进行模拟。

PowerMock具有Mockito不支持的强大功能,但是主要面向具有单元测试专业知识的人员,初级开发人员用可能弊大于利(可能与它必遵守面向对象的原则有关)。开发人员避免使用静态函数,保持好代码规范,尽可能不要使用Powermock写测试case。

      Robolectric

Robolectric是一个框架,可将快速可靠的单元测试引入Android。 测试可以在几秒钟内在您工作站上的JVM中运行。

前面3种我们说的都是Java相关的单元测试方法,如果想在Java单元测试里面进行Android单元测试,还得使用Robolectric。

对于 Android 应用开发来说,我们需要调用 Android SDK 的 API,JUnit 和 Mockito 都是针对 Java 平台的测试框架的时候,开发好的应用程序需要打包成 APK 文件并安装到 Android 设备上才能运行测试,效率很低。 Robolectric 框架实现了一套在 Java 虚拟机上能运行的 Android SDK,从而使得 Android 应用程序能够脱离 Android 环境运行测试,提高了测试效率。具体来说,Robolectric提供了一系列类似 ShadowToast.getLatestToast()、ShadowApplication.getInstance()这种方式来获取Android平台对应 的对象。可以看到它的优点就是支持大部分Android平台依赖类的底层引用与模拟。缺点就是在异步测 试的情况下有些问题,这是可以结合Mockito来将异步转为同步即可解决。

Robolectric优势

像Mockito这样的模拟框架需要针对android sdk进行模拟工作。 在某些情况下,代码量会增加。 Robolectric可以使用不依赖模拟的Android SDK依赖类。由于Robolectric的测试是在JVM中而不是模拟器或设备中执行的,因此它不需要部署或安装即可快速进行。 因此,适合于在实现后立即编写和执行的case。

解释一下为什么不依赖androidSDK:Robolectric通过实现一套JVM能运行的Android代码,在unit test运行的时候去截取android相关的代码调用,转到自己实现的代码去执行这个调用。e.g.比如Android里面有个类叫Button,Robolectric则实现了一个叫ShadowButton类。这个类基本上实现了Button的所有公共接口。假设你在unit test里面写到String text = button.getText().toString(),在这个unit test运行时,Robolectric判断你调用了Android的button.getText(),在底层截取这个调用,转到ShadowButton的getText方法来执行。(摘自这)

就是说,运行测试时,Robolectric将这些'shadow objects'注入到实际的Android类中。所以测试在JVM上运行但是无需启动Android实例。

Robolectric另一个优势是可以处理用c实现的代码,例如view的inflatie 和资源加载,像真机上一样进行测试。也可以为特定的SDK方法提供自己的实现,例如,可以模拟错误条件或现实世界中的传感器的行为。

      Espresso

Espresso,用于编写Android UI测试用例的自动化测试框架,是开源工具,集成在 Android Studio中。Android官方网站还建议将Espresso与ActivityTestRule一起使用。

espresso优势 参考链接  ——     翻译整理如下:

开发人员写测试case时需求:1.更改代码后,需要很繁琐地验证每个build 。2.如果测试依赖远程服务器和其他工作站,测试会变慢。3.无论对IDE还是对后续集成,单元测试和功能测试都应该是易于执行的。4.OS升级之后,APP也应该能被测试。5.模拟器和真机要都可以测试。

优势:

1. Espresso工作流程操作简单
允许开发人员将测试套件构建为独立的APK,和被测app一起安装。

2.快速可靠的反馈给开发人员
当开发人员试图加速部署时,Espresso会向他们提供有关代码更改的快速反馈,以便他们可以继续进行下一个功能或缺陷修复。具有健壮且快速的测试框架起着关键作用。Espresso不需要任何服务器(例如Selenium Remote WebDriver)进行通信;相反,它与应用程序并排运行,并向开发人员提供非常快速(几分钟)的测试结果。

3.减少测试碎片
由于Espresso提供了一种同步的执行方法,因此测试周期的稳定性非常高。 Espresso中有一个内置的机制,可以在进行测试的下一步之前验证元素或对象是否实际显示在屏幕上。当遇到“未检测到对象”和其他错误时,可以消除测试执行的中断。

4.易于开发
Espresso自动化测试基于Java和Junit,是Android程序员的核心技能。集成在Android Studio IDE中,不用设置或升级。

      总结

个人理解,写单元测试首选Mockito。但是怎么避免mockito要依赖android库这个弱项呢,把代码解耦,比如使用MVP,将业务逻辑与View逻辑分开,这样业务逻辑(Presenter)就不会对Android库有任何依赖,就不需要Mock它们)。那么View层往往由Activity / Fragment实现,这时可以使用Robolectric。Robolectric基本上重新实现了Android框架的各个部分,但实现方式有些不同,所以仅在必要时使用(对view层写case)。最后考虑PowerMock,用来模拟静态类(例如Math),或者可以模拟静态Android类。

下篇会记录Junit、Mockito、Robolectric的单元测试代码的入门写法。

单元测试基础上篇——几大常用框架对比相关推荐

  1. TensorFlow、MXNet、Keras如何取舍? 常用深度学习框架对比

    作者简介 魏秀参,旷视科技 Face++ 南京研究院负责人.南京大学 LAMDA 研究所博士,主要研究领域为计算机视觉和机器学习.在相关领域顶级国际期刊如 IEEE TIP.IEEE TNNLS.Ma ...

  2. Android 常用图片框架对比

    在Android中,进行内存优化,最重要的优化处理是对图片进行内存的优化处理,毕竟图片占用的内存是非常大的,对于图片的内存处理,是android中内存优化的重中之重.目前开源的4大图片处理框架都对图片 ...

  3. TensorFlow 、Caffe等9大人工智能框架对比介绍

    TensorFlow .Caffe等9大人工智能框架对比介绍. Tensor Flow https://www.tensorflow.org Tensor Flow来自谷歌家族,是一个强大的开源框架, ...

  4. Android Swift iOS开发:语言与框架对比

    转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...

  5. Atitit 几大研发体系对比 Stage-Gate体系 PACE与IPD体系 敏捷开发体系 CMMI体系 艾龙 著 1. 3. 1.5:业界领先的研发管理体系简介 2 1 2. 《产品及生命周期

    Atitit 几大研发体系对比 Stage-Gate体系  PACE与IPD体系 敏捷开发体系 CMMI体系 艾龙 著 1. 3. 1.5:业界领先的研发管理体系简介 2 1 2. <产品及生命 ...

  6. 从0到1详解推荐系统的基础知识与整体框架

    猜你喜欢 0.淘宝首页猜你喜欢推荐建模实践 1.[免费下载]2022年6月份热门报告 2.[实践]小红书推荐中台实践 3.微信视频号实时推荐技术架构分享 4.对比学习在宽狩推荐系统中的应用实践 5.微 ...

  7. 机器学习三大框架对比

    导语: Science is NOT a battle, it is a collaboration. We all build on each other's ideas. Science is a ...

  8. IntellJ IDEA 基础之 一些常用插件plugin 简单整理 (辅助提高编写代码效率)

    IntellJ IDEA 基础之 一些常用插件plugin 简单整理 (辅助提高编写代码效率) 目录 IntellJ IDEA 基础之 一些常用插件plugin 简单整理 (辅助提高编写代码效率) 一 ...

  9. RN、Flutter、Uni-app APP框架对比

    RN.Flutter.Uni-app APP框架对比 框架背景介绍 Flutter Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动.W ...

最新文章

  1. java为什么实现_为什么在java中这样实现了这样的实现?
  2. 是什么让 Spring5 放弃了使用 Guava Cache?
  3. 这13个开源GIS软件,你了解几个?【转】
  4. assm的结构_Oracle ASSM三级位图块结构
  5. maven报错Non-resolvable parent POM for com.wpbxin:springboot2-first-example:0.0.1-SNAPSHOT: Could not
  6. spring boot中打包插件spring-boot-maven-plugin和maven-jar-plugin的关联
  7. 上传单.多个文件的函数封装
  8. JS判断对象是不是数组“Array”
  9. 转 Linux调优方案,sysctl.conf的设置
  10. 易语言webservice接口_易语言webservice接口调用助
  11. 笔记本能安装联想智能云教室吗_挑战Jupyter Notebook:云协作、云硬件,上云的Notebook编程环境...
  12. mybatis批量操作(批量查询,批量插入,批量更新)
  13. 怎么注册tk域名_.TK后缀免费顶级域名注册(附教程)
  14. 容器化部署之看板工具: Wekan
  15. 网上商城-java基础练习项目-仿照雷蛇商城
  16. MFC添加界面的背景图片方法总结
  17. php掷骰子游戏,js实现简单掷骰子小游戏
  18. 公众号接口消息推送+VB+WebService实战
  19. 文章数据分析与自动分类
  20. 二维码的识别过程以及柱体二维码的实际应用情况调研报告

热门文章

  1. python 解析 xml字符串
  2. docker: Error response from daemon: driver failed programming external connectivity on endpoint webs
  3. FLTK 1.3中使用中文
  4. java银行账户模拟_使用Java模拟银行账户存、取款、转账功能
  5. 学生如何免费使用Pycharm专业版全部功能
  6. jQuery带背景切换登录注册表单
  7. 【论文简述】Multiview Stereo with Cascaded Epipolar RAFT(ECCV 2022)
  8. Analog Devices Inc. A2B(汽车音频总线)
  9. Nginx对代理HTTP资源的限制访问
  10. php中实现考勤,php教学互动-考勤作业系统