一、单元测试概述:
1. 现实开发问题:
2. 单元测试:
单元是构造软件系统的基础, 只有使每个单元得到足够的测试, 系统的质量才能有可靠的保证, 即单元测试是构筑产品质量的基石;
单元测试是对软件中的最小可测试单元进行检查和验证;
验证代码、设计更好、 文档化行为、 具有回归性
程序员必须对自己的代码质量负责, 单元测试是对自己的代码质量的基本承诺.
3. 单元测试内容:
- 模块接口: 对通过所有被测模块的数据流进行测试;
- 局部数据结构: 检查模块中的数据结构是否正确的定义和使用;
- 边界条件: 检查数据流或控制流中条件或数据处于边界时的出错可能性;
- 独立路径: 检查由于计算错误, 判断错误, 控制流错误呆滞的程序错误;
- 出错处理: 检车可能引发错误处理的路径以及进行错误处理的路径;
4. 单元测试原则:
- 快速的: 单元测试应能快速运行, 如果运行缓慢, 就不会愿意频繁的运行;
- 独立的: 单元测试应相互独立, 某个测试不应为下一个测试设定条件. 当测试相互依赖时, 一个没有通过就会导致一连串的失败, 难以定位问题.
- 可重复性: 单元测试应该可以重复执行, 并且结果是可以重现的;
- 自我验证性: 单元测试应该有布尔输出, 无论是通过或失败, 不应该查看日志文件或手工对比不同的文本文件来确认是否通过;
- 及时的: 及时编写单元测试代码, 应恰好在开发实际的单源代码之前;
5. 单元测试过程:
6. 单元测试质量:
6.1 测试通过率:
测试通过率是指在测试过程中执行通过的测试用例所占的比例,
单元测试通常要求测试用例通过率达到100%;
6.2 测试覆盖率:
测试覆盖率是用来度量测试完整性的一个手段, 通过覆盖率数据, 可以了解测试是否充分以及弱点在哪里. 代码覆盖率测试是单元测试的一个衡量标准, 但也不能一味的追求覆盖率;
主要包括:
- 语句覆盖;
- 判定覆盖;
- 条件覆盖;
- 判定条件覆盖;
- 条件组合覆盖;
- 路径覆盖;
7. 单元测试方法:
7.1 静态测试:
通过人工分析或程序正确定证明的方法来确认正确性;
7.2 动态测试:
通过动态分析和程序测试等的方法来检查和确认程序是否有问题;
7.3 黑盒测试:
黑河测试又称功能测试, 它将测试对象看作一个黑盒子, 完全不考虑长须内部的逻辑结构和内部特性, 只依据程序的需求规格书名数, 检查程序的功能是否符合他的功能说明;
7.4 白盒测试:
百合测试, 也称结构测试, 它把测试对象看做一个透明的盒子, 允许测试人员利用程序内部的逻辑及有关信息, 设计或选择测试用例, 对程序所有逻辑路径进行测试;
7.5 模块测试:
需要开发"驱动模块"用来调用"被测模块", 产生测试结果; 开发"桩模块", 用来替代支持模块, 被"被测模块"调用;
8. 单元测试之xUnit
8.1 xUnit通常适用于以下场景:
- 单个函数, 一个类后者几个功能相关类的测试;
- 尤其适用于纯函数测试或者接口级别的测试;
8.2 xUnit无法适用于复杂场景的测试:
- 被测对象依赖关系复杂, 甚至无法简单创建出这个对象;
- 对于一些失败场景的测试;
- 被测对象中涉及多线程合作;
- 被测对象通过消息与外界交互的场景;
9. 单元测试之Mock:
Mock测试是在测试过程中对于某些不容易构造或者不容易获取的对象, 用一个虚拟的对象(Mock对象)来创建以便测试的方法;
- 真实对象具有不确定的行为(产生补课预测的结果);
- 真实对象很难被创建(如具体的web容器);
- 真实对象的某些行为很难被触发(如网络错误);
- 真实情况令程序的运行速度很慢;
- 真实对象有用户界面;
- 测试需要询问真实对象, 它是如何被调用的;
- 真实对象实际上并不存在;
关键:
需要应用针对接口的编程技术, 即被测试的代码通过接口来引用对象, 在使用Mock对象模拟所引用的对象及其行为, 因此被测试模块并不知道它所引用的究竟是真是的对象还是Mock对象;
二、黑盒测试方法:
1. 测试用例的重要性:
设计良好的测试用例是关键;
- 降低软件测试成本;
- 保证测试工作质量;
- 评估和检验测试效果;
2. 测试用例的概念:
- 测试用例值: 完成被测试软件的某个执行所需要的输入值;
- 期望结果: 当且仅当程序满足期望行为, 执行测试时产生的结果;
- 前缀值: 将软件置于合适的状态来接受测试用例值的任何必要的输入;
- 后缀值: 测试用例值被发送以后, 需要被发送到软件的任何输入;(验证值, 结束命令)
3. 测试用例设计的要求:
- 具有代表性和典型性;
- 寻求系统设计和功能设计的弱点;
- 既有正确输入也有错误或异常输入;
- 考虑用户实际的诸多使用场景;
4. 黑盒测试技术:
黑盒测试是将测试对象看做一个黑盒子, 完全不考虑程序内部的逻辑结构和内部特性,指依据程序的需求规格说明书, 检查程序的功能是否符合他的功能说明.
黑盒测试技术:
- 等价类划分;
- 边界值分析;
- 因果图决策表;
- 场景法;
- 组合设计法;
- 状态转换测试;
5. 等价类划分:
5.1 等价类划分:
等价类划分是将输入与划分尽可能少的若干子域, 在划分中要求每个子域两两互不相交, 每个子域称为一个等价类;
- 同一输入域的等价类划分可能不唯一;
- 只需要从每一个等价类中选取一个输入作为测试用例;
- 对于相同的等价类划分, 不同测试人员选取的测试用例集可能是不同的;
5.2 等价类分类
等价类可以分为有效等价类和无效等价类:
- 有效等价类是对规格说明有意义, 合理的输入数据构成的集合, 能够检验程序是否实现了规格说明中预先规定的功能和性能;
- 无效等价类是对规格说明无意义, 不合理的输入数据构成的集合, 已检查程序是否具有一定的容错性;
5.3 变量等价类:
- 取值范围: 在输入条件规定了取值范围的情况下, 可以确定一个有效等价类和两个无效等价类;
- 字符串: 在规定了输入数据必须遵守的规则情况下, 可以确定有一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则);
- 枚举: 若规定输入数据是一组值(假定N个), 并且程序要对每一个输入值分别处理, 可确定N个有效等价类和一个无效等价类;
- 数组: 数组十一组具有相同类型的元素的集合, 数组的长度及其类型都可以作为等价类划分的依据;
- 复合数据类型: 符合数类型是包含两个或两个以上相互独立的属性的输入数据, 在进行等价类划分时需要考虑输入数据的每个属性的合法和非法值; 对符合数据类型中的每个元素进行等价类划分, 再将这些等价类进行组合, 最中形成对软件整个输入域的划分;
5.4 等价类组合:
测试用例生成: 测试对象通常有多个参数, 如何对这些参数等价类进行组合测试, 来保证等价类的覆盖率, 是测试用例设计首先需要考虑的问题;
所有有效等价类的代表值都集成到测试用例中, 即覆盖有效等价类的所有组合. 任何一个组合都将设计成一个有效的测试用例, 也称正面测试用例;
无效等价类的代表值只能和其他有效等价类的代表值(随意)进行组合; 因此, 每个无效等价类将产生一个额外的吴小测试用例, 也称负面测试用例;
6.边界值分析:
6.1 边界值分析:
边界值分析是对输入或输出的边界值进行测试的一种方法, 它通常作为等价类划分法的补充, 这种情况下的测试用例来自等价类的边界;
- 先确定边界: 通常输入或输出等价类的边界就是应该着重测试的边界情况;
- 选取正好等于、刚刚大于或刚刚小于边界的值作为测试数据, 而不是选取等价类中的典型值或任意值。
实践表明: 大多数故障往往发生在输入定义域或输出定义域的边界上, 而不是内部;
6.2 基本思想:
基本思想: 故障往往发生在输入变量的边界值附近;
- 边界值分析法是基于可靠性理论中称为"单故障"的假设, 既有两个或两个以上故障同事出现而导致失效的情况很少;
- 对程序中的每个变量重复;