Page 188 - 《软件学报》2020年第9期
P. 188
张策 等:可靠性模型中故障检测率研究述评 2809
λ () t h () t
() =
bt = (8)
−
−
( ))
(am t (a m t
( ))
同时,文献[51]认为测试覆盖下的故障以常量概率 k 被检测出来,从而可推导出:
⎡ ct ′ () ⎤
−
λ () t = ⎢ ⎥ (a m t (9)
())
⎣ 1 ct ⎦ − ( )
则 h(t)为:
ct ′ ()
() =
ht (10)
−
( )
1 ct
此时,即可得到风险函数或每个故障的失效发生率 h(t)与故障检测率 b(t)相等,即 b(t)=h(t).
4 分类与综合视角下的 FDR
4.1 测试覆盖函数视角——FDR与测试覆盖函数的关系
软件测试过程中,随着测试用例的不断执行,测试覆盖的范围不断扩大,故障被检测出的可能性不断提高.
测试覆盖范围的扩大,使得被检测出的故障数量增多,因此,测试覆盖函数与故障检测率关系密切.测试覆盖 TC
(testing coverage)指测试系统覆盖被测试系统的程度,描述了测试与被测试对象之间的相关性 [52] ,测试覆盖率较
高的程序在测试过程中执行了更多的源代码.这里,从代码语句覆盖的角度来看,可以定量表示为公式(11)所示:
S
TC = c (11)
S t
其中,S c 是测试案例覆盖的 KLOC(kiloline of code),S t 是全部 KLOCs.
当考虑时间因素时,TC 就演变为随测试时间变化的测试覆盖函数 TCF(testing coverage function):c(t),可用
以描述测试覆盖率的变动情况.显然,c(t)是一个非负的且非降的函数.
4.1.1 测试覆盖函数起源——采用设定 FDR 与测试覆盖率成比例的间接视角
针对上述公式(11)的来源,文献[51]最早给出了严谨的分析,其认为测试覆盖下的故障以常量概率 k 被检测
出来,从而建立了下面的微分等式:
d( )mt d ( )c t
= ac⋅ ()t ⋅ (12)
dt 0 d dt
其中:a 0 表示初始时软件中的故障总数;c d (t)表示 t 时刻测试覆盖下故障被检测出的概率,按照假设,得到 c d (t)=k
d( )
mt
常量.这样,令 a 0 k=a,则得到 m(t)=ac(t),进而基于 () t = 的事实,可推导出:
λ
dt
⎡ ct ′ () ⎤
−
λ ()t = ⎢ ⎥ (a m ())t (13)
⎣ 1 ct ⎦ − ( )
则冒险函数(the hazard function)或每个故障的失效发生率(the failure occurrence rate per fault)h(t)为
ct ′ ()
() =
ht (14)
−
( )
1 ct
这样,在通常情况下可认为 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 时刻的测试覆盖率与当前剩余的测试覆盖值成比例.这样,可以得到下
面的微分方程:
d( )ct
β = ()(t α − c ())t (15)
dt
其中,α是可获得的测试覆盖目标值,考虑到测试后期软件中未覆盖代码的难以测试性,其满足 0<α<1;β(t)为比