单元测试(Unit Testing)是对软件中的最小可测试单元进行检查和验证。
单元测试内容
单元测试原则
- 快速的 单元测试应能快速运行,如果运行缓慢,就不会愿意频繁运行它。
- 独立的 单元测试应相互独立,某个测试不应为下一个测试设定条件。当测试相互依赖时,一个没通过就会导致一连串的失败,难以定位问题。
- 可重复的 单元测试应该是可以重复执行的,并且结果是可以重现的。
- 自我验证的 单元测试应该有布尔输出,无论是通过或失败,不应该查看日志文件或手工对比不同的文本文件来确认测试是否通过。
- 及时的 及时编写单元测试代码,应恰好在开发实际的单元代码之前。
单元测试过程
单元测试质量
测试通过率是指在测试过程中执行通过的测试用例所占比例,单元测试通常要求测试用例通过率达到100%。
测试覆盖率是用来度量测试完整性的一个手段,通过覆盖率数据,可以了解测试是否充分以及弱点在哪里。代码覆盖率是单元测试的一个衡量标准,但也不能一味地去追求覆盖率。
单元测试方法
静态测试:通过人工分析或程序正确性证明的方式来确认程序正确性。
动态测试:通过动态分析和程序测试等方法来检查和确认程序是否有问题。
黑盒测试(Black Box Testing):又称功能测试,它将测试对象看做一个黑盒子,完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。
白盒测试(White Box Testing):又称结构测试,它把测试对象看做一个透明的盒子,允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。
单元测试之xUnit
xUnit 通常适用于以下场景的测试
- 单个函数、一个类或者几个功能相关类的测试
- 尤其适用于纯函数测试或者接口级别的测试
xUnit 无法适用于复杂场景的测试
- 被测对象依赖关系复杂,甚至无法简单创建出这个对象
- 对于一些失败场景的测试
- 被测对象中涉及多线程合作
- 被测对象通过消息与外界交互的场景
单元测试之Mock
Mock测试是在测试过程中对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象(即Mock对象)来创建以便测试的方法。
- 真实对象具有不可确定的行为(产生不可预测的结果)
- 真实对象很难被创建(如具体的Web容器)
- 真实对象的某些行为很难触发(如网络错误)
- 真实情况令程序的运行速度很慢
- 真实对象有用户界面
- 测试需要询问真实对象它是如何被调用的
- 真实对象实际上并不存在
关键:需要应用针对接口的编程技术,即被测试的代码通过接口来引用对象,再使用Mock对象模拟所引用的对象及其行为,因此被测试模块并不知道它所引用的究竟是真实对象还是Mock对象