单元测试学习笔记
示例代码太少,以后会逐渐补上。
目录:
- 综述
- 单元测试时所面临的问题
- 依赖隔离
- 依赖隔离的例子
- 交互测试
- 单元测试框架
- 快捷实现用于测试接口的框架(Mockito)
- 做好以上准备后
- 重构与单元测试
- 修复BUG或添加新功能的单元测试
- 获得接口的几种方法(基于值和状态的测试)
- 一些补充
Android单元测试 - 如何开始?
这里的依赖指的是:当前 类A 需要调用 类B 的方法,则说 A 依赖于 B 。
隔离方法:
- 将 B 改成一个 接口C 。
- 将 A 中的 B类 出现的位置替换为 接口C 。
A 和 B 隔离前后对比:
隔离前:A -> B
隔离后:A -> C -> B
在项目实际代码以及测试代码中使用不同的B:
- 在项目执行代码中:传入 类A 的对象是 接口C 的一个 派生类D (实现了 接口C )。 类D 是 项目中实际运行的代码,提供了对接口的完整实现。A -> C -> D
- 在单元测试的代码(独立于项目执行代码,发布软件时要把这部分删掉)中:传入 A 的对象也是实现了 接口C 的一个 派生类E 。但是这个类与D不同,它提供的实现可能只是一个return。从而模拟(Mock)了派生类D的特定行为,使得在测试的时候,不需要使用D类。A -> C -> E
这样做的好处是,一旦隔离完成,以后就不必大幅度修改A。在隔离的时候,要将所有依赖项改为从外部传入。这就需要给类A添加一个set方法,传入接口C的实现(implement),即上面的D和E。
Android单元测试在蘑菇街支付金融部门的实践
Java单元测试(Junit+Mock+代码覆盖率))
- 接口功能测试:用来保证接口功能的正确性。
- 局部数据结构测试(不常用):用来保证接口中的数据结构是正确的
- 比如变量有无初始值
- 变量是否溢出
- 边界条件测试
- 变量没有赋值(即为NULL)
- 变量是数值(或字符) 时
- 主要边界:最小值,最大值,无穷大(对于 double 等)
- 溢出边界(期望异常或拒绝服务):Min - 1,Max + 1
- 临近边界:Min + 1,Max - 1
- 变量是字符串时
- 应用上面提到的
字符变量
的边界 - 空字符串
- 对字符串长度应用
数值变量
的边界
- 应用上面提到的
- 变量是集合时
- 空集合(Empty)
- 对集合的大小应用
数值变量
的边界 - 调整次序:升序、降序
- 变量有规律时
- 比如对于Math.sqrt,给出n2-1,和n2+1的边界
- 所有独立执行通路测试:保证每一条代码,每个分支都经过测试
- 代码覆盖率
- 语句覆盖:保证每一个语句都执行到了
- 判定覆盖(分支覆盖):保证每一个分支都执行到
- 条件覆盖:保证每一个条件都覆盖到 true 和 false (即 if 、 while 中的条件语句)
- 路径覆盖:保证每一个路径都覆盖到
- 相关软件
- Cobertura:语句覆盖
- Emma: Eclipse插件Eclemma
- 代码覆盖率
- 各条错误处理通路测试:保证每一个异常都经过测试
- 所有的Model、Presenter/ViewModel、Api、Utils等类的public方法
- Data类除了getter、setter、toString、hashCode等一般自动生成的方法之外的逻辑部分
- 自定义View的功能:比如set data以后,text有没有显示出来等等,简单的交互,比如click事件,负责的交互一般不测,比如touch、滑动事件等等。
- Activity的主要功能:比如view是不是存在、显示数据、错误信息、简单的点击事件等。比较复杂的用户交互比如onTouch,以及view的样式、位置等等可以不测。因为不好测。
关于 Android 单元测试的一切 <-在页面里搜索该标题
走进单元测试二:测试需要从哪些方面着手