张 策 , 刘宏伟 , 白 睿 , 王瞰宇 , 王金勇 , 吕为工 , 孟凡超
1(哈尔滨工业大学(威海) 计算机科学与技术学院,山东 威海 264209)
2(哈尔滨工业大学 计算机科学与技术学院,黑龙江 哈尔滨 150001)
3(山西大学 软件学院,山西 太原 030006)
软件作为人工制品,是多类型软件开发人员协同完成的系统.由于软件是对物理系统和过程的计算机编程语言描述,因此其实际功能与预期成效很可能存在不一致之处.例如,软件自身隐藏的错误(error)在特定情况下可能会导致故障(fault),而故障可能会导致失效(failure):软件的缺陷(defect 可能是设计或编码时引入)在运行时会产生错误,当错误或故障积累到一定数量,或者达到某种条件时都会造成软件系统的失效.因此,软件的质量问题至关重要,尤其是可靠性问题,长久以来一直得到研究人员的关注.
可靠性作为软件的非功能质量属性,其可以通过软件可靠性增长测试这一重要途径来不断获得提高.软件测试过程中,基于故障不断被检测并修复进而使得软件可靠性持续获得增长的事实,为可靠性研究提供了有效的切入点.软件可靠性增长模型SRGM(software reliability growth model)[1,2]从软件失效的角度进行可靠性的建模,采用以微分方程(组)为主的数学手段建立软件测试过程中的若干个随机参量(例如测试时间、累积检测的失效或修复故障个数、测试工作量TE(testing-effort)等参量)之间的定量函数模型.基于求解获得的累积检测故障数量函数表达式(通常以m(t)作为标记),可以获得测试阶段的可靠性.因此,建立能够准确地描述真实随机测试过程的累积检测故障数量函数m(t)成为了SRGM 研究的关键.目前,SRGM 已成为度量、预测与管控成本支出下可靠性的重要技术[3,4],是管控可靠性与系统发布的常见工具.文献[5]即阐述了一种基于当前软件调试工作流的特征进行可靠性增长分析的方法DWA-SRGM,其可指出影响产品评估的因素与瓶颈,从而支持流程改进决策.
而在整个可靠性的研究中,故障检测率FDR(fault detection rate)作为累积检测故障数量的主要影响因素,是建立可靠性增长模型的关键要素,因此,其是提高可靠性所需考察的重要问题.经过多年发展,FDR 以及其支持的可靠性研究取得了重要进展.目前,国内外尚没有对FDR 进行全面述评的综合性分析文章.本文在作者前期大量工作[1,2,6,7]的基础上,基于国内外研究情况进行悉心梳理,从问题起源与功用、相关区别与联系、综合分类讨论、不完美排错下模型性能差异性分析等视角对FDR 进行了全面述评,并进行了大量的实验验证,进而给出后续研究趋势和需要解决的问题,以期为研究人员提供有价值的参考与借鉴,促进可靠性研究取得新进展.
本文的贡献着重体现在对如下4 个问题进行了深入回答.
(1) 对FDR 进行了全面深入的研究性论述,对FDR 在可靠性研究中的功能、地位、作用和成效进行了深刻阐述,这在当前可靠性研究中尚属首次;
(2) 厘清了FDR 与失效强度、风险率/冒险率的区别与联系,从数学角度提出并证明了FDR 与测试覆盖函数关系的重要定理;
(3) 拓展了FDR 的研究内涵,提出了典型的不完美排错环境下FDR 相关的软件可靠性框架模型;
(4) 通过在大量的真实应用场景上的综合实验,深入分析了FDR 效用以及对可靠性模型的影响,为研究和选择FDR 提供了有重要借鉴意义的参考.
本文第1 节对以SRGM 为核心的可靠性进行概要介绍,引出故障检测率FDR.第2 节从可靠性模型构建视角给出FDR 的定义,从多个角度阐释其功用.第3 节重点剖析FDR 与失效强度、风险率/冒险率的区别与联系.第4 节给出分类视角下的FDR 构成.第5 节重点对FDR 性能及其对SRGM 的影响进行分析,提出不完美排错框架模型,通过数值分析研究模型的差异性.最后指出后续研究的趋势与需要解决的问题,并给出结论.
软件开发过程中具有大量复杂的随机性与不确定性,随着研究人员对测试过程的不断深入认识,SRGM 的研究持续至今.SRGM 具备描述测试过程中失效发生、故障检测和修复等动态特征,其刻画了软件的一种故障行为.由于SRGM 建立了故障失效个数与可靠性间的数学关联模型,因此,利用SRGM 就可以计算特定时刻与可靠性紧密相关的参数指标,包括失效个数、失效率、失效间隔以及可靠性等;进而,可以对测试资源进行动态的调配,预测当前测试环境下软件达到预期目标(例如可靠性)时所需要的时间(被称为发布时间)、成本(被称为发布成本)等重要信息.
在研究内容上,从突破早期完美排错的限制,到仅考虑到新故障引入的研究,以及考虑测试工作量或测试覆盖率的NHPP 类软件可靠性建模框架的研究,再到涵盖不完全排错与新故障引入等各类不完美排错的研究,进一步拓展至变动点问题、测试资源分配问题、最优发布问题等,越来越多的可靠性模型得以建立.在求解方法与技术上,从建立单一微分方程(组)的简单或复杂的解析式方法,扩展到非解析式方法、排队论技术和最优化方法,进而采用离散事件仿真与非参量求解方法等,这些正在推动软件可靠性研究不断走向深入.图1 对SRGM 的建模与功用进行了展示.
若SRGM 将软件测试过程视为若干个随机过程的统一,失效发生后,测试工作量TE 被定量地消耗用以进行故障的检测、隔离、排除等.随着测试的不断进行,软件中的故障不断减少,从而软件可靠性得到不断的增长.软件可靠性能够通过软件可靠性增长模型SRGM 进行有效度量与预测.目前,SRGM 得到了快速的发展,现已被广泛应用,成为定量评估软件可靠性的数学工具.图2 对SRGM 的建模流程进行了归纳.
在代表NHPP(non-homogeneous Poisson process,即非齐次泊松过程)类SRGM 研究起源的经典G-O 模型[8]中,Goel L 与Okumoto K 建立了类似于下面的微分方程:
该微分方程具有更一般性,其假设认为,t时刻累积检测的故障数量dm(t)/dt与此刻软件中剩余的故障数量(a(t)-m(t))成正比例,比例系数b(t)为该时刻的故障检测率FDR(fault detection rate).显然,当b(t)=b,a(t)=a时,公式(1)转化为G-O 模型,该模型虽忽视了故障修复与新故障引入情况,但却成为日后研究连续性NHPP 类SRGM 中共同被遵守的事实.这其中,FDR 的表现形式是b(t),从宏观上对故障检测能力进行描述,但并未指出支撑故障检测能力的构成.并且,G-O 模型认为FDR 为常量(在软件测试的过程中保持不变),这显然与真实的测试过程差异较大.此外:文献[9]建立了一个非齐次泊松过程类软件可靠性增长模型——Bbell-SRGM;文献[10,11]提出了结合软件运行环境中每单位时间故障检测率的不确定性的软件可靠性模型;文献[12]提出了具有时间相关性噪音影响下的NHPP 类SRGM;文献[13]提出了一种基于Weibull 分布引进故障的SRGM,使软件可靠性增长模型更加符合实际的软件故障检测过程,具有重要的理论意义和实际价值;同时,文献[14]利用基于深度循环神经网络(RNN)编码器-解码器的深度学习模型来预测软件中的故障数量并评估软件的可靠性;文献[15]推导了一种可以在软件开发和运行的各个阶段提供良好的软件可靠性预测的模型,提供了更好的预测性能;文献[10,11,16]还提出了用于比较SRGM 拟合优良性的诸多标准,例如均方误差MSE、预测率风险PRR、预测能力PP 以及赤池信息量准则AIC,为SRGM 拟合度评估提供了有效方法.
特别指出,本文研究遵从SRGM 研究领域中的默认规定.
(1) “error(错误)”[17],“defect(缺陷)”[18],“fault(故障)”[19,20]以及“failure(失效)”[21]并没有被严格区分,表示的含义是等价的,这与容错研究中对“defect→error→fault→failure”进行严格区分是不同的.这是因为SRGM 研究中隐含着由缺陷、错误到失效的一一对应关系,因而将其等同看待;
(2) 这里并不区分修正、改正、修复、排除,四者均表示故障被排除掉.
在当前所建立的众多SRGM 中,均包含“在t时刻这一当前时间点上,累积检测到的故障数量m(t)与当前软件中剩余的故障数量成正比例”这一基本假设,此比例系数被称为故障检测率FDR(fault detection rate,习惯用b(t)来表示).因此,软件中全部初始故障数量a(t=0)=a和故障检测率函数FDRF(fault detection rate function,通常用b(t)加以表示)是影响SRGM 的重要因素[20],这已成为SRGM 研究中的共识.图3 展示了经典的完美排错G-O模型的建模过程,其中的FDRF 为常量b.
在可查证的SRGM 研究文献[17-20,22-29]中,FDR 是SRGM 建模中必不可少的参数,其描述了故障被检测出来的能力,同时也是对测试效能的一种描述.
定义(故障检测率FDR).即故障检测率函数,表示当前时刻单位时间内单个故障被检测到的平均概率[9],或每个故障的查出率[30],通常用b(t)来表示.
FDR 表征了测试环境下故障被查出的效率,具有描述综合测试策略的能力,因而与包括测试人员、测试技术、测试工具等构成的整体测试环境紧密相关.
从早期提出将FDR 看作常数的软件可靠性增长模型,到提出整体呈现递减趋势的幂函数类型FDR,再到能够基本刻画测试环境平缓变化的S型FDR,以及(复杂)指数类型FDR 的研究,整体上,对FDR 的研究方向呈现出贴近工程实际化特点,因而能够更好地描述测试环境的改变,帮助提高可靠性模型的性能.
测试过程的目的是不断发现与修复故障,提高可靠性,达到预期(发布)要求.客观上,测试环境的不同,以及测试人员实施测试策略的差异,将使得不同系统工程在测试中表现出不同的外在特征.从建立数学模型的角度来看,公式(1)描述了测试过程中关于故障检测的共性,但不同模型的区别与FDR:b(t)关联紧密.可见,FDR 能够从整体上刻画测试效果,这使其成为影响SRGM 性能的主要评测点.
关于对FDR 影响因素的研究,Huang 在他的一系列文献[31,32]中指出:测试初始阶段,很多故障可以被检测出来,测试FDR 依赖于故障发现效率、故障密度、测试工作量、检出率这些参数;中期阶段,FDR 通常还依赖于上述因素以外的其他因素,包括CPU 指令的执行率、失效与故障间关联、代码膨胀系数、测试团队技能、程序规模、软件可测试性,以及每日历天预定的CPU 执行小时等因素.因此,当需求发生改变和新的特征被添加,或者修复期间有新故障引入时,FDR 可能会发生改变.此外,考虑到故障检测的随机性和复杂性,即针对其是具有较强不确定性的概率事件这一方面,文献[9]提出了一个响铃形的故障检测率函数,文献[33]考虑了受操作环境影响的系统故障检测率,文献[34]提出了一种随时间不规则变化的故障检测率,均体现了其突变性.
2.2.1 从FDR 角度研究CP
在关于移动点/拐点CP(change-point)的研究上,也均将FDR 作为分段研究实施的对象.由于FDR 刻画了整个测试环境下的综合测试效果,因而当测试环境发生变化与转折时,FDR 就会有所变动.这样,将FDR 进行数学上的CP 处理[35-38](即CP 前后FDR 函数形式发生变化)成为考虑CP 的SRGM 研究惯例.
由于FDR 与测试环境下的失效分布情况等多因素有关联,而失效分布又会受到例如运行环境、测试策略和资源分配等[32]多种因素的影响.因此,当测试策略和测试资源分配发生变化时,CP 就会出现.此外,增加对程序的认识和自动化测试工具的运用也会引发CP.因此,FDR 在整个测试过程中会发生改变.
2.2.2 从FDR 角度研究测试环境与运行环境差异
此外,在考虑测试与运行环境的差异研究上[27,39],差异点也是从FDR 角度来进行研究的,相关的研究还涉及故障减少因子[20,40-43]、学习效果[17]、测试压缩因子[44]、测试覆盖率[45,46]等.事实上,CP 具有描述测试环境与运行环境差异性的能力.
FDR 的构成上,存在着b(t)=b,b(t)=b2t/(1+bt)[26,47],[49]等多种函数形式,基本情况见表1.
Table 1 Fault detection rate function b(t)表1 故障检测率函数b(t)
图4 给出了表1 中5 类b(t)的基本形状,其中设定b=0.35,α=0.25,β=0.15,t∈[0,20],仅用以展示曲线形状.
FDR 是与时间相关的故障检测率函数,用以表示单位时间内故障被发现的概率.为了深入研究,b(t)有时被研究人员设定为t的某种函数.
失效强度通常用λ(t)表示,即在t时刻单位时间内失效发生的次数,在SRGM 的研究中用以表示累积故障检测数量的导数,即λ(t)=.可见,λ(t)是跳跃强度函数,即,在时刻t单位时间内失效发生的次数.如果故障出现导致失效发生而立即被发现的话,b(t)=z(t);否则二者并不相等.
风险率即风险函数(hazard function),通常用h(t)表示,即:程序正确地运行到时刻t时,发生故障的概率.h(t)是每个故障失效发生率或冒险率[50],即“瞬时失效率”.事实上,h(t)作为“瞬时失效率”是一种冒险率.失效率的定义是
对上式求Δt的极限,求得的就是冒险率,即“瞬时失效率”.可见,冒险率或“瞬时失效率”是失效率的一种时间上的逼近.
“设T表示从0 开始运行一个程序,到程序发生失效为止经历的时间”,T是失效时间的独立随机变量,其失效分布函数和失效密度函数分别为F(t)和f(t),则可得如下两式:
则可以得到R(t+Δt)的表达式、R(t)的导数与h(t)和R(t)的关系如下:
因此,求解上式可得.显然,R(0)=1;R(∞)=0.
综上,我们可以得出:故障检测率FDR、失效强度以及风险率/冒险率均为可靠性相关指标,三者均与程序运行环境中的多因素(例如程序规模、故障密度、故障测试效率、测试工作量、CPU 指令的执行率、代码膨胀系数等)相关联.故障检测率b(t)与失效强度λ(t)和风险率/冒险率h(t)均成正比例关系.具体讨论如下。
(1) 故障检测率b(t)描述了测试人员在测试策略的指导下采用合适的测试案例和测试方法检测出故障的能力,其与t时刻点上的测试覆盖率c′(t)成正比例,是测试覆盖c(t)的函数,可表示为b(t)=c′(t)/(1-c(t)),与可靠性R(t)直接相关;
(2) 失效强度可用于描述t时刻累积检测的故障数量m′(t),其与此刻软件中剩余的故障数量(a(t)-m(t))成正比例,比例系数b(t)为该时刻的故障检测率FDR.则根据G-O 模型的基本假设,可得失效强度λ(t)与故障检测率b(t)的关系如下式:
(3) 风险率/冒险率描述了程序正确地运行到时刻t时发生故障的概率,其侧重于每个故障失效发生率或冒险率[37],即“瞬时失效率”,为失效率的一种时间上的逼近.在SRGM 研究中,根据上述公式(7)的表示以及假设条件可知:风险函数h(t)与失效强度λ(t)相等,即h(t)=λ(t).从而根据G-O 模型的基本假设,可进一步得到风险函数h(t)与故障检测率b(t)的关系如下式:
同时,文献[51]认为测试覆盖下的故障以常量概率k被检测出来,从而可推导出:
则h(t)为:
此时,即可得到风险函数或每个故障的失效发生率h(t)与故障检测率b(t)相等,即b(t)=h(t).
软件测试过程中,随着测试用例的不断执行,测试覆盖的范围不断扩大,故障被检测出的可能性不断提高.测试覆盖范围的扩大,使得被检测出的故障数量增多,因此,测试覆盖函数与故障检测率关系密切.测试覆盖TC(testing coverage)指测试系统覆盖被测试系统的程度,描述了测试与被测试对象之间的相关性[52],测试覆盖率较高的程序在测试过程中执行了更多的源代码.这里,从代码语句覆盖的角度来看,可以定量表示为公式(11)所示:
其中,Sc是测试案例覆盖的KLOC(kiloline of code),St是全部KLOCs.
当考虑时间因素时,TC就演变为随测试时间变化的测试覆盖函数TCF(testing coverage function):c(t),可用以描述测试覆盖率的变动情况.显然,c(t)是一个非负的且非降的函数.
4.1.1 测试覆盖函数起源——采用设定FDR 与测试覆盖率成比例的间接视角
针对上述公式(11)的来源,文献[51]最早给出了严谨的分析,其认为测试覆盖下的故障以常量概率k被检测出来,从而建立了下面的微分等式:
其中:a0表示初始时软件中的故障总数;cd(t)表示t时刻测试覆盖下故障被检测出的概率,按照假设,得到cd(t)=k常量.这样,令a0k=a,则得到m(t)=ac(t),进而基于的事实,可推导出:
则冒险函数(the hazard function)或每个故障的失效发生率(the failure occurrence rate per fault)h(t)为
这样,在通常情况下可认为b(t)=h(t).通过上述得到的m(t)=ac(t),可以看出,这里就直接建立了m(t)与c(t)的关联.为此,将现有各种m(t)函数表达式改写成m(t)=ac(t)形式,即可获得相应的c(t)函数.
显然,对于完美的测试覆盖,c(t)是t的增函数,且满足c(0)=0,c(∞)=1.
4.1.2 测试覆盖函数起源——采用与SRGM 和TEF 建模相同的直接视角
c(t)的建立是基于下面的假设:任意t时刻的测试覆盖率与当前剩余的测试覆盖值成比例.这样,可以得到下面的微分方程:
其中,α是可获得的测试覆盖目标值,考虑到测试后期软件中未覆盖代码的难以测试性,其满足0<α<1;β(t)为比例系数,也被称为测试覆盖成熟率,满足β(t)>0.β(t)与测试人员的技能紧密相关,因而假定测试案例设计人员的测试技能随着测试覆盖率的增长而增加.这样,β(t)被定义为
其中,r=bini/bsta,bini和bsta分别是初始和稳态时测试案例设计人员的测试技能因子.公式(16)式的初始条件为c(t)=0,这样可求得:
其中,β=(1-r)/r.这样,当r=1 时,c(t)呈现指数增长趋势;当r=0 时,c(t)呈现S型增长趋势;其他情况下,c(t)受制于多种因素,变化趋势较为复杂.可以看出,这种建模方法和获得测试覆盖函数的思路与对SRGM 和TEF 的建模是完全一致的.在我们前期的研究[1,7]中已分别对SRGM 和TEF[6]的建模进行了综合研究,这里不再赘述.相应地,另一种融入测试覆盖的NHPP 可靠性增长模型被建立如下:
其中,b是每个故障与每个可获得测试覆盖下的故障检测率,在m(0)=0 的初始条件下,可求得:
易见:当c(t)=1 时,模型演变为经典的G-O 模型.这也意味着,G-O 模型假定测试覆盖满足100%.
4.1.3 基于测试覆盖函数的SRGM 建模
c(t)表示截止至t时刻,已被测试的代码或案例所占的百分比(原表述不清晰);1-c(t)表示到t时刻,尚未被测试的代码所占的比例.显然,c(t)的导数c′(t)表示t时刻时的测试覆盖率.易知,FDR 与c′(t)成正比例,且与1-c(t)成反比例.这样,文献[11,40]认为c′(t)/(1-c(t))可被用来度量t时刻的故障检测率b(t):
因为基于c(t)的SRGM 研究通常以下面的公共假设[19,53,54]为基础,从而依据这些假设可建立公式(21)所示的微分方程,其可用以描述测试过程中故障检测与测试覆盖的基本关系:
相比于基于故障检测率进行SRGM 研究的事实,易知很多研究中对b(t)的函数形式进行直接设定会引发更多的随机性.上式b(t)从测试覆盖函数TCF:c(t)进行定义,由于测试覆盖可借助测试用例执行经过的结构或数据流单元[55]来度量,这使得FDR 的函数形式依赖于从测试覆盖角度进行确定的结果,如公式(22)所示:
4.1.4 测试覆盖函数与故障检测率函数和可靠性的关联
在提出Logistic TEF[56,57]用以描述TE 消耗的基础上,有先增后减变化趋势的S型函数又被用以刻画测试覆盖率函数[58-60],并与SRGM 结合来度量可靠性.由于TC表征了被测试代码的比例,易知该比例的升高会使得更多的故障被检测出来,进而随着故障的修复,可靠性将得到提高.可见,c(t)与t时刻的可靠性R(t)具有一定的定量关系,而探讨二者之间的关联在可靠性研究中[53-55,61-63]已持续十余年.可以看出:故障检测率b(t)直接描述了测试环境下故障被检测出的一种概率,其是测试人员在测试策略的指导下,采用合适的测试案例或测试方法对故障进行检测的能力描述;测试覆盖c(t)注重于测试过程中测试代码对被测试软件/源代码的覆盖程度.
这样,易知故障检测率是测试覆盖的函数,即b(t)=f(c(t)),例如b(t)=c′(t)/(1-c(t)).表2 即给出了典型的测试覆盖函数与故障检测率函数,并对二者的关联进行了初步分析.
Table 2 Typical test coverage function and fault detection rate function表2 典型的测试覆盖函数与故障检测率函数
显然,随着测试的进行,c(t)不断增长,但由于b(t)与c(t)之间关系较为复杂,b(t)的变化形式难以直接预测.从定量关系上来看,b(t)与c(t)都在[0,1]之间,这里以为例,提出如下定理.
定理.当β与α的大小关系确定时,b(t)与c(t)存在明确的大小关系.
证明:b(t)=c′(t)/(1-c(t)),c(t)=c(t)(1-c(t))/(1-c(t)),令z(t)=b(t)-c(t)=[c′(t)-c(t)-c2(t)]/(1-c(t)).对c(t)求导数可得:
令z(t)=0,e-bt=x,因上式分母恒大于0,且α≠0,上式可转化为
化简得:Δ=(b2+1)(1+β)2+2b(1+β)(1-β+2α),
因为0<β<1,所以Δ>0,所以上式有两个根.根据一元二次方程求根公式得:
易见,两个根的分子恒小于0.下面对β与α的关系进行讨论.
· 当β>α时,x1<x2<0,函数图像开口向上,此时图像的大致曲线如图5 所示.此时可得:
· 当β<α时,0<x1<x2,函数图像开口向下,此时图像的大致曲线如图6 所示.此时可得:
同理,当c(t)为其他形式时可作同样的分析处理,进而得到有价值的结果.
由于FDR 构成的不同,b(t)存在着多种函数形式.早期研究中认为FDR 为常量,设定b(t)=b,显然无法描述b(t)随测试环境的变化情况.随着研究的深入,FDR 已呈现出多种函数形式,例如b(t)=b2t/(1+bt),b(t)=bαβe-βt,b(t)=等.这些FDR 可分为两类.
①常量类型:b(t)=b,认为FDR 在整个测试过程中并不发生改变,这虽能带来求解上的简易,但显然偏离实际测试情形;
另一方面,鉴于FDR 是对测试环境的直接描述,测试环境的改变可借助FDR 进行研究呈现.因而,当前对考虑变动点CP(change-point)的SRGM 研究中,多从建立FDR 分段函数的形式来实施.文献[64]即基于各种FDR,将其引入到SRGM 建模中进行研究.
Li QY 在她的文献[65]中指出,考虑TE 的可靠性建模可以进一步改善SRGM 的拟合和预测效果.测试过程中,随着故障检测与修复等环节中TE 的不断消耗,软件可靠性不断得到提高.在我们前期研究[6,7]的基础上对TEF 进行了梳理,并给出了考虑TEF 的SRGM 研究.例如,在如下的假设下:“[0,t]内累计检测到的故障数量与当前剩余的故障数量下所花费的测试工作量TE 时的故障检测率b(t)成比例”,可以得到典型的考虑TE 的SRGM建模方法[31,32,36,64,66-73]:
其中,b(t)为故障检测率函数,m(t)表示[0,t]内累计检测到的故障数量,a表示软件中的总故障个数.在本质上,公式(24)的故障检测率函数为b(t)⋅w(t).实际上,FDR 表示“单位TE 花费下平均检测出的故障”[64].这样,b(t)⋅w(t)实际上是一个复合函数,其包含了测试工作量的因素.
在前述分析的基础上,我们可以将多种描述故障检测能力的函数称为故障检测因子k(t),k(t)存在如下5 种情况.
(1)k(t)=b(t)=b——常量;
(2)k(t)=b(t)——此时b(t)存在多种函数形式,如前所述;
(4)k(t)=b(t)⋅ω(t)——从测试工作量与故障检测率的复合角度,也即在当前测试资源消耗的情况下,提出了故障被检测出来的能力;
(5)k(t)=b⋅c′(t)——从测试覆盖与每个故障可获得测试覆盖下的故障检测率角度.
综上,针对故障检测的描述,公式(23)建立了统一的故障检测模型——t时刻检测的故障与当前软件中剩余的故障数量成比例;同时,该模型也指出了t时刻累积修复的故障数量函数形式,即c(t)=p(t)⋅m(t).
c(t)描述了测试用例的执行情况,侧重于测试覆盖代码的程度;w(t)描述了测试资源的消耗情况,侧重于测试成本的花销;b(t)描述了测试策略的效果,侧重于测试人员的技能、工具与技术.此三者从不同角度对测试环境效果进行了建模描述,在当前软件可靠性建模中,用以描述故障被检测出来的能力.
无论是故障检测率FDR:b(t),还是故障检测因子k(t),都是对测试过程中故障被检测出的程度或效果的描述,刻画了在测试环境下,消耗测试资源以执行测试策略来对故障进行检测的能力.因此,其与测试环境下的多因素(失效分布情况、故障密度、程序大小、测试人员技能、测试案例与工具等)有关联.
迄今为止,国内外尚未对FDR 影响下的可靠性模型进行研究,也缺少对FDR 自身性能的分析.本节将通过在大量真实失效数据集上进行实验验证,来分析这两个方面.
在当前可查证到的SRGM 研究中,所有模型的建立均是基于下面的假设,即“t时刻累积检测的故障数量与当前软件中剩余的故障数量成比例”,这个比例即是故障检测因子.为此,我们提出统一的故障检测过程建模:
这里认为t时刻检测的故障数量与当前剩余的故障总数成比例,比例系数是故障检测因子k(t)(实际上,这里的k(t)已经超过了SRGM 研究中单纯的故障检测率b(t),其表示当前测试环境下测试人员在消耗测试资源,执行测试案例进行测试时故障被检测出来的概率(函数),是涵盖多个测试因素的综合性指标.但从保持延续性以及便于实验等因素考虑,这里依旧命名为b(t),后面不再专门用k(t)进行表示).p(t)表示故障修复概率,表示t时刻被检测出的故障被修复的比率.
在m(0)=0 和a(0)=a的初始条件下,求解可得到:
显然,公式(26)中b(t),p(t)和a(t)的多种设置,可以得到多种m(t).因此,这里提出的是一种框架式模型,具有较强的柔韧性.
文献[17,19,27,28]中提出了较为常用的FDR,以公式(26)为基础,通过设定不同形式的b(t),可以得到在相应测试环境下的可靠性模型(即累积故障检测数量),具体求解情况如下.
此时,随着测试的持续进行,b(t→∞)→b.
(2) 若b(t)=b2t/(1+bt),则可以求得m(t)如下:
(3) 若b(t)=bαβe-βt,则可求得m(t)如下:
此时,随着测试的持续进行,b(t→∞)=0.
此时,随着测试的持续进行,b(t→∞)=0.
此时,随着测试的持续进行,b(t→∞)→b(1+σ).
虽然已有众多SRGMs 被提出,但多以指数型和S型模型[47,74]为主.同时,为了观测不同FDR 的差异,表3 列出了用于参与比较的可靠性模型和本文衍生的模型(不失一般性,这里所提出的框架模型中设定p(t)=p,a(t)=a)及FDR.
Table 3 Reliability models and FDRs involved in comparison表3 参与比较的可靠性模型及FDR
这11 个模型可以分为6 组,其中,前5 组均是在同一FDR 下采用不同的建模假设所得到的模型,可以用于比较不同模型对FDR 的影响,最后一组仅包含复杂弯曲S型函数M-10;同时,M-1,M-2,M-4,M-8,M-10 是统一建模框架下不同FDR 衍生出的模型,可以观测不同FDR 对模型的影响.
为了验证与比较模型的性能,我们遴选了12 个失效数据集DS1~DS12[18,19,24,48,76-83]开展实验工作.这些失效数据集由失效检测时间ti(通常是以周为单位)和累积检测的失效故障数量yi构成,其均来自国际上著名的计算机公司公开发布的计算机(软件)系统在测试过程中搜集的真实数据,描述了不同的测试场景,从而作为可靠性模型验证的载体,得到了广泛的认可与应用.表4 列出了来自于真实应用场景下的12 个失效数据集,对其构成与来源等进行介绍.
Table 4 Failure data set in real application scenario表4 真实应用场景下的失效数据集
5.3.1 拟合性能分析
为了获得更为广泛的实验结果以得到有价值的分析,这里在12 个公开发表的失效数据集上进行实验验证(更多实验结果可联系作者).基于模型在12 个数据集上的拟合结果,我们绘制了参与比较的模型与真实的失效数据数值之间的拟合曲线,如图7 所示.
为更加清晰地观测不同FDR 对模型带来的影响,在图7 的基础上,我们特将不同FDR 融入统一框架模型而衍生出的M-1,M-2,M-4,M-6,M-8,M-10 绘制在一处,用以比较框架模型内不同子模型之间的差异,如图8 所示.
从图7 以及图8 展示的大量实验所呈现的系列曲线结果可以看出:
(1) 整体上,除了部分模型出现严重偏差以外(例如M-6 在DS1上,M-8 在DS2上,M-7 在DS4上,M-6 在DS8上等),大部分模型与真实的失效数据集的增长形状保持一致,这说明软件测试过程从累计故障检测的角度具有凹或凸指数型增长趋势,这也证明采用NHPP 指数类失效时间模型研究软件可靠性增长具有现实合理性.
可以发现:弯曲S型FDR 函数(包括复杂弯曲S型函数)对数据集的适应性最好,这通过M-4,M-5 和M-10在众多失效数据集上的性能得到验证,这也与我们前期研究[1,7]的结果保持一致,这是因为呈现S型的FDR 函数能够适应不同测试阶段测试环境的变化,具有较强的柔韧性;M-6 和M-7 所包含的先增后减型FDR 也展现出了较好的性能,但并不具备S型FDR 的强劲适应性;递减型与常数型FDR 参与的模型性能表现一般,这主要是由于真实测试环境的变化并非稳定或连续变化.这些不同的实验现象可以解释为故障检测过程取决于特定测试策略下的测试技术、人员技能等实际因素,这使得FDR 既不是常量,也不是持续递减,而是具有S型等变化规律,特别是对于大型复杂软件的长期测试过程来说更加满足这一变化规律.
综上,从具有相同FDR 的不同模型曲线进行分析可以看出,本文所提出的模型优于其他同组模型.
(2) 虽然S型FDR 性能较好,但将其融入某些建模假设较为合理的模型中,这些模型在有些失效数据集上不一定会表现出良好的性能.由软件自身的特点与测试过程的特点所决定,不同公司发布的失效数据集差异性较大,这使得很难存在某个模型在所有失效数据集上均表现出良好性能.例如,M-5 在DS2上的性能并不理想,这与Sharma 等人[22]提出的模型具有局限性相一致.
(3) 另外,不完美排错模型考虑到了更多的实际情况(正如文献[84]所述,不完美排错模型将故障排除效率以及软件故障总数均看作随时间变化的函数,更具有实际应用意义),因此其整体性能好于完美排错模型.因为真实的测试与故障检测和排错过程是被多种因素影响的复杂随机过程,具有不完美特性,因此,考虑到实际不完美情况的模型能够给建模带来更多的精准性.
5.3.2 预测性能分析
为了观测模型的预测性能,我们绘制了参与比较模型的预测RE曲线,如图9 所示.RE曲线越趋近于0,表明预测性能越好,位于0 以上是正向预测,位于0 以下是负向预测.
基于数据集的预测可以看作是模型对未来测试性能的描述能力,也反映出模型在后续时刻累积检测出故障的能力.从图9 所展示的曲线走势以及相应的数据分析可以看出:
(1) 整体上,除了个别模型在部分数据集上出现预测偏差以外(例如,M-10 模型在DS5上和M-7 模型在DS8上发生预测失真现象),大部分模型的预测曲线随着测试的进行都逐渐趋向于0,表明效果较为理想;
(2) 模型本身的建模合理性对预测效果存在着较大影响,但预测依然会受到模型参数个数、数据集本身的数量大小等因素的影响,例如在测试前半程,预测曲线的剧烈起伏变化,表明模型正在进行对数据的拟合适应;
(3) 具有(弯曲)S型FDR 函数的模型能够较快地趋于0 水平线,表明其预测能力较好,这包括M-4,M-5.同时,结合上述针对于图7、图8 的讨论可得,具有优秀适应能力的S型FDR 能够帮助模型呈现更为强大的拟合与预测能力;
(4) M-10 在DS5上的预测性能并不理想,这与其在DS5上的拟合曲线所显示的拟合性能不理想相一致.从而可以得出,任何一个模型不能在所有的数据集上表现良好(包括拟合性能和预测性能),这种现象是数据集本身或模型参数数量过多等因素造成的;
(5) 呈现S型变化趋势的b(t)=,在多个数据集的多个模型上保持良好的性能,表明实际测试环境存在移动点/拐点CP,而并非平滑进行,因此,包含CP 的模型能够具有更好的性能.
基于前述11 个模型在12 个真实失效数据集上的大量实验结果分析,特作如下讨论.
(1) 整体上,可靠性模型不能适应于所有的数据集,且根据实验结果可观察出,其拟合度量与预测具有相对的一致性.这两点与FDR 的关联并不大,从本文大量的实验结果中没有得到明显关联支撑:①可靠性模型的有效性具有较大的局限性,模型在一部分数据集上表现优秀的同时,在另外一些数据集上效果一般甚至较差,适用性受到较大限制;② 此外,模型的拟合性能与预测性能具有基本统一性;
(2) FDR 对模型的影响,特别是同一框架中不同的FDR 对性能的影响存在较大差异:①框架模型具有较强的柔韧性,如本文提出的一样,不同的FDR 使得框架模型衍生为具体的模型,这为区分FDR 的性能差异带来可能;② 同一FDR 在不同可靠性模型中的性能通过模型的整体性能来反映,由于不同模型是研究人员基于不同的假设建模得到,因而难以进行有效衡量;
(3) FDR 建模具有客观性与主观性两个方面:由于FDR 与整体测试过程紧密相关,而测试过程是测试人员按照测试策略进行测试工作不断发现软件故障的过程,是多个随机因素叠加在一起的随机过程,具有很强的随机性.因此,测试过程的随机性会直接为FDR 的建模带来困难:①对于具有较强测试规划,呈现一定规律的测试过程,FDR 往往具有明显的变化规律,这为FDR 建模提供依据;② 测试过程的复杂性解释了本文给出的当前研究中存在多种类型FDR 形式的主要原因,具有符合多种实际的真实性;
(4) 包含更多测试信息的发布将为FDR 的建模与研究带来直接帮助,也为深入研究可靠性的增长与变动提供有效支持.
特别指出:FDR 受到多种因素影响,具有典型的随机性,例如不同测试策略、测试工具与方法等都会对其带来扰动影响.因此,现有研究中提出了多种不同形式的FDR,且相互之间的差异性较大,但在特定的测试环境下还是具有合理性的.在实际测试过程中,由于测试都是在预定或已知的条件下主动实施的,此时完全可以根据测试整体安排来选择和确定FDR.
6.1.1 描述软件测试过程长期变化规律的FDR 函数
FDR 是SRGM 中最为重要的参变量,其描述了单位时间内被检测到的故障数量的变化情况,因而其在本质上刻画了整个测试过程中测试效率的演变,对于可靠性模型的演变尤其是增长至关重要.
从本文前述介绍中可以看出:FDR 实际上涉及到SRGM 中的故障检测率函数b(t),当考虑测试工作量时,就需要将w(t)包含进来;当从测试覆盖的视角分析时,就需要将c(t)融入进来.可以看出:FDR 是对整体测试环境的综合建模,其数学模型不仅反映了故障检测的效率和能力,也描述了当前测试环境下各种随机因素的扰动情况.因此,能否提出能够涵盖真实随机因素的FDR(整体函数或分段函数),是当前研究面临的一个重要挑战.
6.1.2 发布多模式测试环境下的更多构成要素的失效数据集
包括FDR 与可靠性在内的各类模型,本质上均需要依靠真实的失效数据集进行验证.现有的失效数据集对FDR 验证的支持严重不足,这成为制约FDR 发展的首要障碍.因此,为FDR 建模提供更多有效信息,为可靠性研究特别是建模、度量、预测、发布、调整等带来重大变革,呼吁公司直接发布FDR,这也是当前研究中所面临的一个挑战.
6.2.1 对考虑FDR 参与的可靠性模型进行综合评价
软件开发自需求分析起始至发布的全过程,包含了多个测试阶段.按照文献[23]中给出的软件开发流程,从图10 可以看出,为了提高可靠性,4 个测试阶段相互衔接直至进入到发布后的运行阶段.
不同测试阶段的目的、策略、技术、方法等差异,使得每个阶段的FDR 发生变化,这种变化有时较为剧烈,对测试性能与效率影响较大.FDR 自身的不稳定性对可靠性模型评价带来重要影响,因此要把FDR 的变化融入到可靠性模型的综合评价分析中,从而为可靠性模型评测带来关键参数上的影响,提高精确度.
6.2.2 FDR 选择成为一个挑战
FDR 支持可靠性研究伴随着其众多模型的提出而发展,特别是在以SRGM 为核心的可靠性研究上成为关键因素.
易知,提出能够适应多种测试环境变化的FDR 是建立性能优异的SRGM 的重要方面.相比之下,现有的FDS中却没有公布FDR 的变化趋势,这使得目前SRGM 的研究中,尚不能根据FDS 来直接验证所建立的b(t),只能间接通过m(t)的性能来体现.
6.2.3 要为最优发布提供有效支持
软件发布受制于软件开发技术、人员、成本等多种因素,通常,超过预期时间的发布因为成本的剧烈上升或失去占领市场的机会等原因而直接导致软件制品的失败.合理管控软件的开发过程,做到在预期之内的发布,甚至是最优发布,已成为软件开发管理的重要内容.
区别于传统软件测试的主要目的——单纯地检测与排除故障,当前已开始考虑到持续进行测试以提高可靠性,达到(软件)系统发布的目的.因此,FDR 要能够支撑与服务于软件的及时发布,提高市场占有率.此外,对于新型态软件,例如大规模分布式网络软件、复杂软硬件综合系统、复杂网络软件等,在可靠性研究上缺少失效数据集的外部支持.
6.2.4 基于现有FDR 选择融入到可靠性模型中,发挥精准组合作用
可靠性建模的一个分支趋势是基于现有的模型框架融入不同的参数,或者分阶段融入不同的参数,以得到更为具体的精准模型.FDR 对于建模的重要性还可以通过其作为关键参数的属性,融入到现有的可靠性建模的框架中,进而建立更为灵活的可靠性模型.当前,无论是框架模型还是FDR 模型均存在多个,这为组合方式建立模型提供了有效选择,也为可靠性模型在工程中的应用带来机遇.
6.2.5 根据FDR 对测试策略实施有效指导
FDR 对测试环境的描述能力直接反映在故障被检测出来的故障数量与效率上,因此,有效的FDR 也应该为实际测试过程给出建议,用以调整测试策略,更加合理地分配测试资源.当前研究中,尚未有从FDR 的角度对测试工作量(TE)分配、测试过程管理等进行具体的研究,这成为亟待突破的研究内容.
故障检测率FDR 与可靠性的建模与度量紧密相关,是软件测试过程中测试技术综合运用取得的结果,既可以从测试覆盖的角度进行建模,也可以融合测试工作量TE 因素,还可以直接根据实际进行设定.可以看出:FDR是可靠性建模、增长、度量、系统发布的重要构成要素,是用以支撑可靠性研究与增强可靠性增长的重要内容,推动了以SRGM 为核心的可靠性研究的深入发展.
本文对可靠性模型中故障检测率的研究进行了全面述评,包括可靠性建模的关键要素FDR 的功能、与失效强度和冒险率的关联、多视角下的分类、不完美排错下的性能分析以及未来研究趋势等.期望我们的工作能为可靠性研究,特别是FDR 的研究提供有益的借鉴和参考,并为推动可靠性相关的研究与应用向前发展做出积极贡献.
致谢在此,我们向本文参考文献中研究人员所做的大量基础工作表示真诚感谢!对本文在写作与完善工作过程中给予无私支持和提供宝贵建议意见的同行致谢.特别感谢审稿人,他们提出的宝贵意见和建议对于本文整体水平的提高有很大帮助.