问答题
针对以下C语言程序,请按要求回答问题。
下面是一个简单的C语言程序:
int funcl(int a,b,c)
int k=1;
if((a>0 || b<0)) k=k+a;
else k=k+b;
if(c>0) k=k+c;
return k;
问答题
画出该函数的程序流程图。
【正确答案】根据源程序易得流程图,如下图所示。

【答案解析】
问答题
设计测试用例,分别使函数的各种逻辑覆盖率尽量达到100%。如果认为该函数的某种逻辑覆盖率无法达到100%,需要说明原因。
【正确答案】经过分析不难知,上面这个程序包含:
1)5个语句:每行一个语句;
2)3个条件:a>0;b<0;c>0;
3)4个分支:有两个if语句,每个if语句有两个分支;
4)6个条件组合:条件表达式(a>0) || (b<0)共有两个条件a>0和b<0,故有4个条件组合;条件表达式(c>0)只有一个条件c>0,故有两个条件组合。所以该程序共有6个条件组合;
5)4条路径:从程序的入口到出口的路径共有4条,分别是:
Path1:1—2—3—5—6—8
Path2:1—2—3—5—7—8
Path3:1—2—4—5—6—8
Path4:1—2—4—5—7—8
【答案解析】
问答题
设计特殊的测试用例,说明各种逻辑覆盖之间的关系。
【正确答案】这个程序有3个输入:a、b、c,其输入数据组合是非常大的。下面对该程序分别应用不同的逻辑覆盖准则,设计测试用例。
首先根据源程序画出程序流图比较容易,然后分析学过的所有的逻辑覆盖(如语句覆盖,分支覆盖,路径覆盖等),分析针对每种逻辑覆盖的标准来设计测试用例。通过设计测试用例来体现各种逻辑覆盖之间的关系。
1.语句覆盖
根据语句覆盖准则,只需要采用两个输入数据组合:(a,b,c)=(1,1,1)、(-1,1,1),便可以把该程序的所有5个语句执行一遍。
2.分支覆盖(判定覆盖)
根据分支覆盖准则,只需要采用两个输入数据组合:(a,b,c)=(1,1,-1)、(-1,1,1),便可以把该程序的所有4个分支走遍。但未考虑b<0的情况,故不满足条件覆盖。说明满足分支覆盖的测试用例未必满足条件覆盖。
3.条件覆盖
根据条件覆盖准则,只需要采用两个输入数据组合:(a,b,c)=(1,1,-1)、(-1,-1,1),便可以把该程序的3个条件的真假情况都覆盖到。由于表达式(a>0)||(b<0)的计算值都为真,不会执行else语句,即不满足分支覆盖和语句覆盖。说明满足条件覆盖的未必满足分支覆盖和语句覆盖。
4.条件组合覆盖
根据条件组合的覆盖准则,只需要采用4个输入数据组合:(a,b,c)=(1,-1,1)、(1,1,1)、(-1,1,-1)、(-1,-1,-1),便可以把该程序的6个条件组合情况覆盖到。但执行的路径数只有2个,故不满足路径覆盖。说明满足条件组合的覆盖不一定满足路径覆盖。
5.路径覆盖
根据路径覆盖的准则,只需要采用4个输入数据组合:(a,b,c)=(1,1,1)、(1,1,-1)、(-1,1,1)、(-1,1,-1),便可以把该程序的所有4条路径都覆盖。路径覆盖是最强的覆盖准则。
【答案解析】