《软件测试52讲》读书笔记(三) —— 如何做好单元测试
什么是单元测试?
单元测试是对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证,属于最严格的软件测试手段,是最接近代码底层实现的验证手段,可以在软件开发的早期以最小的成本保证局部代码的质量,且以自动化的方式执行
如何做好单元测试?
1. 清楚单元测试的对象:代码
2. 代码的基本特征和产生错误的原因
产生的原因:所有对于代码的处理都会进行分类,任何一个分类遗漏、错误,都会产生缺陷;如果分类正确也没有遗漏,但是分类时的处理逻辑错误,也同样会产生缺陷
解决方案:必须做到分类正确并且完备无遗漏,同时每个分类的处理逻辑必须正确
通常一般会考虑以下几点:
* 要实现正确的功能逻辑,会有哪几种正常输入
* 是否需要特殊处理的多种边界输入
* 各种潜在非法输入的可能性以及如何处理
注意:单元测试的“等价类”其实就是代码中的“功能点”
3. 提前准备好单元测试的用例
单元测试用例是“输入数据”和“输出数据”的合集

4. 单元测试代码逻辑梳理整理:驱动代码、桩代码、Mock代码
驱动代码是用来调用被测函数的,而桩代码和Mock代码是用来代替被测函数调用的真实代码的。

三者逻辑关系:
驱动代码(Driver)指调用被测函数的代码并且驱动代码的结构,通常由单元测试的框架决定
桩代码(Stub)是用来代替真实代码的临时代码;桩代码的应用首先起到了隔离和补齐的作用,使被测代码能够独立编译、链接,并独立运行。同时,桩代码还具有控制被测函数执行路径的作用
Mock代码和桩代码非常类似,都是用来代替真实代码的临时代码,起到隔离和补齐的作用
Mock代码和桩代码的本质区别:测试期待结果的验证(Assert and Expectiation)
-
Mock代码关注方法有没有被调用,以什么样的参数被调用,被调用的次数,以及多个Mock函数的先后调用顺序
-
桩代码关注是否利用Stub来控制被测函数的执行路径,不会去关注Stub是否被调用以及怎么样被调用
在实际项目中如何开展单元测试?
-
只有底层模块或者核心模块的测试中才会采用单元测试
-
确定单元测试框架的选型
-
需要对桩代码框架和Mock代码框架选型,选型的主要依据是开发所采用的具体技术栈
-
单元测试框架、桩代码/Mock代码的选型工作由开发架构师和测试架构师共同决定
-
为了能够衡量单元测试的代码覆盖率,通常你还需要引入计算代码覆盖率的工具
-
需要把单元测试执行、代码覆盖率统计和持续集成流水线做集成,以确保每次代码递交,都会自动触发单元测试,并在单元测试执行过程中自动统计代码覆盖率,最后以“单元测试通过率”和“代码覆盖率”为标准来决定本次代码递交是否能够被接受
在实行过程中可能遇到的问题:
-
紧密耦合的代码难以隔离
-
隔离后编译链接运行困难
-
代码本身的可测试性较差,通常代码的可测试性和代码规模成正比
-
无法通过桩代码直接模拟系统底层函数的调用
-
代码覆盖率越往后越难提高
总结:
-
代码要做到功能逻辑正确,必须做到分类正确并且完备无遗漏,同时每个分类的处理逻辑必须正确
-
单元测试是对软件中的最小可测试单元在与软件其他部分相隔离的情况下进行的代码级测试
-
桩代码起到了隔离和补齐的作用,使被测代码能够独立编译、链接,并运行

浙公网安备 33010602011771号