软件测试学习——白盒测试实验报告
软件测试课程作业二
实验内容
- 编写判断是否为闰年的程序
- 画出程序的流程图
- 将流程图转换为控制流图
- 基于控制流图,设计该程序的不同标准测试用例集合
- 语句覆盖
- 判定覆盖
- 条件覆盖
- 路径覆盖
- MC/DC 覆盖
实验过程
判断是否为闰年的程序
main 函数为主体框架,执行判定闰年的核心逻辑函数是bool checkLeapYear(int year)
1 |
|
绘制流程图
这里只绘制检测闰年的核心逻辑checkLeapYear
函数的流程图,框架代码实际上做了更加严密的数据输入格式保证。从 Unit Test 的角度看,我们先进性核心逻辑部分的单元测试。
1 |
|
流程图绘制如下
绘制控制流图
将流程图转化为控制流图如下
基于控制流图和覆盖准则下的测试用例设计
在核心逻辑代码中,判断语句仅有一个。为方便后续描述,下列定义:
- 符号\(A\)表示布尔表达式
year % 400 == 0
- 符号\(B\)表示布尔表达式
year % 4 == 0
- 符号\(C\)表示布尔表达式
year % 100 != 0
则判断语句形式化为\(A \vee B \wedge C\)。实际上\(A,B,C\)并不是独立的,至少存在下面的蕴含关系: \[A \Rightarrow B\] \[A \Rightarrow \overline{C}\] \[\overline{C} \Rightarrow B\] \[\overline{C} \wedge B \Rightarrow A\] 这在构造时要注意。不是完整的笛卡尔乘积,一个子集(关系)的真值表是成立的。
语句覆盖
- 概念:每个可执行语句至少执行一次
构造:由于只有单一语句,一组测例输入满足语句覆盖。
A B C 结果 对应测例 1 1 0 1 1600
判定覆盖
- 概念:每个判断的真假值都至少执行一次
构造:由于只有单一语句,那么构造两组测例使结果相反即可。
A B C 结果 对应测例 1 1 0 1 1600 0 1 0 0 200
条件覆盖
- 概念:每个条件的可能值至少满足一次
构造:由于有\(A,B,C\)三个布尔表达式,构造下表,使得纵列包含\(0,1\)两种取值即可,注意需要满足蕴含关系。
A B C 结果 对应测例 1 1 0 1 1600 0 0 1 0 2007
路径覆盖
概念:所有测试用例,覆盖所有路径
构造:输入可能是枚举不尽的,我就按照全部真值表可能枚举下,下面列出所有真值可能,不符合蕴含关系的在右侧有备注,即不能构造。
A B C 结果 备注 对应测例 0 0 0 0 2200 0 0 1 0 2007 0 1 0 0 不符合蕴含式 4 0 1 1 1 2008 1 0 0 1 不符合蕴含式 1 1 0 1 1 不符合蕴含式 1、2 1 1 0 1 1600 1 1 1 1 不符合蕴含式 2
MC/DC 覆盖
- 概念:改进条件 /判定范围 (MC/DC :ModifiedCondition/Decision Coverage):程序中的每个入口点和出口点至少被调用一次;判定中每个条件的所有取值至少出现一次;每个判定的所有可能结果至少出现一次;每个条件都能独立地影响判定的结果,即在其它所有条件不变的情况下改变该条件的值,使得判定结果改变。
构造:(!注意满足蕴含关系)控制变量的形式,比如先控制\(B,C\)不变,改变\(A\)的值,使得结果值改变(影响判定)。
A B C 结果 改变量 组别 对应测例 0 0 1 0 1 2007 0 1 0 0 不符合蕴含式,无法构造,做对照 2 0 1 1 1 B:0->1,与组 1 对比 3 2008 0 1 1 1 C:1->0,与组 2 对比 4 2008 0 1 0 0 不符合蕴含式,无法构造,做对照 5 1 1 0 1 A:0->1,与组 5 对比 6 1600 实际构造数少于理论构造样例数,因为有蕴含关系的限制。
实验结果
以路径覆盖中分析的四种可能真值构造的样例为输入检验程序正确性,运行结果如下图:
实验总结
本次实验亲手编程体验了白盒测试的过程,尤其是覆盖原则下的测例、测试集的构造。而且由于闰年条件的相关性(蕴含关系),在手动构建过程中还颇费了一番计算的功夫。通过本次实验,不仅重温了关系运算方面的知识,更加深了对白盒测试的相关概念的理解,增强构造测试集的能力。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!