[论文解读]Comparing the Effectiveness of Testing Techniques

Comparing the Effectiveness of Testing Techniques

简介

论文标题

  • Comparing the Effectiveness of Testing Techniques
  • 比较测试技术的有效性
  • 2011.8

核心内容

  • 讨论一个测试数据选择标准是否另一个更有效

ppt地址

本篇论文主要是讨论了几种形式化定义的测试数据集的好坏标准,以及形式化定义的缺点,并且讨论了这些标准在实践中的应用

摘要

测试软件系统需要从业者决定如何选择测试数据。本章讨论一个测试数据选择标准比另一个更有效意味着什么。讨论了几种建议的比较关系,强调了每种关系的优点和缺点。此外,还讨论了这些关系是如何演变的,并认为需要进行大规模的实证研究。

形式化分析

  • 比较关系 Comparison relations
  • 概率衡量 Probabilistic measures

比较关系

  • 包容关系(subsumption relation)
  • 强大关系(power relation)
  • 更好关系(BETTER relation)

包容关系

定义

如果对于每个程序P,满足C1的每个测试套件也满足C2则测试选择标准C1包含(subsumes)测试选择标准C2,

c1 subsumes c2 : ∀TS satisfies(TS,C1) ⇒ satisfies(TS,C2)

缺陷
  • 测试标准的不可比较性

    低效”关系暴露错误而“有效”关系不暴露错误

  • 可能会产生误导

强大关系

定义

故障检测

如果满足测试选择标准的每个测试集都包含导致程序P失败的输入,并且至少有一个测试集满足P的标准,则称该测试选择标准检测到故障

powerful

如果对于每个程序P,如果C2检测到P中的故障,C1也会检测到,则准则C1至少与准则C2一样强大

C1 is at least as powerful as C2 : detects(C2,failure) ⇒ detects(C1,failure)

缺陷
  • 仍然存在不可比较性问题

    有可能为权利关系认为较不有效的标准选择的测试集将比为由权利关系认为更有效的标准选择的测试集暴露更多的故障。

    C1和C2都没有检测到这种形式意义上的任何故障

  • C1 is at least as powerful as C2

    ∃C2: exposes some failures more often than C1

    ∃C1,C2: none of both find certain failures

更好关系

定义

required

如果该程序的每个满足测试标准C的测试集都必须包括该测试用例,那么这个用例被要求标准C和测试程序P要求

test case required by criterion C to test P: tc ∈ ts ∧ ∀ts.satisfies(ts,C) ⇒ requires(C,ts)

BETTER

如果对于每个程序P,C2所要求的任何导致故障的输入C1都需要,则所述准则C1比准则C2更好

C1 is BETTER than C2: ∀tc.requires(C2,tc) ⇒ requires(C1,tc)

此外:

(C1subsumes C2) ⇒ (C1B ETTER C2) ⇒ (C1at least as powerf ul as C2)

缺陷
  • 仍然存在不可比较性问题

  • 很少有标准需要特定的测试用例

比较关系中的问题举例

程序P和输入域D,将D分成5个子域DiD_i,从每个子域选择出一个测试用例

[论文解读]Comparing the Effectiveness of Testing Techniques

C1 covers C2 : 如上图所示,满足C1条件的用例,也一定满足C2(从 {3,4}中选择一定满足从{0,3,4}中选择)

虽然C1 covers C2 ,但是C2发现错误的概率要比C1要高

概率衡量

覆盖关系

定义

covers relation

设C1和C2为标准,SDC(P,S)\mathcal{S D}_{C}(P, S)表示从其中选择测试用例以满足程序P和规格说明S的准则C的非空的多个子域集合

DSDC2(P,S)\forall D \in S D_{C_{2}}(P, S) 存在 {D1,,Dn}\left\{D_{1}, \ldots, D_{n}\right\} 属于 SDC1(P,S)S D_{C_{1}}(P, S)D1Dn=DD_{1} \cup \ldots \cup D_{n}=D,则 C1 覆盖 C2

特殊的,有universally covers:(P,S):C1\forall(P, S): C_{1} 覆盖 C2C_{2}

M = P(”test set exposes at least one fault”)

程序P和输入域DD,输入子域为{D1,D2,,Dn}\left\{D_{1}, D_{2}, \ldots, D_{n}\right\},规范SS,和测试选择标准CC.设did_i是子域DiD_i的大小,mim_i是其导致失败的输入数量,则标准M为:
M(C,P,S)=1i=1n(1midi) M(C, P, S)=1-\prod_{i=1}^{n}\left(1-\frac{m_{i}}{d_{i}}\right)
假设使用均匀分布从每个子域中独立选择一个测试用例,则M是测试套件暴露至少一个故障的概率

对于 (P, S),即使 C1覆盖C2,也有可能 M(C1,P,S)<M(C2,P,S)M\left(C_{1}, P, S\right)<M\left(C_{2}, P, S\right)可见之前的问题举例,为了解决上述问题,因此有如下定义

Properly covers relation

C1C_{1} properly covers C2M(C1,P,S)M(C2,P,S)C_{2} \Rightarrow M\left(C_{1}, P, S\right) \geq M\left(C_{2}, P, S\right)

C2C_{2}的每个子域由C1C_{1}子域的并集覆盖

C2C_{2}子域中没有一个比SDC1S D_{C_{1}}更常出现在覆盖中

特殊的,有properly universally covers: (P,S):C1\forall(P, S): C_{1} properly covers C2C_{2}

预期检测到的故障数量
E(C,P,S)=i=1nmidi E(C, P, S)=\sum_{i=1}^{n} \frac{m_{i}}{d_{i}}
C1C_{1} properly covers C2E(C1,P,S)E(C2,P,S)C_{2} \Rightarrow E\left(C_{1}, P, S\right) \geq E\left(C_{2}, P, S\right)

M 和 E 可以用来对测试标准排序

注意: properly covers = will find more faults just more likely

properly covers 并不保证发现更多错误,只是可能性更高

因此这些方法只能在理论上保证上的好坏,并不一定真实反映实际情况

覆盖标准之间的关系摘要

[论文解读]Comparing the Effectiveness of Testing Techniques

从C1到C2的实线箭头表示C1普遍适当地覆盖C2,从C1到C2的虚线箭头表示C1包含C2,但不是普遍适当地覆盖C2;任何没有在图中明确显示且不是从传递性出发的关系,以及普遍适当覆盖意味着包含这一事实,都不成立

形式化分析的局限性

  • 关系比较测试策略的理想版本,而不是实践版本
  • 缺失风险分析:高后果故障、小故障
  • 没有提供人类变异性:经验、专业知识、后天直觉
  • 测试成本:使用某些标准是否有益?

关系比较测试策略的理想版本,而不是实践版本

举例,分支测试

按照该篇论文思想,分支测试的正式定义假设首先将域划分为子域,每个子域正好包含导致执行程序中给定分支的输入域的那些成员。然后,假设使用均匀分布随机选择每个子域的一个元素。

很难想象这一过程在实践中会得到遵循。实际上,分支测试往往更多地被用作评估测试彻底性的一种方式,而不是作为选择测试用例的基础。测试人员通常根据他们是否已经完成了全面的工作来选择测试用例。然后,他们可以使用分支复盖工具,该工具确定到目前为止他们组装的测试套件已经执行的程序分支的百分比。如果百分比很高,那么测试人员可能会看到哪些分支没有被覆盖,并尝试确定将导致执行每个未覆盖分支的输入。如果百分比很低,那么测试人员很可能会继续使用特别的方法来选择测试用例,然后重新评估实现的分支覆盖率,反复进行,直到覆盖的分支百分比超过规定的水平,或者测试人员认为他们已经做得足够了

如果分支测试以这种方式使用,那么我们根本不知道它的有效性与其他测试策略相比如何,因为我们没有评估分支测试的那个版本,我们评估了一种完全不同的测试方法,我们称之为分支测试。所有比较的测试策略都是如此–它们不是测试人员用来选择测试用例的真正策略,它们是理想化的版本。所以我们剩下的问题是:知道理想化的测试用例选择方法A优于理想化的测试用例选择方法B,能告诉我们关于“真实”方法A和B的相对有效性吗?既然真正的方法A和B没有正式定义,那么实际上是否只有一个“真正的”方法A或B,或者不同的实践者各自有自己的使用方法呢?

缺失风险分析:高后果故障、小故障

另一种不同类型的问题与依赖措施M和E作为确信一种测试策略比另一种更有效地工作的基础是否合适有关。这两个衡量标准都没有区分严重的错误和微不足道的错误。因此,如果标准C1(正确覆盖标准C2的标准)暴露了微小的故障,而C2暴露了灾难性的故障,那么使用C1测试程序的事实并不能真正表明它比使用C2测试时更可靠。这是正确的,尽管使用C1发现了更多的故障,并且暴露故障的可能性更高,因为暴露的故障几乎没有什么后果。

没有提供人类变异性:经验、专业知识、后天直觉

使用完全相同的方法来测试给定软件系统的两个不同的测试人员通常将选择不同的测试用例集合

测试成本:使用某些标准是否有益?

假设C1确实做了比C2更有效的测试工作,并且暴露了比C2更严重或更严重的故障。但是,如果C1的使用成本比C2高出几个数量级呢?增加的收益值得增加的成本吗?

为暴露的故障几乎没有什么后果。

没有提供人类变异性:经验、专业知识、后天直觉

使用完全相同的方法来测试给定软件系统的两个不同的测试人员通常将选择不同的测试用例集合

测试成本:使用某些标准是否有益?

假设C1确实做了比C2更有效的测试工作,并且暴露了比C2更严重或更严重的故障。但是,如果C1的使用成本比C2高出几个数量级呢?增加的收益值得增加的成本吗?