参考答案:
【问题1】 【问题3】
圈复杂度:7
【问题2】
详细解析:
本题考查软件测试的一些基本概念和通过代码审查查找软件缺陷以及设计测试用例的能力。
此题目要求考生认真阅读题目所给的软件设计说明信息和软件代码,熟悉结构体数据类型和不同代码覆盖率的要求,结合软件测试的一些基本概念,在此嵌入式软件中进行实际应用。
【问题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个用例数。