列表

详情


阅读下列说明,回答问题1至3,将解答填入答题纸的对应栏内。
【说明】
某嵌入系统中,存在16路数据采集通道,为了提高数据采集的可靠性,对16路采集通道均采用双余度设计;为了监控采集通道是否发生故障,对各路双余度通道采集值进行了比较。只有当该通道两个余度设备采集值不均小于45时,才表示该路通道正常。设计人员设计函数mun_of_passer用于统计无故障通道数目,在改函数的设计中考虑了如下以因素:

(1)采用如下数据库结构存储通道号及采集值:

Struct  Value
                 {   unsigned int               No;                         //通道号,1到16
                      unsigned short           Value1;                      //余度1采集值
unsigned short           Value2;                      //余度2采集值
}
(2)当输入参数异常时,函数返回-1;
(3)若正确统计了无故障通道数目,则返回该数目;
(4)该函数需要两个输入参数,第一个参数是用于存储通道号及余度采集值的数组,第二个参数为通道总数目;
(5)调用函数sort()对存储通道号及余度采集值得的数组进行排序处理。
开发人员根据上述要求使用ANSI C对代码实现如下,(代码中每行第一个数字代表行号):
1    unsigned int num_of_passer(struct Value array[ ], unsigned int num)
2    {
3            unsigned int n =0;                                   //循环变量
4            unsigned int counter;                              //无故障通道数目
5            if((array = = NULL) ||(num = = 0) ||(num > 16))
6                    return-1;                                          //当输入参数异常时,函数返回-1
7            sort(array);                                              //对存储值的数组进行排序处理
8            for(n = 0;n < = num;n++)
9            {
10                   if((array[n]. Valuel > 45)&& (array[n]. Value2 > 45))
11                        counter = counter + 1;
12            }
13            return counter
14    }【问题1】(6分)
嵌入或软件中通常使用函数扇出数的注释来衡量程序的可维护性,请计算num_of_passer的扇出数和注释率,并判断此函数扇出数和注释率是否符合嵌入式软件的一般要求。
【问题2】(8分)
请使用代码审查的方法找出该程序中所包含的至少四处错误,批出错误的行号和问题描述。  

【问题3】(6分)
覆盖率是度量测试完整性的一个手段,也是度量测试有效性的一个手段。在嵌入式软件的白盒测试过程中,通常以语句覆盖率、分支覆盖率和MC/DC覆盖率作为度量指标,请分别指出对函数num_of_passer达到100%语句覆盖、100%分支覆盖和100%MC/DC覆盖所需的最少测试用例数目。

参考答案: 【问题1】
注释率:为4/14=28.6% 由于VC工程注释率要求为25%~50%,代码注释率要求为>=20%; 本题应为关键代码,注释率符合要求。
扇出数是指该模块调用了多少模块,本题中扇出数为:1 扇出一般3~4,不超过7,本题扇入 符合要求  
【问题2】


【问题3】


详细解析:

【问题1】
注释率是注释的行数/代码行数,本题为4/14=28.6%
扇出数,是指模块调用其他模块的个数,本题只调用了1个模块,所以扇出数为1,一般推荐模块扇出数位3~4比较合适,一般不超过7,扇出数为1说明模块比较大。
【问题2】
错误1:函数为无符号类型,而返回值中有-1的情况
错误2:题干中要求是不低于45,条件表达式应该是>=45,而不是>45
错误3:counter变量没有初始值,就直接counter=counter+1
错误4:由于整列的下标是从0开始,第16个值的下标应为15,题中循环判定条件为n<=num,而num的值是可以为16,当num为16时,会导致下标越界。
【问题3】
语句覆盖(SC):使被测试程序中每条语句至少执行一次
判定覆盖(DC):使程序中的每个判定至少都获得一次“真值”或“假值”
修正条件判定覆盖要求在一个程序中每一种输入输出至少得出现一次,在程序中的每一个条件必须产生所有可能的输出结果至少一次,并且每一个判定中的每一个条件必须能够独立影响一个判定的输出,即在其他条件不变的前提下仅改变这个条件的值,而使判定结果改变,其测试用例数一般为条件数+1~条件数*2的范围内。
对于语句覆盖,本题可以设计:一个测试用例使得第5行的判定为真,一个一切都正常的测试用例;因此语句覆盖使用2个测试用例即可覆盖。
对于判定覆盖,本题有3个判定,即第5行,第8行,第10行, 由于第一个判定为真时,结束,并返回;当第一个判定为假时,则进入第2个判定,由于第2个判定为循环控制结构,需二个测试用例即可实现真,假覆盖,当循环判定真,即进入第3个判定,第3个判定有真假两种情况,所以一个需要至少有3个测试用例用于100%DC覆盖(不考虑循环的情况)。但由于本题存在循环体,可以通过循环体来实现一个判定的真假覆盖,所以综合起来,本题最少需要2个测试用例。
对于array==null;num==0;num>16 需要四个测试用例
对于n<=num需要两个测试用例
对于array[n].Value1>45;array[n].Value2>45 需要三个测试用例
由于本题中,array[n].Value1>45;array[n].Value2>45 为TT的测试用例 可以覆盖 判定1 FFF 情况,判定2的T情况;所以综合起来测试用例最少数位1+3+1+2=7(不考虑循环的情况),但由于后面两个判定属于循环结构中,可以通过构造一定的测试用来通过循环减少数量,,所以,最后两个判定可以通过 多次循环来达成。所以最少为4个。

上一题