一、基本概念
白盒测试
- 这是一种验证技术,软件工程师可以使用它来检查他们的代码是否按预期工作
- 它考虑了系统或组件的内部机制
- 它也被称为结构测试、透明盒测试和玻璃盒测试
- 它表明您完全了解软件产品的内部工作,特别是代码的逻辑和结构。
静态测试和动态测试。
- 静态白盒测试方法:代码检查、静态结构分析、静态质量度量方法等。
- 动态白盒测试是基于覆盖,尽可能覆盖测试程序结构特征和逻辑路径。
- 动态白盒测试方法:逻辑覆盖、循环覆盖、基础路径覆盖等。
- 主要用于单元测试。
白盒测试必须遵循几个原则:
- 模块中的所有独立路径必须至少实现一次
- 所有逻辑值都需要测试两种情况:true 和 false
- 检查内部数据结构的程序,并确保其结构的有效性
- 在操作范围内运行所有循环
为什么不能详尽的测试
- 路径穷举测试方法无法检测程序本身是否违反设计规范,是否是错误的程序
- 由于路径遗漏,路径穷举测试程序无法检测到错误
- 路径穷举测试无法发现与数据相关的一些错误
白盒测试发展的四代
- 第一代白盒测试:
- 测试开发初期
- 调试、断言和打印语句
- 第二代白盒测试:
- 通过正式语言操作。 (测试脚本)
- 测试脚本组合成测试用例,测试用例组合成测试集,使用测试工程来管理测试集
- 使用代码覆盖率评估测试结果
- RTRT、代码测试、可视化测试、C++测试等
- 第三代白盒测试:
- 解决了重复测试的问题,测试模式从一次性过渡到继续测试模式
- Xunit
- 第四代白盒测试:
![image-20211109191635126](https://i-blog.csdnimg.cn/blog_migrate/9cc51e0adf1825422498385cf39accf8.png)
四代白盒测试的比较
![image-20211109191711161](https://i-blog.csdnimg.cn/blog_migrate/9c7d6310f75c876e5d24ef7c900c6a90.png)
二、逻辑覆盖
语句覆盖
- 语句覆盖就是设计多个测试用例,运行被测试的程序,使每个可执行语句至少执行一次。
- 在图中,所有的可执行语句都在路径L1中,所以选择路径L1来设计测试用例,可以覆盖所有的可执行语句。
![image-20211109191849909](https://i-blog.csdnimg.cn/blog_migrate/5ff603b237dfc8680204c89cb3ed061a.png)
判定覆盖
就是设计多个测试用例,运行被测试的程序,使每个判断的真假分支至少经过一次。
![image-20211109192132461](https://i-blog.csdnimg.cn/blog_migrate/df2660edabbe1c57f7b91b243db3c24f.png)
条件覆盖
就是设计多个测试用例,运行被测试的程序,使程序中每个条件的可能值至少执行一次。
![image-20211109192145034](https://i-blog.csdnimg.cn/blog_migrate/6926a9dc6ccb365f6d00b0a31d7ab841.png)
![image-20211109192218219](https://i-blog.csdnimg.cn/blog_migrate/cdf2a29ef6b534a9ec179c889baf069f.png)
条件判断覆盖
设计足够的测试用例,使每个判断的所有可能条件至少执行一次,每个判断执行的所有可能结果至少执行一次。
对于第一个判断是否满足这个要求。
![image-20211109192326437](https://i-blog.csdnimg.cn/blog_migrate/755e73a88378fe4025b06614abda5604.png)
条件组合覆盖
设计足够的测试用例,运行被测试的程序,使每个判断的所有可能的条件组合至少实现一次。
如果测试用例满足条件组合覆盖,那么它们肯定满足决策覆盖、条件覆盖和条件/决策覆盖。
![image-20211109192404733](https://i-blog.csdnimg.cn/blog_migrate/900eb5b5f3e9567ec2e45e16c2426071.png)
![image-20211109192429580](https://i-blog.csdnimg.cn/blog_migrate/a58ff2db4e57f02acbf0079d767750b7.png)
路径覆盖
设计足够多的测试用例来覆盖程序中所有可能的路径。
![image-20211109192644974](https://i-blog.csdnimg.cn/blog_migrate/107d6f75aff8e1420a64ea908885dc0b.png)
N-S图
![image-20211109192947344](https://i-blog.csdnimg.cn/blog_migrate/c700424f4d79c8d8bd045bf7d457663e.png)
三、控制流图
概念
- 在程序设计中,为了更加突出控制流结构,可以对程序进行简化,简化后的图称为控制流图。
- 在流程图上:
- 称为边的箭头表示控制流。
- 称为节点的圆圈代表一个或多个动作。
- 由边和节点包围的区域称为区域。
- 谓词节点是包含条件的节点。
![image-20211109200603755](https://i-blog.csdnimg.cn/blog_migrate/3c2e373a3df7790f4ac9e2edf0497ddb.png)
![image-20211109200707784](https://i-blog.csdnimg.cn/blog_migrate/58d573fe2694d079b391ef58d7c19578.png)
四、基本路径测试
- McCabe 提出的一种测试机制。
- 目的是导出程序设计的逻辑复杂性度量,并将其用作定义一组基本执行路径的指南。
- 使用基本集合的测试用例将至少执行每条语句一次。
圈复杂度(基本复杂度/圈复杂度)
- 它给出了逻辑复杂性的定量度量。
- 该值给出了基组中独立路径的数量,以及测试数量的上限,以确保每个语句和每个条件的两侧至少执行一次。
- 独立路径是通过程序的任何路径,它引入了至少一组新的处理语句(即新节点)或新条件(即新边)
- Cyclomatic Complexity (基本复杂度/圈复杂度)=判定节点数+1
- 独立路径数量=圈复杂度或基本复杂度的数量
总结
1、给定程序流程图转换控制流图注意两个要点。
2、给定程序片段绘制控制流图要注意 if-then-else 语句 和 if-then 语句的区别。
3、用基路径法测试注意控制流图是否是强连接。
4、通过将复合判定条件分解的方式可以提高测试强度, 但生成的测试用例会增加。
5、基路径测试是路径测试的一种,尽管也考虑了循环 问题,但是要着重测试循环体要用循环测试策略。
五、循环测试
- 专注于循环结构的有效性
- 循环类型
- 简单循环
- 嵌套循环
- 连接循环
- 非结构化循环
简单循环
以下测试集可应用于简单循环,其中 n 是允许通过循环的最大次数
- 完全跳过循环。
- 只有一次通过循环。
- 两次通过循环。
- m 通过循环,其中 m< n
- n-1, n, n+1 通过循环
嵌套循环
- 从最里面的循环开始。 将所有其他循环设置为最小值。
- 对最内层循环进行简单的循环测试,同时将外层循环保持在其最小迭代参数(例如,循环计数器)值。 为超出范围或排除的值添加其他测试。
- 向外工作,为下一个循环进行测试,但将所有其他外部循环保持在最小值,并将其他嵌套循环保持在“典型”值。
- 继续直到所有循环都被测试。
连接循环
- 如果每个循环相互独立:
可以使用为简单循环定义的方法来测试串联循环, - 其他的
推荐应用于嵌套循环的方法。
非结构化循环
只要有可能,应该重新设计此类循环以反映结构化编程结构的使用
六、数据流测试
- 数据流测试方法根据程序中变量的定义位置和用途来选择程序的测试路径
- 数据流测试是检测由于编码错误导致的数据值使用不当的强大工具
- 不正确的赋值或输入语句
- 定义缺失(使用空定义)
- 谓词错误(采用了错误的路径导致定义不正确)
- 还需要将一些测试工作集中在这些上(不是基于覆盖的测试的重点)
- 探索与数据状态相关的事件序列以及数据可能发生的不合理的事情。
- 探索使用每次计算产生的值的效果
- 包含数据值的变量具有定义的生命周期:创建、使用、杀死(销毁)。