理解概念

1、单元测试的概念理解

单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类。

一个工厂生产电视机的例子。如果把电视机的生产、测试和软件的开发、测试进行类比,你可以发现:

  • 电子元器件就像是软件中的单元,通常是函数或者类,对单个元器件的测试就像是软件测试中的单元测试;
  • 组装完成的功能电路板就像是软件中的模块,对电路板的测试就像是软件中的集成测试;
  • 电视机全部组装完成就像是软件完成了预发布版本,电视机全部组装完成后的开机测试就像是软件中的系统测试。

2、单元测试对开发的好处

  1. 单元测试属于最严格的软件测试手段,是最接近代码底层实现的验证手段,可以在软件开发的早期以最小的成本保证局部代码的质量。
  2. 单元测试都是以自动化的方式执行,所以在大量回归测试的场景下更能带来高收益。
  3. 单元测试的实施过程还可以帮助开发工程师改善代码的设计与实现,并能在单元测试代码里提供函数的使用示例,因为单元测试的具体表现形式就是对函数以各种不同输入参数组合进行调用,这些调用方法构成了函数的使用说明。

掌握方法

如何做好单元测试?你首先必须弄清楚单元测试的对象是代码,以及代码的基本特征和产生错误的原因,然后你必须掌握单元测试的基本方法和主要技术手段。
1、代码基本特征与产生错误的原因

无论是开发语言还是脚本语言,都会有条件分支、循环处理和函数调用等最基本的逻辑控制,如果抛开代码需要实现的具体业务逻辑,仅看代码结构的话,你会发现所有的代码都是在对数据进行分类处理,每一次条件判定都是一次分类处理,嵌套的条件判定或者循环执行,也是在做分类处理。

可见,要做到代码功能逻辑正确,必须做到分类正确并且完备无遗漏,同时每个分类的处理逻辑必须正确。而在开发实践的过程中,通常考虑从以下方面考虑

  • 如果要实现正确的功能逻辑,会有哪几种正常的输入;
  • 是否有需要特殊处理的多种边界输入;
  • 各种潜在非法输入的可能性以及如何处理。

2、测试用例
单元测试的用例是一个输入数据和预计输出的集合。
完整的输入数据

被测试函数的输入参数;
被测试函数内部需要读取的全局静态变量;
被测试函数内部需要读取的成员变量;
函数内部调用子函数获得的数据;
函数内部调用子函数改写的数据;
嵌入式系统中,在中断调用时改写的数据

明确的预计输出

被测试函数的返回值;
被测试函数的输出参数;
被测试函数所改写的成员变量;
被测试函数所改写的全局变量;
被测试函数中进行的文件更新;
被测试函数中进行的数据库更新;
被测试函数中进行的消息队列更新;

3、驱动代码,桩代码和Mock代码
驱动代码,桩代码和Mock代码,是单元测试中最常出现的三个名词
什么是单元测试_系统测试

  • 驱动代码,指调用被测函数的代码,单元测试过程中,驱动模块通常包括调用被测函数前的数据准备、调用被测函数以及验证相关结果三个步骤。驱动代码的结构,通常由单元测试的框架决定。
  • 桩代码,是用来代替真实代码的临时代码。 比如,某个函数 A 的内部实现中调用了一个尚未实现的函数 B,为了对函数 A 的逻辑进行测试,那么就需要模拟一个函数 B,这个模拟的函数 B 的实现就是所谓的桩代码。
  • Mock,Mock 代码和桩代码非常类似,都是用来代替真实代码的临时代码,起到隔离和补齐的作用。在使用 Mock 代码的测试中,对于结果的验证(也就是 assert),通常出现在 Mock 函数中。

实际流程

实际软件项目中开展单元测试

  1. 并不是所有的代码都要进行单元测试,通常只有底层模块或者核心模块的测试中才会采用单元测试。
  2. 你需要确定单元测试框架的选型,这和开发语言直接相关。
  3. 为了能够衡量单元测试的代码覆盖率,通常你还需要引入计算代码覆盖率的工具。
  4. 最后你需要把单元测试执行、代码覆盖率统计和持续集成流水线做集成,以确保每次代码递交,都会自动触发单元测试,并在单元测试执行过程中自动统计代码覆盖率,最后以“单元测试通过率”和“代码覆盖率”为标准来决定本次代码递交是否能够被接受。

总结

全部笔记内容从茹炳晟的《软件测试52讲》整理。

参考链接

  • 什么是单元测试?如何做好单元测试?