变异测试(mutation testing):一种评估测试用例集错误检测能力的方法

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了变异测试(mutation testing):一种评估测试用例集错误检测能力的方法相关的知识,希望对你有一定的参考价值。

目录

动机

概念

变异类型

变异测试实例

变异测试的强与弱

变异测试的流程图

变异得分

变异测试工具

拓展:利用变异分析做缺陷定位

参考


动机

开发者测试的测试脚本的评价指标中,最关键的两点是测试代码覆盖率以及测试脚本的错误检测能力,错误检测能力如何衡量?一个朴素的想法是,对源程序做一些微小的改动,改动后的程序被称作变异程序/变异体。理想的测试脚本会让源程序通过,而拦截住所有的变异程序。

概念

变异类型

针对Java分为6类(貌似开发者测试只面向Java?)

变异测试实例

上图有源程序和3个变异体,对于测试用例x=1,y=1,只杀死了前两个,却让最后一个顺利通过。 

变异测试的强与弱

变异测试的过程中,源程序变异程序的执行差异主要分为以下两种类型:

执行同一测试用例,源程序和变异程序产生了

(1)不同的运行时状态 [情形1]

(2)不同的执行结果 [情形2]

所谓强弱变异测试,体现了认定变异程序被杀死的标准严格程度上,如果是弱变异测试, [情形1]出现就认为变异体被杀死了,而在强变异测试中,则需要 [情形2]出现。

变异测试的流程图

变异得分

变异测试是评估方法,对应的评估指标是变异得分(mutation score)。在介绍变异得分之前,还要先介绍最后一个概念——等价变异体。

所谓等价变异体,也就是(语法上)变异了,但是(语义上)依然和源程序等价的变异体。

等价变异体在变异测试中,不希望被测试用例集杀死。

综上,变异得分的定义如下

变异测试工具

C: Milu

Java: MuJava Javalanche Major PIT

拓展:利用变异分析做缺陷定位

这里仅提供思路——

对于一个程序产生了若干测试用例

假设1:变异错误语句导致:

失败测试用例输出发生变化的概率>通过测试用例输出发生变化的概率

假设2:变异正确语句导致:

失败测试用例输出发生变化的概率<通过测试用例输出发生变化的概率

基于以上两个假设,有以下两个推论

如果发生失败测试变成通过的概率增大:

变异错误语句的可能>变异正确语句

如果发生通过测试变成失败的概率增大:

变异正确语句的可能>变异错误语句

基于以上两个推论,有一个计算变异体可疑度的公式(老师这一页PPT翻得太快我没能记下来)

参考

慕测开发者测试课程

以上是关于变异测试(mutation testing):一种评估测试用例集错误检测能力的方法的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript数组方法: 变异方法 (mutation method)和非变异 (non-mutating method)

如何在dplyr中基于ntile()-groups应用变异?

如何使用 Apollo Angular 测试查询、变异、订阅服务?

transcription-coupled repair|Germ|HK|TS|Mutation|四类变异

dplyr 中的 mutate_each / summarise_each:如何选择某些列并为变异列赋予新名称?

变异,触发器/函数在使用触发器时可能看不到错误