白盒测试
循环测试
有如下代码(C语言):
For (i=0;i<num;i++) { while (j>0) { j--; } }
该循环的测试用例设计思路是怎样的?
- 循环分为4种不同类型
- 简单循环
- 嵌套循环
- 连锁循环(串接循环)
- 非结构循环(不规则循环)
简单循环测试
零次循环
:从循环入口到出口一次循环
:检查循环初始值二次循环
:两次通过循环- m次循环: 检查多次循环
- 最大次数循环n、比最大次数多一次n+1、少一次的循环n-1。
嵌套循环测试
- 对最内层循环做简单循环的全部测试。所有其它层的循环变量置为最小值.
- 逐步外推,对其外面一层循环进行测试。测试时保持所有外层循环的循环变量取最小值,所有其它嵌套内层循环的循环变量取“典型”值.
- 反复进行,直到所有各层循环测试完毕.
- 对全部各层循环同时取最小循环次数,或者同时取最大循环次数.
连锁循环
如果各个循环互相独立,则可以用与简单循环相同的方法进行测试。但如果几个循环不是互相独立的,则需要使用测试嵌套循环的办法来处理。
非结构循环
这一类循环应该使用结构化程序设计方法重新设计测试用例。
Z路径覆盖
- 路径覆盖是白盒测试最为典型的问题。
- 完成路径测试的理想情况是做到路径覆盖,对于比较简单的小程序实现路径覆盖是可以做到的,但是如果程序中出现多个判断和多个循环,可能的路径数目将会急剧增长,达到天文数字,以至于实现完全的路径覆盖是不可能的。
- 为了解决这一问题,我们必须舍掉一些次要因素,
对循环机制进行简化
,从而极大地减少路径的数量,使得覆盖这些有限的路径成为可能。这种简化意义下的路径覆盖称为Z路径覆盖
- 注意:
- 循环化简是指限制循环的次数。无论循环的形式和实际执行循环体的次数是多少,
只考虑循环一次和零次两种情况
。即:只考虑执行时进入循环体一次和跳过循环体的两种情况。
在循环简化的思路下,循环与判定分支的效果是一样的,即:循环要么执行、要么跳过。
z路径覆盖设计测试用例
程序插桩技术
- 在软件动态测试中,程序插桩(Program Instrumentation)是一种基本的测试手段
- 方法简介:借助往被测程序中插入操作,来实现测试目的的方法。
- 最简单的插桩:在程序中插入打印语句printf(“…”)语句
- 如果我们想要了解一个程序在某次运行中所有可执行语句被覆盖的情况,或是每个语句实际执行次数,最好的办法就是利用程序插桩技术.
例:求取两个整数X和Y的最大公约数程序如下: int gsd (int X,int Y) { int Q=X; int R=Y; while(Q!=R) { if(Q>R) Q=Q-R; else R=R-Q; } return Q; }
最大公约数算法之更相减损术
在我国古代的数学著作《九章算术》中,就介绍了“约分术”:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
可以根据程序绘制出其流程图
为了记录该程序中语句的执行次数,我们使用插桩技术插如如下语句:C(i)=C(i)+1, i=1,2,…,6
程序从入口开始执行,到出口结束,凡经历的计数语句都能记录下该程序点的执行次数。
如果我们在程序的入口处还插入了对计数器C(i)初始化的语句,在出口处插入了打印这些计数器的语句,就构成了完整的插桩程序。它就能记录并输出在各程序点上语句的实际执行次数.
下图为插桩之后的程序,箭头所指为插入的语句。原程序的语句已略去。
设计插桩程序时需要考虑的问题包括:
- 需要探测哪些信息
- 在程序的什么部位设置探测点
- 需要设置多少个探测点
静态测试法
静态测试不实际运行软件,只是检查和审阅,主要对软件的编程格式,结构等方面进行评估。