阅读以下关于某嵌入式系统多路数据采集说明,回答下列问题。
[说明] 某嵌入式系统中,存在16路数据采集通道,为了提高数据采集可靠性,对16路采集通道均采用双余度设计,为了监控采集通道是否发生故障,对各路双余度通道采集值进行比较,只有当该通道两个余度设备采集值均不小于45时,才表示该路通道正常。
设计人员设计函数num_of_passer用于统计无故障通道数目,在该函数设计中考虑了如下因素:
9采用如下数据结构存储通道号及采集值: Struct value {unsigned int No; //通道号,1到16 unsigned short Value1; //余度1采集值 unsigned short Value2; //余度2采集值 }
10当输入参数异常时,函数返回-1;
11若正确统计了无故障通道数目,则返回该数目;
12该函数需要两个输入参数,第一个参数是用于存储通道号及余度采集值数组,第二个参数为通道总数目。
开发人员根据上述要求使用ANSI C对代码实现如下(代码中第一个数字代表行号): 1)unsigned int num_of_passer(struct value array[], unsigned int num) { 2)unsigned int n=0; //循环变量 3)unsigned int counter; //无故障通道数目 4)if((array=NULL)||(num==0)||(num>16)) 5)return-1; //当输入参数异常时,函数返回-1 6)for(n=0; nimage.png=num; n++) { 7)if((array[n].Value1>45) && ((array[n].Value2>45))) 8)counter=counter+1; } 9)return counter; }
1、嵌入式软件中通常使用圈复杂度来衡量程序可维护性(一般要求圈复杂度不大于10),请计算函数num_of_passer圈复杂度。
2、作为测试人员,请参照表1序号1方式使用代码审查方法找出该程序中所包含至少3处错误。

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

正确答案及解析
正确答案
解析
1、圈复杂度:7
2、
3、
1、本题考查软件测试一些基本概念和通过代码审查查找软件缺陷以及设计测试用例能力。 此题目要求考生认真阅读题目所给软件设计说明信息和软件代码,熟悉结构体数据类型和不同代码覆盖率要求,结合软件测试一些基本概念,在此嵌入式软件中进行实际应用。
控制流程图分析是一个静态分析过程,它提供静态度量标准技术,一般主要运用在白盒测试方法中。控制流图是McCabe复杂度计算基础,McCabe度量标准是将软件流程图转化为有向图,然后以图论知识和计算方法来衡量软件质量。
McCabe复杂度包括圈复杂度(Cyclomatic complexity)、基本复杂度、模块涉及复杂度、设计复杂度和集成复杂度等。 在软件测试概念里,圈复杂度“用来衡量一个模块判定结构复杂程度,数量上表现为独立线性路径条数,即合理预防错误所需测试最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序可能错误和高圈复杂度有着很大关系”。
圈复杂度大说明程序代码判断逻辑复杂,可能质量低且难于测试和维护。程序可能错误和高圈复杂度有着很大关系。 嵌入式软件中通常使用圈复杂度来衡量程序可维护性,一般要求圈复杂度不大于10。函数num_of_passer。流程图如图1所示。

有以下3种方法计算圈复杂度:
(1)没有流程图算法: 基数为1,碰到以下项加1: 分支数(如if、for、while和do while);switch中case语句数; 如果条件是2个复合条件话,则加2,否则加1。
(2)给定流程图G圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边数量,N是流图中结点数量。
(3)给定流程图G圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定结点数量。
按第1种没有流程图算法,函数num_of_passer中一个for,两个if,但是一个if是3个复合条件应该加3,另一个if是两个组合条件,应该加2,所以圈复杂度为基数(1)+for(1)+if(3)+if(2)=7,圈复杂度为7。
按第2种圈复杂度V(G),定义为V(G)=E-N+2算法,函数num_of_passer流程图中E为16,N为11,所以V(G)=16-11+2=7。
按第3种圈复杂度V(G),定义为V(G)=P+1,函数num_of_passer流程图中P为6,所以V(G)=P+1=6+1=7。
上述3种算法中任意方法,函数num_of_passer圈复杂度都计算为7。
2、代码审查是不执行软件代码,而通过阅读软件代码发现代码可能存在错误过程。代码审查测试内容包括检查代码和设计一致性;检查代码执行标准情况;检查代码逻辑表达正确性;检查代码结构合理性;检查代码可读性。
通过对说明阅读,按照说明中描述要求进行函数num_of_passer代码审查。
阅读第1行代码,函数返回值定义为unsigned int;而在说明第(2)条描述了当输入参数异常时,函数返回-1;这样发现说明和代码不一致,显然代码定义unsigned int不能返回-1,此为第1处错误。修改函数返回值定义为int类型即可。
阅读第3行代码,定义了无故障通道数目counter,在定义时未进行初始化,并且在第8行使用前依然未初始化。这就导致counter初值为非确定值,可能出错,此为第2处错误。在第3行定义counter时初始化为0或者在使用前进行初始化为0均可。
阅读第4行代码,对模块输入参数进行合法性检查,num合法值为1至16;然后查找使用num之处,在第6行对num进行了使用,但第6行使用时却从0开始,而且是小于等于num,这就意味着如果第4行num值为最大值16,在第6行就需要循环判断17次(0到16),而本题说明中描述很清楚,最多就16路通道,此为第3处错误。
但此问题更改有两种方案,方案1可以更改第4行num>16为num>=16,缩小此参数合法范围;方案2可以更改第6行nimage.png=num为nimage.pngnum减少循环次数。
阅读第7行代码,对每个通道采集双余度值进行有效性判断。按照说明,当余度设备采集值均不小于45时,才表示该路通道正常;但代码中使用当余度设备采集值均大于45时,表示该路通道正常,在对边界点45处理上与说明不一致,此为第4处错误。将第7行代码中两个“>”符号修改为“>=”即可与说明一致。
3、覆盖率是度量测试完整性一个手段,也是度量测试有效性一个手段。在嵌入式软件白盒测试过程中,通常以语句覆盖率、分支覆盖率和MC/DC覆盖率作为度量指标。语句覆盖率指程序中每条可执行语句至少被执行一次。分支覆盖指程序中每个判定取所有可能值至少一次。
MC/DC覆盖率指在一个程序中每一种输入输出至少应出现一次,在程序中每一个条件必须产生所有可能输出结果至少一次,并且每个判定中每个条件必须能够独立影响一个判定输出,即在其他条件不变前提下仅改变这个条件值,而使判定结果改变。
对函数num_of_passer来说,为了使其中所有语句至少执行一次,程序中两种返回值必须各覆盖一次,所以为达到100%语句覆盖率,至少需要两个测试用例,即参数异常测试用例和参数正常测试用例。 函数num_of_passer在第4行和第7行有两处条件判断,为了使程序中每个判定取所有可能值至少一次,第4行需要取TRUE和FALSE,第7行需要取TRUE和FALSE。
由于第4行取FALSE时,就能覆盖到第7行判定,同时又由于第7行判定在一个大于一次循环中,一个测试用例就可以覆盖到第7行TRUE和FALSE,所以函数num_of_passer100%分支覆盖也最少两个测试用例就可以满足,即一个第4行取TRUE测试用例和一个第4行取FALSE、第7行取TRUE和FALSE测试用例即可,由于第7行条件判断在多次循环中,取TRUE和FALSE测试用例也比较好构造。
函数num_of_passer组合条件也出现在第4行和第7行。对第4行组合条件需要4个测试用例来满足MC/DC覆盖,分别为①参数array为NULL,②array不为NULL且num为0,③array不为NULL且num为大于16值,④array不为NULL且num为1到16之间值。
对第7行组合条件需要3个测试用例来满足MC/DC覆盖,分别为①Value1>45且Value2>45,②Value1>45且Value2<=45,③Value1<=45且Value2为任意值。由于取第4行array不为NULL且num为1到16之间值测试用例时,程序将执行到第7行,这时由于第7行在一个多次循环中,第7行需要3个测试用例都可以在此用例中进行覆盖,所以最少需要4个测试用例就可以使函数num_of_passer满足100%MC/DC覆盖。
你可能感兴趣的试题

-
- A.V(S2)和P(S4)
- B.P(S2)和V(S4)
- C.P(S2)和P(S4)
- D.V(S2)和V(S4)
- 查看答案

-
- A.V(S1)P(S2)和V(S3)
- B.P(S1)V(S2)和V(S3)
- C.V(S1)V(S2)和V(S3)
- D.P(S1)P(S2)和V(S3)
- 查看答案

-
- A.P(S4)和V(S4)V(S5)
- B.V(S5)和P(S4)P(S5)
- C.V(S3)和V(S4)V(S5)
- D.P(S3)和P(S4)V(P5)
- 查看答案

-
- A.P(S3)和V(S4)V(S5)
- B.V(S3)和P(S4)P(S5)
- C.P(S3)和P(S4)P(S5)
- D.V(S3)和V(S4)V(S5)
- 查看答案

-
- A.P(S2)和P(S4)
- B.P(S2)和V(S4)
- C.V(S2)和P(S4)
- D.V(S2)和V(S4)
- 查看答案