自动化测试

自动化测试

目的

在频繁迭代中,通过自动化测试可以减少代码bug,保证代码能够按照预期跑通。自动化测试一开始是帮你找bug,后续的角色是进行安全检查。

自动化测试需要包括哪些内容呢?我觉得需要包含单元测试、集成测试、接口测试。

简要概括单元测试、集成测试、接口测试

  • 单元测试:抛开所有外部依赖,验证单个函数的功能是否符合预期。
  • 集成测试:在单元测试的基础上,测试多个函数组合起来是否按照预期。
  • 接口测试:通过单元测试和集成测试验证了小功能,还需要通过接口测试验证整个链路是否按照预期执行。

自动化测试之单元测试

1. 单元测试的FIRST准则

  • Fast:测试不能每跑一次都要耗费大量的时间。
  • Independent: 测试与测试之间不应该存在依赖关系。
  • Repeatable: 测试应该在任何环境下都能运行,不论是生产环境、测试环境,或者是在家里的笔记本电脑上。
  • Self-Validating 测试的结果应该是显而易见的,不应该是靠人去查看它的输出才能判断测试的成功与失败,即使用断言来判断实际是否满足预期。
  • Timely: 测试需要在正式代码之前就写好。

2. 单元测试的一些其他要求

  • 单元测试Case就是文档,因为说明了输入和输出
  • 每个case只测试单一函数的单一行为
  • 测试用例的名称要清晰表明测试目的,如TestCreateOrder_Failed_Pid_NotExist
  • 在编写正式代码之前,必须写出其相对应的单元测试;
    这就是说一定要先写出一个单元测试(因为还没有编写正式代码,所以它肯定会失败),再编写正式代码。
  • 只要一个单元测试失败了,就不要再编写任何更多的单元测试了;
    而是要去编写相应的的可以使之通过的正是代码,编译失败也算;
  • 只要正式代码可以使单元测试通过,就不要再编写更多的正式代码了;
    正式代码需要满足的唯一目标就是通过单元测试,只要通过单元测试,就表示我们此部分的代码已经写完了。

3. 单元测试的三段式

单元测试的三段式:

  • 准备测试数据。
  • 对测试数据进行操作。
  • 进行判定。

3. 单元测试的三大模块

  • 驱动模块:相当于所测模块的主程序。它接收测试数据,把这些测试数据传送给被测模块,最后再输出实测结果。
  • 桩模块。由被测模块调用,用以代替由被测单元所调用的模块的功能,返回适当的数据或进行适当的操作使被测单元能继续运行下去,同时还要进行一定的数据处理,如打印入口和返回等,以便检验被测模块与其下级模块的接口
  • 被测系统 SUT (System Under Test)

4. 测试替身 Test Double

前面提到了测试替身。

替身、依赖注入
+参数传入
+构造函数
+set函数

设计决定一切

测试替身有很多种:

  1. mock是测试替身的一种,复杂的一种
  2. 一般用mock来指定一个测试替身
  3. 为什么用mock object
  4. 返回一个数据
  5. 返回一个true/false 状态,可以使用一个测试替身
  6. 使用mock?是否按照预定顺序,是否执行?

测试与实现的顺序:
先写测试在写实现

持续集成

1. 持续集成Continuous integration

  • 定义:频繁地(一天多次)将代码集成到主干。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成

2. 持续集成的整个过程分为几步:

  • 代码提交
  • 代码测试:代码仓库对commit操作配置钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。
  • 构建:
  • 第二轮测试:进行全面测试,包含单元测试、集成测试、全链路接口测试。以自动化为主,少数无法自动化的测试用例需要人工跑
  • 部署
  • 回滚

参考:

https://codeship.com/continuous-integration-essentials

http://codecloud.net/10516.html
http://www.uml.org.cn/test/201107085.asp
http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd