一.对以下程序代码,设计测试用例,分别实现语句覆盖,判定覆盖,条件覆盖,
判定/条件覆盖,条件组合覆盖,路径覆盖。
void DoWork(int x,int y,int z)
{
int
k=0,j=0;
if((x>3)&&(z<10))
{
k=x*y-1; //语句块1
j=sqrt(k);
}
if((x= =4)||(y>5))
{
j=x*y+10; //语句块2
}
j=j%3; //语句块3
}
程序流程图如下:
(1) 语句覆盖
由题可知,只要遍历路径abd,就能实现语句覆盖,
用例可为:x=4, y=4, z=4
(2) 判定覆盖
由题可知,只要遍历路径abd和ace 或者 abe和acd,就能实现判定覆盖,
用例可为:
x=4, y=4, z=4 【abd】
x=2, y=2, z=2 【ace】
或者
x=5, y=4, z=4 【abe】
x=4, y=6, z=11 【acd】
(3) 条件覆盖
由题可知,第一个判断条件的可能取值情况是:x>3 或 x<=3, z<10或者z>=10
第二个判断条件的可能取值情况是:x=4 或 x!=4 , y>5或者y<=5
用例可为:
x=4, y=6, z=6
x=3, y=5, z=10
(4) 判定/条件覆盖
由题可知,第一个判断条件的可能取值情况是:x>3 或 x<=3, z<10或者z>=10
第二个判断条件的可能取值情况是:x=4 或 x!=4 , y>5或者y<=5
只要遍历路径abd和ace 或者 abe和acd,就能实现判定覆盖
判定/条件覆盖必须同时满足判定覆盖和条件覆盖
用例可为:
x=4, y=6, z=6 【abd】
x=3, y=5, z=10 【ace】
(5) 条件组合覆盖
由题可知,满足多重条件覆盖准则的测试用例,必须覆盖以下8种组合:
第一个判定 |
第二个判定 |
x>3,z<10 【组合1】 |
x=4,y>5【组合5】 |
x>3,z>=10【组合2】 |
x=4,y<=5【组合6】 |
x<=3,z<10【组合3】 |
x!=4,y>5【组合7】 |
x<=3,z>=10【组合4】 |
x!=4,y<=5【组合8】 |
用例可为:
x=4, y=6, z=4 【组合1、5】
x=4, y=5, z=10 【组合2、6】
x=3, y=6, z=9 【组合3、7】
x=3, y=5, z=10 【组合4、8】
(6) 路径覆盖
由题可知,程序共有两个必经过节点,其中两两间均有两条不同路径,所以有w(1)、w(2),且必经节点1、2下的路径数分别为2、2条(个人认为该路径数指的是该节点与下一必经节点/ 结束节点之间的路径数),因此路径数为:(注意此处是非独立路径数)
w(1)w(2)=22=4 (推荐,将流程图的路径全部写出来就可以理解这个公式由来了)
(路径数也可通过 (1+11)(1+1*1)= 4 获得,路径同步即*,异步即+。
区别于上种算法,每一个小路径都要计算,包括非必经节点之间的)
故,要实现路径覆盖,用例需覆盖【abd】、【abe】、【acd】、【ace】四个路径。
用例可为:
x=4, y=5, z=5 【abd】
x=5, y=4, z=5 【abe】
x=2, y=6, z=5 【acd】
x=2, y=5, z=5 【ace】
二. 根据如下给出的程序流程图,完成以下要求:
(1)画出相应的控制流图。
(2)计算环形复杂度。
(3)找出程序的独立路径集合。(此处就是计算独立路径数,用于完全路径覆盖用例测试)
(1) 控制流图如下:
(2) 环形复杂度V(G)= E – N +2 = 10-7+2=5
(也可以= P+1=4+1=5)
注:此处的 E为控制流图边数(上图中指向1的不算入,若7有自循环的话也不计入,环形复杂度测量的是程序的逻辑复杂度),N为节点数,P为判断节点数。
(3) 独立路径数 = w(1)w(3)= 33 = 9
也可以=(111 + 11 +1)( 11 + 111 + 11) = 9
路径集合如下:
路径一:1→2→5→3→6→7
路径二:1→2→3→6→7
路径三:1→3→6→7
路径四:1→2→5→3→4→6→7
路径五:1→2→3→4→6→7
路径六:1→3→4→6→7
路径七:1→2→5→3→4→7
路径八:1→2→3→4→7
路径九:1→3→4→7