一、单元测试目的
1.跟踪需求和设计实现是否一致
2.发现设计和需求中存在的错误
3.验证代码是否与设计相符合
4.发现在编码过程中引入的错误。
二、单元测试内容
2.1 模块接口测试
- 调用所测模块时的输入参数于模块的形式参数在个数、属性、顺序上是否匹配。
- 所测模块调用子模块时,它输入子模块的参数与子模块的形式参数在个数、属性、顺序上是否匹配。
- 输出给标准函数的参数在个数、属性、顺序上是否匹配。
- 全局变量的定义在各模块是否一致。
2.2 局部数据结构测试
- 检查不正确或者不一致的数据类型说明
- 使用尚未赋值或尚未初始化的变量
- 错误的初始化或者默认值
- 变量名拼写错误或书写错误
- 不一致的数据类型
2.3 路径测试
- 运算的有限次序不正确或者误解了运算的有限次序
- 运算的方式错误(运算的对象彼此在类型上不相容)
- 算法错误
- 初始化不正确
- 运算精度不够
- 表达式的符号表示不正确等
- 不同数据类型的比较
- 不正确的逻辑运算或优先次序
- 因浮点运算精度问题而造成的两值比较不等
- “差1错”即不能正确地多循环或者少循环一次
- 错误的或不能的循环终止条件
- 当遇到发散的迭代时不能终止循环
- 不适当地修改了循环变量
4 错误处理测试
- 出错的描述难以理解
- 出错的描述不足以对错误定位和确定出错原因
- 显示的错误与实际错误不符合
- 对错误条件的处理不正确
- 在对错误进行处理之前,错误条件已经引起系统的干预
- 如果出错情况不予考虑,那么检查恢复正常后的模块可否正常工作
5 边界测试
单元测试的类型:
逻辑单元测试
集成单元测试
功能单元测试
用边界值分析方法设计测试用例,在边界值测试模块能否正常工作。
6 单元测试的作用
编写单元测试可以帮助开发人员书写更高质量的代码
编写单元测试可使开发人员更有信心重构应用程序,去拥抱变化
三、测试覆盖率
对测试方法的所有情况、分支都测试完整并进行度量的指标就叫做“代码覆盖率”,包含四个方面:
- 语句覆盖率(statement coverage):是否每个语句都执行了?
- 分支覆盖率(branch coverage):是否每个if代码块都执行了?
- 函数覆盖率(function coverage):是否每个函数都调用了?
- 行覆盖率(line coverage):是否每一行都执行了?
四、单元测试原则
- 根据详细设计编写单元测试用例,(而不是根据代码编写)
- 单元测试前要检查单元测试入口条件是否完全满足
- 单元测试必须满足一定的覆盖率,重点接口函数要做单元测试。
- 单元测试发现问题后,修改代码之后还要进行测试。
- 单元测试必须满足预定的出口条件才能结束。
- 记录单元测试报告,分析问题种类和原因。
- 单元测试始终在配置管理控制下进行,软件问题的修改须符合变动规程的要求。
- 单元测试文档、测试用例、测试记录和被测程序等齐全,符合规范。
五、单元测试策略
- 驱动(Drive)模块:用于模拟被测试模块的上一级模块,相当于被测模块的主程序,用于接收测试数据,并把这些数据传送给被测模块,启动被测模块,最后输出实测结果。
- 桩(Stub)模块:用于模拟被测模块工作过程中所调用的模块。
六、单元测试停止条件
1.单元测试用例设计已经通过评审。
2.按照单元测试计划完成了所有规定单元的测试。
3.达到了测试计划中关于单元测试所规定的覆盖率的要求。
4.被测试的单元每千行代码必须发现至少3个错误。
5.软件单元功能与设计相一致。
6.单元测试中发现的错误已经得到修改,各级缺陷修复率达到标准。