蜕变测试论文解读-动态推导似然蜕变属性支持常微分测试
1 文献来源
引用格式: F. H. Su, J. Bell, C. Murphy, G. Kaiser, “Dynamic Inference of Likely Metamorphic Properties to Support Differential Testing,” IEEE/ACM International Workshop on Automation of Software Test, pp. 55-59, 2015.
论文标题被翻译过来就是:动态推导似然蜕变属性支持常微分测试,发表于2015年的IEEE/ACM自动化软件测试研讨会上。
2 论文解读
2.1 主要工作
论文的主要贡献有两个:
-
展示了一个新颖的系统——KABU
该系统可以动态推导描述方法输入前后特性的程序中方法状态的性质,指的是方法输入转变前后的输出的一种变化规则,满足公式MP = T + [input’] + C + V,MP是蜕变属性,T
是输入转换器,[input']
是原始输入经过输入转换器后形成的新的输入(也称衍生输入),C
是输出检查器,V
是输出状态:要么是{类变量CV, 实例变量IV, 本地变量LV}中的一种,要么是通过输出检查器的返回值。 -
提出了一种测试概念——MDT
MDT是蜕变常微分测试的简称,通过探测同一方法的不同版本之间不同的蜕变属性集,KABU报告了潜在的错误,供人们审查。不同版本是指相邻的两个版本,通过探测这两个相邻版本之间的不同的蜕变属性集,报告错误。
3 KABU
3.1 我的疑惑
- 和Daikon推导程序不变量有什么关联?
论文第1章的第3段
,提到了推导似然程序不变量的程序Daikon(http://plse.cs.washington.edu/daikon/),作者说他们动态推导似然蜕变属性启发于Daikon系统推导似然程序不变量。程序不变量指的是在程序多次运行过程中,始终保持不变状态的量,常见于断言、文档、规格说明中,比如:
程序不变量 | 说明 |
---|---|
“x.field > abs(y)” | 一个值的取值范围大于绝对值y |
“y = 2*x+3” ; | x不管怎么变化,y都满足等式y=2*x+3 |
“array a is sorted” ; | 数组a是有序的 |
“for all list objects lst, lst.next.prev = lst” ; | 对所有的列表项lst,lst.next.prev= lst |
“for all treenode objects n, n.left.value < n.right.value” ; | 对所有的树结点n,n.left.value<n.right.value |
“p != null => p.content in myArray” ; | p不为空,那么p.content在myArray中 |
…… | …… |
我的理解是:Daikon发现不变量的过程是从代码级别的,需要监测程序运行的每个变量、参数如何变化,而KABU似乎也需要监测输入到输出涉及的变量的变化情况。
在第3段里也有说道“使用KABU,我们分析系统的执行情况以检测哪些MPs可能适用于哪些方法,然后提供这些属性以供测试人员确认或拒绝”
(系统的执行情况见第3章 A Instrumentation
)。
- 蜕变属性到底是什么?
文中对蜕变属性下了一个定义:MP = T + [input’] + C + V,然后将MP交给程序员或者测试者接受或拒绝,MP长什么样子?
好像是这样子的,我举个例子:P计算程序f(x)=2x,原始输入是5。
可能的一个蜕变属性:
MPi = Multiplier(× 2) + [10] + Multiplicative checker(× 2) + True(检查器返回为真)。
上面这两个算法已知的属性和推导的属性如果写出来就好了。
3.2 KABU的运行机制
KABU流程图:
内容待补充。。。。
步骤一:指导
在执行之前,在被测试的系统中插入存根代码,以支持跟踪和输入转换。
步骤二:输入转换
为系统产生其它的输入,以便将可能不会暴露的MPs暴露出来。
定义了几个转换器:
- Multiplier 乘转换器
- Adder 加转换器
- Negator 取负转换器
- Shuffler 洗牌转换器(任意改变输入元素的顺序)
- Reverser 反转转换器(反转输入元素的顺序)
步骤三:程序执行
用原始输入和所有转换的输入执行系统,转换后的输入在沙盒中执行,沙盒允许多次执行的输出状态互相不受干扰。
在分析执行期间,KABU通过在步骤一阶段插入的钩子,动态地监视被检查的方法。
步骤四:输出状态比较
收集每个输入执行后的输出状态,识别出MPs。
相应地,定义了几个检查器(来源于输入转换器):
- Identity checker 相等检查器
- Multiplicative checker 乘检查器
- Negator checker 取负检查器
- Additive checker 加检查器
- Shuffler checker 洗牌检查器(输出元素的顺序被打乱了)
- Reverser checker 反转检查器(输出元素的顺序被反转了)
该方法的一个限制是:我们提出的似然MPs可能不一定是有效的——它们需要开发人员的监督来确定它们是否是真正的属性(先前关于自动检测似然程序不变量的方法也有这种限制)
。
4 MDT
为了更自动化地使用KABU,提出了蜕变差分测试MDT——自动化回归测试的一种(其实是一种新的方法)。如果一种属性Pr在同一方法的连续两个版本(n版本和n+1版本)中只出现了一次,则说明对此方法的功能改变影响了这个属性,出现在n版本的叫Regressed Property回归属性,出现在n+1版本的叫Progressed Property进步属性。 在这种情况下,观察到的属性Pr是否真的是MP是无关紧要的——无论是哪种情况,它仍然是封装程序行为的一种方法。
KABU推断每一个版本待测方法的MPs,并且输出两个连续版本的回归/前进属性,但是此时还不知道是哪个版本的问题,有待进一步查证。KABU在变量级别上推断MPs,MDT可以标记影响特定变量但不一定影响方法返回值的潜在bug。通过观察两个连续版本之间MPs的差异,并且检查有变化的日志,来验证是否方法中的改变或者错误被修复了(因为有两个版本,可能是n版本的错误在n+1版本被修复了,也有可能是在n+1版本引入了新的错误)。
MDT只报告MPs的差异,测试者不需要验证MPs的正确性,只要关注检查这些差异是否导致错误就可以了
。
5 论文总结+个人看法
5.1 未来工作
- 通过输入状态(不仅是方法的输入参数)来扩大输入转换,就像已经用作检查的输出状态一样。
- 执行大量的实验来评估KABU推导MPs的能力。
5.2 相关工作
-
J. Zhang
的Search-based inference of polynomial metamorphic relations
:自动推导方法的输入和输出之间的多项式蜕变关系。
KABU只需要观察方法的输出
,并且考虑方法的所有输出状态,推导的变量级MPs,其中的变量包括静态的、实例的和本地的变量
。 -
U. Kanewala
的Using machine learning techniques to detect metamorphic relations for programs without test oracles
:使用方法的控制流图特征作为数据集,应用分类算法预测一种方法是否满足预先定义的蜕变属性,这种方式需要人类的先验知识来训练分类器。
KABU直接从第3章定义的搜索空间
(不晓得是什么东东)推导MPs,不需要先验知识。 -
差分单元测试类似于KABU,在于差分单元测试可以识别若干个版本代码之间的功能差异,但是它们
比较的是版本之间的原始输出
,而不是比较不同版本之间满足的MPs
(KABU)。 -
另一个差分框架通过执行
同一单元的若干版本来比较单元的改变
,由于KABU比较版本间的MPs(不是真实的输出)
,比起3和4所说的这两种方法,它对版本间的细微变化不那么敏感,从而没那么多的误报。
5.3 个人观点
以后再补充,休息一下。。。。