某嵌入式系统中,存在16路数据采集通道。为了提高数据采集的可靠性,对16路采集通道均采用双余度设计;为了监控采集通道是否发生故障,对各路双余度通道采集值进行比较。只有当该通道两个余度设备采集值均不小于45时,才表示该路通道正常。设计人员设计函数num_of_passer用于统计无故障通道数目,在该函数的设计中考虑了如下因素: 11采用如下数据结构存储通道号及采集值: structValue {unsignedintNo;//通道号,1到16 unsignedshortvalue1;//余度1采集值 unsignedshortvalue2;//余度2采集值 } 12当输入参数异常时,函数返回-1; 13若正确统计了无故障通道数目,则返回该数目; 14该函数需要两个输入参数,第一个参数是用于存储通道号及余度采集值的数组,第二个参数为通道总数目; 15调用函数sort16对存储通道号及余度采集值的数组进行排序处理。 开发人员根据上述要求使用ANSIC对代码实现如下(代码中每行的第一个数字代表行号): 1unsignedintnum_of_passer(structValuearray[],unsignedintnum) 2{ 3unsignedintn=0;//循环变量 4unsignedintcounter;//无故障通道数目 5if((array==NULL)||(num==0)||(num>16)) 6return-1;//当输入参数异常时,函数返回-1 7sort(array);//对存储值的数组进行排序处理 8for(n=0;n<=num;n++) 9{ 10if((array[n].Valuel>45)&&(array[n].value2>45)) 11counter=counter+1; 12} 13returncounter; 14} 11、嵌入式软件中通常使用函数扇出数和注释率来衡量程序的可维护性,请计算函数num_of_passer的扇出数和注释率,并判断此函数扇出数和注释率是否符合嵌入式软件的一般要求。(6分) 12、请使用代码审查的方法找出该程序中所包含的至少4处错误,指出错误所在的行号和问题描述。(8分) 13、覆盖率是度量测试完整性的一个手段,也是度量测试有效性的一个手段。在嵌入式软件白盒测试过程中,通常以语句覆盖率、分支覆盖率和MC/DC覆盖率作为度量指标,请分别指出对函数num_of_passer达到100%语句覆盖、100%分支覆盖和100%MC/DC覆盖所需的最少测试用例数目。(6分)
11、 扇出数:1 注释率:28.6%(4/14) 嵌入式软件一般要求扇出数不大于7和注释率不小于20%,所以此函数扇出数和注释率均符合要求。 12、 13、 本题考查软件测试的一些基本概念和通过代码审查查找软件缺陷以及设计测试用例的能力。 此题目要求考生认真阅读题目所给的软件设计说明信息和软件代码,熟悉结构体数据类型和不同代码覆盖率的要求,结合软件测试的一些基本概念,在此嵌入式软件中进行实际应用。 扇出数指在结构图中,模块所属的直接下级模块个数,即本模块所调用的模块数目。模块num_of_passer中仅调用了排序模块sort,所以模块num_of_passer的扇出数为1。注释率指代码中注释的行数与代码总行数的比率,即注释行数/代码总行数×100%所得的结果。模块num_of_passer的注释率为4/14×100%=28.6%。为了保证软件的可维护性,嵌入式软件的相关标准中一般要求模块的扇出应控制在7以下,注释的行数不得少于源程序总行数的1/5。模块num_of_passer的扇出数为1,注释率为28.6%,均满足嵌入式软件的一般要求。 代码审查是不执行软件代码,而通过阅读软件代码发现代码可能存在的错误的过程。代码审查的测试内容包括检查代码和设计的一致性;检查代码执行标准的情况;检查代码逻辑表达的正确性;检查代码结构的合理性;检查代码的可读性。通过对说明的阅读,按照说明中描述的要求进行模块num_of_passer的代码审查。 阅读第1行代码,函数返回值定义为unsigned int;而在说明的第(2)条描述了当输入参数异常时,函数返回-1;这样发现说明和代码不一致,显然代码定义的unsigned int不能返回-1,此为第1处错误。修改函数返回值的定义为int类型即可。 阅读第4行代码,定义了无故障通道数目counter,在定义时未进行初始化,并且在11行使用前依然未初始化。这就导致counter的初值为非确定值,可能出错,此为第2处错误。在第4行定义counter时初始化为0或者在使用前进行初始化为0均可。 第5行代码对模块输入参数进行合法性检查,num合法值为1至16;然后查找使用num之处,在第8行对num进行了使用,但第8行使用时却从0开始,而且是小于等于num,这就意味着如果第5行num值为最大值16,在第8行就需要循环判断17次(0到16),而本题的说明中描述很清楚,最多就16路通道,此为第3处错误。但此问题的更改有两种方案,方案1可以更改第5行num>16为num>=16,缩小此参数的合法范围;方案2可以更改第8行n<=num为n<num减少循环次数。 阅读第10行代码,对每个通道采集的双余度值进行有效性判断。按照说明,当余度设备采集值均不小于45时,才表示该路通道正常;但代码中使用当余度设备采集值均大于45时,表示该路通道正常,在对边界点45的处理上与说明不一致,此为第4处错误。将第10行代码中的两个“>”符号修改为“>=”即可与说明一致。 覆盖率是度量测试完整性的一个手段,也是度量测试有效性的一个手段。在嵌入式软件白盒测试过程中,通常以语句覆盖率、分支覆盖率和MC/DC覆盖率作为度量指标。语句覆盖率指程序中每条可执行语句至少被执行一次。分支覆盖指程序中每个判定取所有可能值至少一次。MC/DC覆盖率指在一个程序中每一种输入输出至少应出现一次,在程序中的每一个条件必须产生所有可能的输出结果至少一次,并且每个判定中的每个条件必须能够独立影响一个判定的输出,即在其他条件不变的前提下仅改变这个条件的值,而使判定结果改变。 对模块num_of_passer来说,为了使其中所有的语句至少执行一次,程序中的两种返回值必须各覆盖一次,所以为达到100%语句覆盖率,至少需要两个测试用例,即参数异常的测试用例和参数正常的测试用例。 模块num_of_passer在第5行和第10行有两处条件判断,为了使程序中每个判定取所有可能值至少一次,第5行需要取TRUE和FALSE,第10行需要取TRUE和FALSE。由于第5行取FALSE时,就能覆盖到第10行判定,同时又由于第10行的判定在一个大于一次的循环中,一个测试用例就可以覆盖到第10行的TRUE和FALSE,所以模块num_of_passer 100%的分支覆盖也最少两个测试用例就可以满足,即一个第5行取TRUE的测试用例和一个第5行取FALSE、第10行取TRUE和FALSE的测试用例即可,由于第10行的条件判断在多次循环中,取TRUE和FALSE的测试用例也比较好构造。 模块num_of_passer的组合条件也出现在第5行和第10行。对第5行的组合条件需要4个测试用例来满足MC/DC覆盖,分别为①参数array为NULL,②array不为NULL且num为0,③array不为NULL且num为大于16的值,④array不为NULL且num为1到16之间的值。对第10行的组合条件需要3个测试用例来满足MC/DC覆盖,分别为①Value1>45且Value12>45,②Value1>45且Value2<=45,③Value1<=45且Value2为任意值。由于取第5行array不为NULL且num为1到16之间值的测试用例时,程序将执行到第10行,这时由于第10行在一个多次循环中,第10行需要的3个测试用例都可以在此用例中进行覆盖,所以最少需要4个测试用例就可以使模块num_of_passer满足100%的MC/DC覆盖。