《电子技术应用》
您所在的位置:首页 > 测试测量 > 设计应用 > 基于MC/DC的软件模块可靠性估计
基于MC/DC的软件模块可靠性估计
叶振宇
东南大学 软件学院,江苏 南京210096
摘要: 介绍了Nelson模型及修改的条件/判定覆盖的基本概念,提出用Nelson模型来估计软件模块可靠性,依据修改的条件/判定覆盖划分数据输入域。最终依据模块可靠性算出系统可靠性。
Abstract:
Key words :

摘   要: 介绍了Nelson模型及修改的条件/判定覆盖的基本概念,提出用Nelson模型来估计软件模块可靠性,依据修改的条件/判定覆盖划分数据输入域。最终依据模块可靠性算出系统可靠性。
关键词: Nelson模型  修改的条件/判定覆盖  软件可靠性  覆盖测试

  随着软件开发由手工作坊型向软件工厂型转变,软件系统的规模和复杂性大大增加,对大型复杂软件进行可靠性分析也越加困难。另外,可靠性模型的基本假设不能完全成立,从而使可靠性模型的估计值与实际统计值有较大差距。解决此问题的方法之一是将复杂软件系统按结构特征分解到模块层。模块的规模有限,结构简单,数据采集方便,估算各模块的可靠性相对要容易得多,然后依据各模块可靠性数据再对系统的可靠性进行估算。
1  Nelson模型简介

  将输入数据域划分为若干子集,根据工程经验或专家意见估计出各个子集在运行中被选用的概率,然后按此概率分布随机抽出n个输入数据,运行n次程序。如果运行失效次数为nl,则程序可靠度的估计是R=1-(nl/n)。
2  对模型输入数据域划分的分析
  Nelson模型的应用必须以程序的结构分析为基础,因此适用于结构性测试的场合。其输入数据域一般是依据程序执行路径来划分的。如图1所示的程序流程,有三个输入变量A、B、X,四条路径abd、ace、abe、acd,划分成表1所示的输入数据域。

  在诸Ei中规定了每个输入变量的取值区间,在取值区间内任意抽取一个变量的实际取值。将各个变量按顺序组合起来便生成了测试用例,即程序运行一次的数据。
  这种划分方法实际上是白盒测试中的全路径覆盖,是一种理想化的情况。其缺点为:路径是以分支的指数级别增加的。例如:一个函数嵌套10个if语句,就有1 024条路径;程序中有循环体时,路径数更是一个庞大的数字,何况还要从诸路径的输入数据域Ei中抽取若干样本来运行程序,因此花费的时间和成本相当高。
3  修改的条件/判定覆盖
  修改的条件/判定覆盖(Modified Condition/Decision Coverage,MC/DC)是白盒测试中逻辑覆盖的一种。它继承了多重条件覆盖的优点,线性地增加了测试用例的数量,对操作数及非等式变化反应敏感,具有更高的目标覆盖率。其相关概念定义如下。
  (1)条件(Condition):不包含逻辑表达式,仅包含由关系操作符(如≥≤=等)构成的布尔表达式。
  (2)判定(Decision):至少包含一个逻辑表达式(AND、OR、XOR等)的布尔表达式。
  修改的条件/判定覆盖:判定中每个条件的可能结果至少出现一次,每个判定本身的可能结果至少出现一次,每个入口点和出口点至少要唤醒一次,并且每个条件都显示能单独影响判定结果。
  如果一个条件能单独地确定判定的输出值(判定中的其他条件保持不变),则称该条件独立地影响判定结果。表明条件独立影响结果的二组测试用例称为独立影响对。
  

  从表2可以看出,(1)、(2)、(3)构成了判定D1满足修改的条件/判定覆盖的最小测试用例集。从数据域E1和E2中各取一个测试用例构成的独立影响对,表明了条件C1的独立性影响。同样,(2)、(3)、(4)构成了判定D2满足修改的条件/判定覆盖的最小测试用例集。

4  基于MC/DC的模块可靠性估计
  Nelson模型中程序的输入数据域Ei(i=1,2,……,N)的划分是一个关键性步骤。理想状况下,N是一个很大的数甚至是无穷大的数,在实际工程应用中,N只能取有限值。若依据全路径覆盖策略划分Ei,则N将随程序复杂度的增长而呈指数增长。所以提议依据修改的条件/判定覆盖的最小测试用例集来划分输入空间。例如,综合表2中的二个判定,可以取如表3所示的输入数据域。

  这种覆盖策略能覆盖全部的条件取值和判定分支,保证每一个语句都能至少执行一次,有很高的代码覆盖率。而当程序复杂度增加时,N的增长是线性的。文献[1]论述了求MC/DC最小测试用例集的方法。
划分完输入域后,根据工程经验和专家意见估计出各个子集在运行中被选用的概率pi;按此概率进行随机抽样,得到m组测试用例;运行程序,最后根据公式得到模块的可靠性。
  Thayer 给出了程序经过结构测试后用Nelson模型估计可靠性的经验公式。用ri表示程序第i条通路成功运行的概率ri=ai pi,其中ai是经验系数。
  如果属于Ei的测试用例数大于1,则ai的经验值是0.99。
  如果属于Ei的测试用例数为1,则ai的经验值是0.95。
如果没有属于Ei的测试用例,但由Ei决定的通路中所有的程序单元和由程序单元构成的顺序对在测试中已经全部被执行,则ai的经验值是0.9。
  如果没有属于Ei的测试用例,但由Ei决定的通路中所有的程序单元已全部执行,但是程序单元的顺序对只有一部分执行,则ai的经验值是0.8。
  如果在测试中有m个程序单元(1≤m≤4)没有执行,则ai的经验值为0.8~0.2m。
  如果有四个以上的程序单元在测试中没有执行,则ai的经验值为0。
5  结  论
  软件模块的成型往往处于软件开发的早期阶段。在这个阶段,整个系统尚未集成和整合,QA部门正在针对软件设计的最小单位——程序模块,进行正确性检验的单元测试。
  以测试数据为基础的预计模型因测试生命周期刚刚开始而无法使用。而覆盖测试一般应用在软件测试的早期,即单元测试阶段,用它来估计模块可靠性是适宜的。
  得到软件各模块的可靠性之后,便可通过程序软件逻辑流程来评估整个软件系统的可靠性。Soistman和Regsdalo在文献[3]中给出了一种硬/软件复合系统结构预计方法。该方法在获得各模块的可靠性数据后,通过识别运行剖面,分析任务功能,用马尔可夫过程表示程序逻辑流程在模块间的转移,最后计算出系统可靠性。
  估计模块可靠性的意义在于估计过程中所需的资料和数据都可在软件开发的早期获得。通过一定的预计方法,人们在软件开发的早期就可以对整个系统进行可靠性分析和预计。
参考文献
1   张义德,王国庆,汤幼宁.更改的判定条件覆盖测试技术研究.计算机工程与设计,2003;24(5)
2   黄锡滋.软件可靠性、安全性与质量保证.北京:电子工业出版社,2002
3   Soistman E C,Regsdalo K B.Impact of Hardware/Software  Faults On System Reliability.Government Report AD A165231.USA,1986
4   朱鸿.软件可靠性估计与计算复杂性的关系浅析.软件学报,1998;9(9)

此内容为AET网站原创,未经授权禁止转载。