变异测试是一种结构测试方法,用于检查测试程序的效率或精度。此方法有助于检查被测应用程序中的缺陷数量。它还有助于估计或提高测试套件的充足性。
为什么它被命名为变异测试?
变异测试的命名是这样的,因为创建了突变体(程序中的小变化)并将其引入程序代码中。该策略也称为基于故障的测试方法,因为通过将单个缺陷引入原始程序代码来创建突变体。
为什么需要进行突变检测?
测试覆盖率被认为是软件测试中的重要因素。变异测试有助于分析一组测试策略是否足以确保产品符合质量要求。如果我们无法解决任何问题,我们无法保证系统没有bug。
在变异测试中,软件代码会发生微小变化。在此之后,针对突变程序检查一组测试用例。良好的单元测试将能够检查程序代码中的缺陷。
如何进行变异测试?
-
创建突变体软件 - 需要首先通过将单个缺陷引入AUT来创建程序的突变体。QA测试人员可以根据需要引入尽可能多的突变体。他们还需要确保每个突变体保持独特,并且也与原始系统不同。
-
测试用例准备 - QA团队应该能够以能够识别突变体引起的问题的方式制作测试用例。
-
测试原始软件 - QA测试人员需要检查输入软件的测试用例输出是否与预期结果相同。否则,需要修复问题,并且需要测试软件,直到AUT没有缺陷。
-
突变软件测试 - 突变软件需要使用与原始软件相同的测试用例集进行测试。如果突变体软件的输出与原始软件的输出不同,则需要将突变体标记为死亡。它不应该再次测试。
-
突变得分计算 - 定义为计数od死突变体与非等效突变体的比率。Mutation得分的理想值是1。
-
突变评分分析 - 突变评分与测试效率直接相关。QA测试仪可以重复突变测试,直到获得满意的结果。
突变测试类型:
突变检测可大致分为三类 - 价值突变,决策突变和语句突变。
在值突变中,常数或参数的值被改变。例如,在循环中将值更改为更大或更小,初始化值更改。
决策突变 - 这有助于修改程序代码,以便反映滑动错误。例如,> a更改为<a。
语句变异 - 在此类测试中,开发人员剪切和粘贴代码,这可能导致删除某些行语句。这也可能涉及交换代码行的顺序。可以删除/复制一行代码。陈述顺序也可以改变。
变异算子:
应用于原始程序以生成突变体的运算符称为突变运算符。Mutation操作符可以大致分为
-
传统变异算子
-
类变异算子
传统变异算子:
传统的变异算子是为过程式编程语言开发的。尽管这些操作符的应用产生了大量的突变体,但它们都可能无效,因为它们往往会重叠。以下是传统的变异算子
-
算术运算符
-
关系运算符
-
条件运算符
-
逻辑运算符
-
分配运营商
-
移位运算符
通过替换,插入或删除突变操作符来生成突变体。
类突变操作符:
这些用于生成突变体以测试面向对象和集成问题。
-
封装 -通过应用修改,删除或插入实例变量和方法的访问级别的运算符来形成突变。
-
继承 - 通过应用运算符生成突变体,这些运算符删除隐藏变量以检查是否定义了该变量,以及它在类和子类中的可访问性是否正确。
-
多态性 - 突变体由多态运算符创建,以检查具有相同名称和参数数量的方法是否可以正确方式访问。
变异测试工具:
有几种Mutation测试工具可供使用。Jumble和Insure ++是其中最常见的。
混乱:
-
Jumble是一个简单的非图形开源工具。它将文本文件转换为可以研究文件格式的版本。
-
它直接在源代码级别运行,并加快Mutation测试过程。Jumble支持的有限Mutation运算符集:条件,二进制算术运算,增量,内联常量,类池常量,返回值和开关语句
保证++:
-
它是C和C ++的商业自动测试工具,它使用Mutation分析技术。
-
Insure ++不是生成所有可能的突变体,而是关注“潜在的等效突变体”。这个想法背后的动机是,如果任何测试用例能够杀死“潜在的等效突变体”,它也可能会发现原始程序中的错误
变异测试的挑战:
变异测试能够有效地评估测试集的充分性和质量,但是它也具有如下的某些挑战
-
突变测试具有针对测试集执行大量突变体的高计算成本。
-
人类oracle问题,指的是检查每个测试用例的输出与原始程序的输出的过程,可能是一个严重的问题,因为突变测试可以导致测试用例数量的增加