基于程序不变量计算软件可靠性

  • 引用:周远, 丁佐华. 基于程序不变量计算软件可靠性[J]. 软件学报, 2015, 26(12): 3075-3087.

0 介绍

  • 软件可靠性的计算依赖于可靠性模型的选取以及所获得的软件失效数据
  • 失效数据的获取对可靠性及模型有非常大的影响[20],因此我们必须考虑是小数据的质量和收集失效数据的方案
  • 目前应用最广泛的针对各个开发阶段失效数据收集的方法是软件测试技术,软件测试包括 3 个要素:选择输入域、执行测试用例和比较输出[22].学者们提出了多种测试方法来获得软件失效数据[23],然而这些方法都是通过比较实际输出结果与期望输出结果得到诸如失效次数、失效用例等的失效数据,而忽略了软件的实时行为和内部结构,从而导致这些数据并不能真实反映软件的真实行为,如:
      1. 存在假性正确现象:即偶然正确,如软件的输出结果与期望输出结果一致,但软件的内部结构和行为并不正确
      1. 测试不能显示一个输入有多个错误的输出情况.
      1. 不同测试方法会影响到失效数据的获取比例,从而影响可靠性的计算.
      • Chen 等人[24]通过实验指出,不同的测试方法(随机测试、功能测试、分块测试)获得的失效数据会产生不同的可靠性.作者认为:这是因为这样获得的失效数据并没有真正反映程序的内部信息,仅反映了在所选测试用例下粗糙的程序的信息,所以计算出来的可靠性也是不准确的,无法反映软件真实的可靠性.
  • 因此,通过测试阶段的输入/输出所获取的失效数据并不充分,无法准确反映程序内部存在的问题,为此我们需要程序的内部数据来计算软件的可靠性,一个解决方案是:
    • 通过观察和分析测试过程中程序的执行轨迹从中提取程序的内部信息(例如内部结构、动态行为)。这里使用Daikon工具提取不变量,从这些不好的不变量中获得不好的不变量,利用这些不好的不变量计算可靠性
    • 在前人工作下,本文对使用不变量计算可靠性进行了可行性分析
  • 与现有的可靠性方法比较,两种方法差别很小,不依赖于对测试方法的选择,而进一步的方差说明:所提方法波动更小,更平稳,更接近系统的真实可靠性

4 失效数据的获取 及 可行性分析

  • 文章例子是改变程序中的数组,产生新的不变量,与原来的不变量进行比较,产生变化的不变量即失效数据
  • 失效数据获取例子:
    • 我们通过 3 种不同的方法来选取测试用例集 T1(随机选取)、T2(基于分块覆盖选取)、T3(基于分支覆盖选取).
    • 分别运行正确版本程序 C 与 T1、C 与 T2、C 与 T3 得到程序不变量 TI1,TI2 和 TI3
    • 运行错误版本程序 F 与 T1、F 与 T2、F 与 T3 得到程序不变量 FI1,FI2 和 FI3.
    • 比较 TI1 与 FI1、TI2 与 FI2 以及 TI3 与 FI3 的不同,分别得到各自的失效数据.
  • 可行性分析:
    • 每种方法所获得的失效数据百分比,可以发现不同方法获得的失效数据百分比基本相近,误差不大.
    • 可以得到结论不同测试方法得到不同的不变量;但是就失效数据的百分比来说,它们之间相差较小,比较稳定.

5 可靠性计算和结果分析

  • 可靠性计算:使用Nelson模型计算,不好的不变量作为失效数据,不同方法法算出的可靠性虽然不一样,但相差较小;使用方差刻画,基于不变量的可靠性计算结果方差较小
  • 综上所述
    • 在不同测试方法下,由不变量计算出的可靠性不是完全相等,还有一定的误差,其原因是有些不好的
    • 不变量之间还有一定的依赖性;

6 可行性分析

  • 用现有计算可靠性的方法计算7个程序的可靠性(Nelson模型),比较不便令计算出的可靠性和现有方法计算出的可靠性之间的差异

    • 二者在不同测试方法下差异不大
    • 可靠性方差都不是太大;但是相比较而言,现有方法的可靠性波动远大于不变量计算出的可靠性波动
      • 因为现有方法计算出的可靠性一定程度上依赖于测试方法,反映软件的局部行为计算出的可靠性是在该测试方法下的可靠性,所以在不同测试方法下,可靠性会有一定的波动;而不变量是整体的行为,,虽然不同的测试方法会产生不同的不变量,但这些不变量的合成效果却是一样的,都反映软件整体的行为,所以不变量计算出的可靠性是软件的整体可靠性,其波动产生的原因在于有些失效数据(不好的不变量)之间还有一定的相关性.
  • 综述所述:相对于现有的计算可靠性方法,我们还可以利用不变量来计算软件的可靠性;且利用不变量计算的可靠性更接近软件的实际可靠性

8 结论

  • 本文说明可以使用程序不变量计算软件的可靠性

      1. 在同一测试方法下,不变量计算出的可靠性和现有方法计算出的可靠性相差不大
      1. 在不同测试方法下,不变量计算出的可靠性波动较小,更接近软件的实际可靠性.
      1. 从不变量的角度来刻画软件可靠性,使我们对软件的整体行为和软件可靠性有更深刻的认识,有利于软件可靠性的评估和预测.
  • 未来工作:

      1. 针对不变量中的相关性:如果不好的不变量之间存在相关性,会增加失效数据,影响计算结果.我们应尽量去掉这种相关性,使得剩下的不变量尽可能独立.一种办法是建立数据流的依赖图
      1. 在实际应用中,我们并不知道正确的程序,这样我们就不能通过比较来获得不好的不变量,而必须通过一定的方法,根据已有的测试用例信息和已获得的不变量信息来确定不好的不变量,这将是我们接下来要解决的关键问题之一.