什么是变异测试(MT:Mutation Testing)

MT 不单单只是代表着蜕变测试,有时候也可以代表  变异测试( Mutation Testing),值得注意的是变异测试并不是用来检测/测试源程序的,而是一种验证测试集质量的方法。

一、基本概念  

Mutation testing is a powerful methodology for evaluating test suite quality. *

说白了,就将源程序( Parent)进行变异,产生不同的变体( Mutant),然后再使变体运行测试用例,比较源程序与变体程序在执行过程中的差别。当执行情况与源程序的执行情况完全一样时,该变体称之为存活( Survived);反之,执行情况有所不同,称之为杀死( Killed)。

A mutant is said to be killed if at least one test from the suite has the different results between the mutant and the original program. *

我们评价一个测试集越好,即该测试集能发现更多潜在的错误。而在变异测试中,对程序进行变异,本应该呈现于源程序不同的执行结果(即杀死),但是仍然有许多变体的执行结果与源程序执行结果一样(即存活)。那么被杀死的变体越多,证明这个测试集更好。为此人们选定了一个度量值,即变异值( Mutation Score),

Mutation score is the ratio of killed mutants to all non-equivalent mutant. *

注意,这个non-equivalent mutant 指的是不等价变异体,原来,在变异的时候,有可能变体跟父体在语义上并没有多大区别,那么在执行测试用例的时候,得到的结果肯定一样,这一类变体叫做等价变体( Equivalent Mutant),举个例子,假设源程序如下

for(int i=0; i<10; i++){ // 源程序
  //To-do ...
}

for(int i=0; i!=10; i++){ //变体1
  //To-do ...
}

for(int i=0; i<10; i--){ //变体2
  //To-do ...
}

很明显在1和2两个变体中,变体1与源程序并没有语义上的差别,因此变体1是等价变体;而变体2在源程序基础上发生了语义上的变异,因此叫不等价变体。

二、常用的工具

变异测试常用的工具由 Major 和 Pitest,二者都可以为源程序产生大量的变体。不明真相的吃瓜群众可以先去查看我的  Pitest教程,会场浅显易懂。

变异测试除了上述描述的作为测试集质量评估工具,另一个用途就是变异产生有bug的变体,也就是(Seeded Bug),用来模拟真实世界的bug。

--------------------
* 英文原句摘自论文 Predictive Mutation Testing

猜你喜欢

转载自blog.csdn.net/qq_43430964/article/details/112979632
今日推荐