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)为比
   183   184   185   186   187   188   189   190   191   192   193