Android单元测试介绍

处于高速迭代开发中的Android项目往往需要除黑盒测试外更加可靠的质量保障,这正是单元测试的用武之地。单元测试周期性对项目进行函数级别的测试,在良好的覆盖率下,能够持续维护代码逻辑,从而支持项目从容应对快速的版本更新。

单元测试是参与项目开发的工程师在项目代码之外建立的白盒测试工程,用于执行项目中的目标函数并验证其状态或者结果,其中,单元指的是测试的最小模块,通常指函数。打包时单元测试的代码不会被编译进入APK中。

Android单元测试框架

Android的单元测试可以分为两大类:

android中的单元测试基于JUnit4,可分为instrumented测试和本地测试。

1.module-name/src/androidTest/java/.

该目录下的测试代码需要运行在android设备或模拟器下面,因此可以使用android系统的API,速度较慢。

优点:直观,运行在真机上

缺点:运行速度慢,需要编译安装app

代表框架:UIAutomator,Robotium,Espresso,Macaca,Appium等

2.module-name/src/test/java/.

该目录下的代码运行在本地JVM上,其优点是速度快,不需要设备或模拟器的支持,但是无法直接运行含有android系统API引用的测试代码。

优点:速度快,使用简单,方便

缺点:不够直观,比如有硬件相关(比如wifi,Bluetooth等),兼容性问题无法测试出来。

代表框架:Mockito,EasyMockito,Jmockit Powermock,Robolectric等

Android单元测试

以上分别执行在JUnit和AndroidJUnitRunner的测试运行环境,两者主要的区别在于是否需要android系统API的依赖。

在实际开发过程中,我们应该尽量用JUnit实现本地JVM的单元测试,而项目中的代码大致可分为以下三类:

强依赖关系,如在Activity,Service等组件中的方法,其特点是大部分为private方法,并且与其生命周期相关,无法直接进行单元测试,可以进行Ecspreso等UI测试。

部分依赖,代码实现依赖注入,该类需要依赖Context等android对象的依赖,可以通过Mock或其它第三方框架实现JUnit单元测试或使用androidJunitRunner进行单元测试。

纯java代码,不存在对android库的依赖,可以进行JUnit单元测试

UnitTest框架选择

要较好的完成本地单元测试功能,就需要mock对象来进行操作,

什么是Mock?

Mock是虚拟对象,是为了模拟真实对象而创建的,这些虚拟对象的行为是可控的。为方便理解,可以把Mock视为『汽车碰撞实验』中的『假人』。

假设要对ClassA进行测试,他的依赖如下图:

ClassA的依赖关系

如果进行了mock对象,可以简化为下图:

mock后的依赖关系

为什么需要mock?

1.真实软件架构中的对象行为是不确定的(eg:时间、对象的状态)。

2.真实对象的一些状态又很难构造(eg:网络抖动导致延迟返回)。

3.真实对象在进行某种操作时需要很长时间,影响测试进度(eg:一些数据库的初始化)。

4.实际测试中需要关注真实对象如何被调用,真实对象内部状态如何。

上述的问题都是可以通过引入Mock来解决的。

为什么选择Mockito

Mockito是StackOverflow社区票选的最佳Java Mock框架。

Github 中位于Top4的Library,文档多,遇到坑也能较快解决。

使用简洁、优雅的API即可写出漂亮的单元测试用例,这些单元测试语法符合自然语言,方便阅读。

Mockito可以完成哪些功能

验证Mock对象某函数是否执行,执行次数

Mock对象某函数有返回值,可以设置返回值。对于void的函数,可以设置抛出异常(即常说的打桩)

验证Mock对象函数执行顺序

参数匹配(有很多内建的参数,也可以自己实现),这样使得验证函数交互或者设置返回值更加灵活

可以捕获参数用于后续进一步验证或设置

Mockito的不足之处

现如今比较流行的mcok框架,如Mockito,EasyMock,等都有一个共同的缺点:无法mock static,final,private方法等。

所以这里需要引入PowerMock,他能够完美弥补这个缺陷。

在Java中,编写代码面对的只有类、对象、函数,编写单元测试时可以在测试工程中创建一个对象出来然后执行其函数进行测试。而在Android中,编写代码需要面对的是组件、控件、生命周期、异步任务、消息传递等,虽然本质是SDK主动执行了一些实例的函数,但创建一个Activity并不能让它执行到相应的生命周期中(如onResume),因此需要JUnit,Mock之外的框架支持。

当前主流的解决方案是AndroidTest和Robolectric,前者需要运行在Android环境上,后者可以直接运行在JVM上,速度也更快,无需准备Android环境。因此我们选择引入Robolectric。

测试框架方案:

JUnit4是一个Java语言的单元测试框架。多数Java的开发环境都已经集成了JUnit作为单元测试的工具,也是用的最多的一个测试框架,Android Studio创建的工程中就已经集成了JUnit4,且Android单元测试就是基于JUnit4的,默认就加了这个dependencies,

所以最后选择: JUnit4+Mockito+PowerMock+Robolectric的组合来做Android单元测试的工作。

其他

单元测试,集成测试,UI测试

UI测试是测试到交互和视觉,以及操作的结果是否符合预期。可以通过Espresso,UI Automator等框架,或者人工测试。

集成测试是基于单元测试,将多个单元测试组装起来进行测试,实际测试往往会运行慢,依赖过多导致集成测试非常费时。

单元测试仅针对最小单元,在面向对象中,单元指的是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。

三者的在实际应用中可以通过Test Pyramid(Martin Fowler的总结)来衡量:

Test Pyramid

所以对于测试,在开发过程中,我们(开发者)需要把更多的精力放在单元测试上。

android集成测试框架,Android单元测试框架选择相关推荐

  1. python unitest框架_python单元测试框架Unitest

    一.unitest简介 unittest是python内置的单元测试框架,具备编写用例.组织用例.执行用例.输出报告等自动化框架的条件. 使用unittest前需要了解该框架的五个概念: test c ...

  2. python+selenium+unittest测试框架1-unittest单元测试框架和断言

    unittest单元测试框架和断言 一.unittest单元测试框架简介 1.导入unittest模块 import unittest 2.定义测试类 class Login(unittest.Tes ...

  3. php的单元测试框架,PHP 单元测试框架 Testify | 码农软件 - 码农网

    软件介绍 Testify(Testify.php) 是个极小的 PHP 5.3+ 单元测试框架. 代码示例: require 'vendor/autoload.php'; use Math\MyCal ...

  4. Python参数化框架parameterized+单元测试框架unittest HTMLReport nose

    Python参数化和单元测试框架使用 背景 思路 代码 运行 方法一 方法二 参考 背景 为了更好地管理自动化测试用例,同时对用例输入进行参数化,并且生成好看的测试报告,对题目中的几个框架进行了组合使 ...

  5. android集成测试工具,android – 集成测试和Cucumber测试

    要使用Gradle命令行工具启用Android Test Orchestrator,请完成以下步骤: android { defaultConfig { ... testInstrumentation ...

  6. python测试框架untest_Python单元测试框架 unittest详解

    以上是函数的测试,类的测试与函数的测试及其相似 1 import unittest2 3 #-*-coding:utf-8-*- 4 classAnonymousSurvey():5 "&q ...

  7. 读书笔记-单元测试艺术(二)-单元测试框架

    一.说明 本次笔记所有的代码是在VS2013下运行的,使用的nunit.framework.dll版本为3.2.1.0,Reshaper版本为8.2.3 1.xUnit测试框架 大部分单元测试框架的名 ...

  8. python语言案例教程单元测试答案_Python单元测试框架(附例子)

    什么是单元测试? 单元测试在[Python中做是为了在应用程序的开发阶段的早期识别错误时的错误不太经常和修复成本更低. 单元测试是用Python设计的脚本化代码级测试,用于验证功能的小"单元 ...

  9. android下测试方法及junit单元测试框架配置方法

     1.测试方法: 根据测试是否知道源代码分为: 1.  黑盒测试:只关心程序执行的过程 和 结果 2.  白盒测试:根据源代码写测试方法 或者 测试用例 根据测试粒度: 1.方法测试:function ...

最新文章

  1. 关于tcp、http可能你想知道的那些事
  2. portal开发下拉框“日期框”查询要怎么配置
  3. oracle子查询子查询,Oracle 单行子查询和多行子查询
  4. matlab getsplitpic,MATLAB_9-模式识别笔记
  5. 网上购物软件的测试计划,网上购物平台购物测试计划书
  6. mercurial使用_使用Mercurial在SQL数据库中对象更改的修订历史记录
  7. python 从列表中随机选择_使用条件Python从列表中随机选择
  8. python里进度条编程_Python实现控制台中的进度条
  9. CSS:position属性和z_index
  10. 基于itchat实现微信群消息同步机器人
  11. 用VBS脚本实现软件定条件开启
  12. SPDY协议 - v3
  13. tomcat 窗口中文乱码解决
  14. altium designer(AD13)隐藏敷铜的方法
  15. java中intern,在Java中什么时候使用String.intern()方法?
  16. Python海龟画图 画一个爱心 赶快给女朋友来一个
  17. 科全可拓展免费进销存系统
  18. 云计算助力中国产业数字化升级
  19. DBeaver安装教程及基础使用手册
  20. 金山卫士开源---kclear 卫士垃圾清理

热门文章

  1. 最新CSM会议室预约系统源码+功能强大
  2. hans wouters_Barbecue长板全国经销商招募书
  3. scrapy框架下pythom爬虫的数据库(MYSQL)
  4. C++的四种类型转换
  5. [Android]【安卓】Json数据的快速拼装和解析
  6. Java中实例是什么意思?
  7. 【20220505】文献翻译9:从视频中学习语音驱动的3D对话手势
  8. 面试官问你什么是消息队列?把这篇甩给他!
  9. 我的创作纪念日丨感恩这365天来有你相伴,不忘初心,各自精彩
  10. make_plural