列表

详情


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


(2)当输入参数异常时,函数返回4;
(3)若正确统计了无故障通道数目,则返回该数目;
(4)该函数需要两个输入参数,第一个参数是用于存储通道号及余度采集值的数组,第二个参数为通道总数目。
开发人员根据上述要求使用ANSI C对代码实现如下(代码中第一个数字代表行号):



【问题1】(3分)
嵌入式软件中通常使用圈复杂度来衡量程序的可维护性(一般要求圈复杂度不大于10),请计算函数num_of_passer的圈复杂度。
【问题2】(6分)
作为测试人员,请参照表3-1序号1的方式使用代码审查的方法找出该程序中所包含的至少3处错误。


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


参考答案:

【问题1】
圈复杂度:7
【问题2】


【问题3】


详细解析:

本题考查软件测试的一些基本概念和通过代码审查查找软件缺陷以及设计测试用例的能力。
此题目要求考生认真阅读题目所给的软件设计说明信息和软件代码,熟悉结构体数据类型和不同代码覆盖率的要求,结合软件测试的一些基本概念,在此嵌入式软件中进行实际应用。
【问题1】
通过对控制流图的分析和判断来计算环形复杂度。
圈复杂度也称为环形复杂度、程序环境复杂度,是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有路径至少执行一次的测试数量的上界。有以下三种方法计算圈复杂度:
(1)没有流程图的算法:基数为1,碰到以下项加1;分支数(如if、for、while和do while);switch中的case语句数;如果条件是2个复合条件的话,则加2,否则加1。
(2)给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定节点的数量。
(3)给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中节点的数量。

【问题2】
代码检查法主要检查代码和程序设计的一致性,代码结构的合理性,代码编写的标准性、可读性,代码逻辑表达的正确性等方面。
【问题3】
覆盖率是度量测试完整性的一个手段,也是度量测试有效性的一个手段。在嵌入式软件白盒测试过程中,通常以语句覆盖率、分支覆盖率和MC/DC覆盖率作为度量指标。
1.语句覆盖
设计足够多的测试用例,使得被测试程序中的每条可执行语句至少被执行一次。
2.分支覆盖
设计足够多的测试用例,使得被测试程序中的每个判断的“真”、“假”分支至少被执行一次。
3.MC/DC覆盖
要求在一个程序中每一种输入输出至少得出现一次,在程序中的每一个条件必须产生所有可能的输出结果至少一次,并且每一个判定中的每一个条件必须能够独立影响一个判定的输出,即在其他条件不变的前提下仅改变这个条件的值,而使判定结果改变。

如上图所示,要使语句块1和语句块2各执行1次,至少需要两个测试用例。

如上图的红框所示,需要覆盖这两个判定,每个判定为真和假分别出现1次。

函数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的测试用例也比较好构造。

假设array==NULL条件为A1, NUM==0为条件B1, array[n].value1>45条件为A2, array[n].value2>45条件为B2。

则需要的测试用例为如下表格的红色字体所示,需要4个用例数。

上一题