白盒测试定义:
逻辑驱动测试,允许检查程序内部逻辑结构,从而获取测试数据
白盒测试测试策略:
- 穷举路径测试
- 逻辑覆盖测试
穷举路径测试
穷举路经测试定义:使用测试用例执行程序中所有可能的控制流路径。那么程序可能得到了完全的测试。
穷举路径测试存在的问题
程序中不同逻辑中的路径数量可能达到天文数字,这就意味着要设计巨大数量的测试用例,用于测试,并且测试所化的时间成本也是巨大成本。这种情况下基本不可能实现。
即使我们可以测试所有路径。但是程序可能本身就存在错误。这里有三个原因。
1) 即使是穷举测试也不能保证程序符合其设计规范。举例:如果设计初衷是编写一个升序的冒泡排序,而实际上却错误的编写了一个降序的冒泡排序。那么测试就
没有多大意义了。因为他是一个错误的程序,违背了设计的初衷。
2) 程序可能因为缺少某些路径二存在问题。穷举测试肯定不会知道缺少了那条路径。他只会在已知的路径中去寻找bug,验证预期结果。
3) 穷举测试可能不会暴漏数据敏感错误。
逻辑覆盖测试
逻辑覆盖准则:
- 判定覆盖和分支覆盖准则
- 条件覆盖准则
- 判定/条件覆盖准则
判定覆盖和分支覆盖准则:要求编写足够的测试用例,使得每一个判断但至少有一个为真和为假的输出结果。换句话说,对于每条分支路径,都必须至少遍历一次。分支判定包括:
(C语言)
switch 语句
do-while 语句
if-else 语句
应用领域:
a.设计某些方法以尽可能覆盖源代码所有分支,提高测试的覆盖率。
b.通过白盒测试找内存泄露。
c.对源代码进行静态分析找出某种极端情况下才会出现的问题。
分类:
a.静态分析:只是静态地分析程序的代码是否符合相应的编码规范或是检查程序里的逻辑错误。分为代码走查、
代码审查及技术评审(测试参与)。运用白盒测试工具(C++test,Logiscope)来自动检测。
b.动态测试:实际运行被测软件来测试
边界值测试
1)数据类型的边界值:注意数据类型的边界值
eg:DOS平台C语言中各种数据类型的边界值
短整型:-32768~32767
整型:-32768~32767
长整型:-2147485648~2147483647
字符型:256
单精度型:-2147485648~2147483647
双精度型:-1.7*10的308次方~1.7*10的308次方
2)数组的边界值:注意数组类型的边界值,放止产生数组越界
内存溢出问题:
Eg:int a[5];
for(i=0;i<=5;i++)
scanf("%d",&a[i]);
for(i=1;i<5;i++)
printf("%d",a[i]);
第一个for循环事先在内存中只给a[5]分配了5个整型元素所占的空间,而在scanf输入时却要输入6个元素,那么多输入的元素存在哪?只能存在与数组a[5]相邻的内存空间,而这一空间是没有提前分配的,其中不一定存储什么样的数据,因此就比较危险,可能引起内存溢出的错误。
第二个for循环显然把a[0]这一数组元素漏掉了。
3)分支判断语句的边界值:注意边界等于值
逻辑驱动覆盖技术:
*程序的三种结构:顺序、分支和循环结构
a.语句覆盖测试:
b.分支覆盖测试:
c.条件覆盖测试:
d.分支-条件覆盖测试:
e.条件组合覆盖测试:
f:路径覆盖测试:
循环语句测试:
a.简单循环的测试重点
(1).循环变量的初值是否正确
(2).循环变量的最大值是否正确
(3).循环变量的增量是否正确
(4).何时退出循环
b.串接循环
c.嵌套循环
(1).当外循环变量为最小值,内层循环也为最小值时,运算的结果
(2).当外循环变量为最小值,内层循环为最大值时,运算的结果
(3).当外层循环为最大值,内层循环为最小值时,运算的结果
(4).当外层循环为最大值,内层循环为最大值时,运算的结果
(5).循环变量的增量是否正确
(6).何时退出内循环
(7).何时退出外循环