单元测试学习笔记


示例代码太少,以后会逐渐补上。

目录:

  • 综述
  • 单元测试时所面临的问题
  • 依赖隔离
  • 依赖隔离的例子
  • 交互测试
  • 单元测试框架
  • 快捷实现用于测试接口的框架(Mockito)
  • 做好以上准备后
  • 重构与单元测试
  • 修复BUG或添加新功能的单元测试
  • 获得接口的几种方法(基于值和状态的测试)
  • 一些补充

Android单元测试 - 如何开始?

这里的依赖指的是:当前 类A 需要调用 类B 的方法,则说 A 依赖于 B 。

隔离方法:

  1. 将 B 改成一个 接口C 。
  2. 将 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
  • 各条错误处理通路测试:保证每一个异常都经过测试
  • Android 单元测试的任务(摘自:Android单元测试在蘑菇街支付金融部门的实践)
    • 所有的Model、Presenter/ViewModel、Api、Utils等类的public方法
    • Data类除了getter、setter、toString、hashCode等一般自动生成的方法之外的逻辑部分
    • 自定义View的功能:比如set data以后,text有没有显示出来等等,简单的交互,比如click事件,负责的交互一般不测,比如touch、滑动事件等等。
    • Activity的主要功能:比如view是不是存在、显示数据、错误信息、简单的点击事件等。比较复杂的用户交互比如onTouch,以及view的样式、位置等等可以不测。因为不好测。
  • 关于 Android 单元测试的一切 <-在页面里搜索该标题

  • 走进单元测试二:测试需要从哪些方面着手


  • 相关