目录
什么是单元测试?如何做好单元测试?
一、什么是单元测试
- 电子元器件 软件中的单元 通常是函数或者类 对单个元器件的测试 单元测试
- 组装完成的功能电路板 软件中的模板 对电路板的测试 软件集成测试
- 电视机组装完成 软件预发布 开机测试 软件的系统测试
单元测试: 最小可测单元 程序其他部分隔离 检查和验证 (函数或者类)
二、如何做好单元测试
1.代码的基本特征与产生错误的原因
做到代码逻辑正确,必须做到分类正确并且完备无遗漏,同时每个分类的处理逻辑必须正确
- 正常的功能逻辑的有哪几种正常的输入
- 特殊处理的多种边界输入
- 潜在的非法输入的可能性以及如何处理
2.单元测试用例详解
单元测试用例是一个“输入数据”和“预计输出”的集合。
输入数据
- 输入参数
- 成员变量
- 调用子函数获得的数据
- 调用子函数改写的数据
- 嵌入式系统中,中断调用时改写的数据
- 等等
输出数据
- 返回值
- 输出参数
- 改写的成员变量
- 改写的全局变量
- 文件更新
- 数据库更新
- 消息队列更新
- 等等
- 对于预计输出值,必须严格根据代码的功能逻辑设定,不然不是掩耳盗铃吗?
3.驱动代码 桩代码 和 Mock代码
驱动代码(Driver)指调用被测函数的代码
桩代码(Stub)是用来代替真实代码的临时代码
桩代码的应用要起到隔离和补齐的作用,使得被测代码能够独立编译、链接并独立运行,同时还具有控制被测函数执行路径的作用
- 相同原型,内部实现不同(保证链接)
- 保证隔离和补齐(简单),保证原函数声明,空实现,通过编译链接即可
- 实现控制功能的桩函数是应用最广泛的,根据测试用例的需要 输出合适的数据作为被测函数的内部输入
Mock代码
和桩代码非常类似,本质区别是: 测试期待结果的验证
- Mock代码关注点是方法有没有被调用 以什么样的参数被调用 被调用的次数 多个Mock函数的先后调用顺序,对于结果的验证,通常出现在Mock函数中
- 桩代码 关注点是利用Stub控制被测函数的执行路径,对于结果的验证通常出现在驱动函数中?
三、实际项目中如何开展单元测试
1.只有底层模块或者核心模块的测试才会采用单元测试
2.确定单元测试框架的选型,和开发语言相关
3.衡量单元测试的代码覆盖率 -----引入计算代码覆盖率的工具
4.把单元测试执行,代码覆盖率统计和持续集成流水线做集成,(提交自动触发单元测试)单元测试通过率和代码覆盖率为标准来决定本次代码提交是否能被接受
四、难点
1.紧密耦合的代码难以隔离
2.隔离后编译链接运行困难
3.代码本身的可测试性较差 (通常和代码规模成正比)
4.无法通过桩代码直接模拟系统底层函数的调用
5.代码覆盖率越往后越难提高