目录
什么是单元测试
单元测试是在软件开发过程中要进行的最低级别的测试活动, 或者说是针对软件设计的最小单位——程序模块,进行正确性检验 的测试工作。其目的在于发现每个程序模块内部可能存在的差错。
测试对象
结构化编程-函数、过程
面向对象编程-类
测试目的
发现设计或视线中的逻辑错误,及早暴露代码中的缺陷,便于问题的 定义和解决
测试方法
一般以白盒测试为主、结合黑盒测试的方法,允许多个测试单元的测试并行展开。
单元测试的内容
1、模块接口测试
对通过被测模块的数据流进行测试,检查进出模块的数据是否正确。
主要涉及以下几方面的内容:
- 模块接收输入的实际参数个数与模块的形式参数个数是否一致。
- 输入的实际参数与模块的形式参数的类型是否匹配。
- 输入的实际参数与模块的形式参数所使用单位是否一致。
- 调用其他模块时,所传送的实际参数个数与被调用模块的形式参数的个数是否相同。
- 调用其他模块时,所传送的实际参数与被调用模块的形式参数的类型是否匹配。
- 调用其他模块时,所传送的实际参数与被调用模块的形式参数的单位一致。
- 调用内部函数时,参数的个数、属性和次序是否正确。
- 在模块有多个入口的情况下,是否有引用与当前入口无关的参数。
- 是否会修改了只读型参数。
- 出现全局变量时,这些变量是否在所有引用它们的模块中都有相同的定义。
- 有没有把某些约束当做参数来传送。
1、在做内外存交换时要考虑:
- 文件属性是否正确;
- OPEN与CLOSE语句是否正确;
- 缓冲区容量与记录长度是否匹配;
- 在进行读写操作之前是否打开了文件;
- 在结束文件处理时是否关闭了文件;
- 正文书写/输入错误;
- I/O错误是否检查并做了处理。
2、模块局部数据结构测试
检查局部数据结构能否保持完整性
主要涉及以下几方面的内容:
- 不正确或不一致的数据类型说明
- 变量没有初始化
- 变量名拼写错或书写错
- 数组越界
- 非法指针
- 全局数据对模块的影响
3.模块独立执行路径测试
对模块中重要的执行路径进行测试。检查由于计算错误、判定错误、控制流错误导致的程序错误。
Checklist:
- 死代码
- 错误的计算优先级
- 精度错误(比较运算错误、赋值错误)
- 表达式的不正确符号
- 循环变量的使用错误
4.模块内部错误处理测试
检查内部错误处理设施是否有效
Checklist:
- 是否检查错误出现 出现错误,
- 是否进行错误处理
- 抛出错误、通知用户、进行记录
- 错误处理是否有效
5.模块边界条件测试
检查临界数据是否正确处理
Checklist:
- 普通合法数据是否正确处理
- 普通非法数据是否正确处理
- 边界内最接近边界的(合法)数据是否正确处理
- 边界外最接近边界的(非法)数据是否正确处理
单元测试过程
(1)理解设计
(2)概览源代码
(3)走读代码
(4)设计测试用例
(5)搭建测试环境
(6)执行测试用例
(7)重复进行设计测试用例和加载测试
(8)分析判断,给出结论
BMI计算实例
身体质量指数:BMI,Body mass index,用于衡量人体肥胖程度和是否健康
BMI=体重/身高的平方(kg/m2)
测试过程第一步-理解需求与设计
1.BMI计算的功能要求?
2.输入参数?
3.接口?
4.数据处理格式?
测试过程第二、三步-概览源代码、走读源代码
测试过程第四步-设计测试用例
白盒还是黑盒?
测试脚本设计
单元测试脚本的基本功能
模拟手工测试:
- 调用被测单元
- 执行测试用例
- 校验实际输出
- 判断测试结果(通过或失败)
- 如果发现bug,则记录缺陷
方案1
1.使用“main”函数
2.用户输入身高、体重
3.调用被测方法 4.将返回值输出到屏幕
单元测试必须自动化
单元测试脚本的基本功能
模拟手工测试:
- 调用被测单元 执行测试用例,让脚本自动获取输入
- 校验实际输出,让脚本自动校验
- 判断测试结果(通过或失败),让脚本自动判断
- 如果发现bug,则记录缺陷,让脚本自动记录
方案2
1.使用“main”函数
2.自行设置输入值(身高、体重)
3.调用被测方法
4.自行比较实际返回值和预期返回值
5.主动报告缺陷
单元测试脚本的基本功能
模拟手工测试:
- 将测试代码从产品代码中分离出来
- 调用被测单元
- 自动获取输入并执行测试用例
- 自动校验实际输出
- 自动判断测试结果(通过或失败)
- 记录测试执行过程,让脚本自动记录
方案3
1.在test文件夹下放置测试代码
2.自行设置输入值(身高、体重)
3.调用被测方法
4.自行比较实际返回值和预期返回值
5.主动记录执行过程和测试结果报告缺陷
单元测试环境-单元测试过程第五步
基本单元本身不是一个独立的程序,自己不能运行,要靠其它部分来调用和驱动。
驱动模块 (Driver)
被测基本单元的主程序,它接收测试数据,并把数据传送给被测单元,最后输出实测结果。
桩模块 (Stub)
用来代替被测基本单元调用的其他基本单元。
单元测试环境-单元测试框架
目前的最流行的单元测试工具是xUnit系列框架,常用的根据语言不同分为JUnit(java),CppUnit(C++),DUnit (Delphi ),NUnit(.net),PHPUnit(Php )等等。该测试框架的第一个和最杰出的应用就是由Erich Gamma (《设计模式》的作者)和Kent Beck(XP(Extreme Programming)的创始人 )提供的开放源代码的JUnit。
JUnit:主要测试用Java语言编写的代码
CppUnit:主要测试用C++语言编写的代码