本文发表于 ISSTA 2017
原文PDF下载
简要
一种通过规范化减少语义复杂性从而简化用例集的方法
背景
软件测试中经常会编写大量冗余的用例,主要是因为:
- 难以准确识别和区分不同的故障
- 测试用例中可能存在大量的冗余信息(不同操作序列语义上可能是相同的)
- 无法区分测试用例中的数值是无关紧要的随机数,还是关键的输入值
同时,对于复杂的软件系统,测试用例的长度可能很长,导致测试过程变得耗时且不可行.
论文内容
本文提出了一种规范化和泛化方法,其目的是找出一个函数f(t)
,其中t
为测试用例
- 如果
t
导致失败,则f(t)
失败 - 如果
t
和t'
是由于相同故障导致的失效,则f(t)=f(t')
- 如果
t
和t'
是由于不同故障导致的失效,则f(t)≠f(t')
这样我们就能实现每个潜在故障都由单个测试唯一表示
但是这个函数实际上很难(精确的)实现,如果能(精确的)实现,则几乎能够实现故障自动定位和修复(软件测试领域的另一重大目标)
因此,本文的目标是通过提供一组简单的转换来接近目标:
f
将许多测试更改为同一测试f
将两个因不同原因失败的测试更改为相同测试的概率很低f
的计算成本并不高
Figure 1
是一个例子,三个看上去不同测试用例,实际上是由于同一个错误导致的失败。本文的目的就是减少这样冗余的测试用例,使得可以简化为一个用例
最终可以形成一个规范化且带有可读注释的用例
为此,本文引入了称之为TSTL的工具包,其中包含一种DSL(文中称之为TSTL harness )
随后定义了重写的规则和规范化的算法,重写可以减少步骤数量,使得整个过程是收敛的。
拓展知识点
本文是基于 delta-debugging
背后的思想实现
其中测试步骤顺序无关化相关方法可参考:
- J. Andrews, Y. R. Zhang, and A. Groce. Comparing automated unit testing
strategies. Technical Report 736, Department of Computer Science, University
of Western Ontario, December 2010