阅读 584

软件测试中的突变测试(突变评分和分析示例)

变异测试,又名程序变异、变异分析或基于故障的测试,是一种软件测试,其中测试人员在源代码中引入一些细微的更改以检查源代码的错误检测能力。

无法执行的测试用例被认为是理想的。如果测试用例通过,则意味着代码中存在某种形式的错误。在代码中输入微小的更改称为修改,而源代码的修改版本称为突变体。如果测试用例通过,测试人员会说“突变体存活了下来”。这里的目标是杀死所有突变体。

变异测试还有助于提高定义的测试用例/套件的测试质量。杀死更多的突变体将进一步提高测试的质量。

突变测试:要记住的重要概念

以下是您在执行突变测试时经常会遇到的一些概念。

突变体

Mutant 又名突变程序是程序源代码的变异或修改版本。如果你通过一个突变体执行测试数据,你会得到与真实源代码不同的结果。

三种类型的突变体:

  • 杀死突变体- 突变测试将在执行过程中杀死一些突变体。当您在源代码的原始或变异版本上运行变异测试时,您会遇到被杀死的突变体。

  • 幸存的突变体- 如上所述,即使在运行测试数据之后,一些突变的代码仍然存在。目标是重写代码以杀死这些幸存的突变体,也就是活的突变体。

  • 等效突变体- 这些类型的突变体与活突变体密切相关,因为它们在执行测试数据后仍然活着。但是,与活变体不同,等效变体与源代码具有相同的相似性,但在某些情况下具有不同的语法。

变异运算符或变异器

突变体是突变测试过程中的关键参与者。他们决定在源代码中进行的更改类型。源代码中的这些更改也称为突变规则或故障。

突变分数

突变分数或突变充分性是分配给源代码中存在的几个突变体的分数。由于等效的突变体与源代码有相似之处,因此在计算突变分数时必须跳过它们。这里的目标是获得高突变分数。

突变测试的分步过程

第 1 步- 这是突变者必须开发多个版本的突变体并将它们引入源代码的地方。创建的每个突变体都必须包含一个错误。这里测试人员的目标是让突变失败,从而保证测试用例的效率。

第 2 步- 这是调整测试用例以检测程序中的错误的地方。然后将这些情况应用于原始程序和变异程序。

Step 3 - 在这一步中,mutators 将原始程序与突变程序进行比较以检查错误或错误。

第 4 步- 如果突变程序和原始程序生成不同的输出,则测试用例已经杀死了突变体。结果,用于检测与原始程序和变异程序的差异的测试用例通过了。

第 5 步- 如果原始程序和突变程序提供相同的结果,则意味着突变体还活着。当这种情况发生时,突变器会被指示准备更强大的测试用例,直到它们杀死所有突变体。

如何创建突变程序?

突变是程序语句中的单个语法更改,其中每个突变程序必须与原始程序不同。

例如,如果 -

原始程序写为 -


if (x<y)
   Print "Hello"else   Print "Hi"


然后为了使它成为一个突变体,你可以在语法上做一个小的改变,比如改变语法,比如 -


if(x>y)
   Print "Hello"else   Print "Hi"


有几种方法可以生成突变程序。

  • 首先,您可以用不同的操作数或常量值替换操作数(用 y 或常量值 = 5 替换 x)。

  • 您可以插入一个新的运算符。如果 x==y,则将 == 替换为 >= 或者如果 x>=y,则在语句中插入 ++,使其成为 x>=++y

  • 您可以修改编程语句。删除“if else”中的“else”。删除整个“if else”并找出程序的行为。

其他一些突变的例子

  • 替换 GOTO 语句

  • 替换返回语句

  • 删除语句

  • 更换逻辑连接器

突变测试的类型

以下是变异算子或变异器主要使用的变异测试类型 -

  • Value Mutation - 在此测试中,您可以将参数或常量值更改为 +/-1。

  • 语句变异- 在语句变异中,您必须可以删除、复制或重新排列代码块中的语句。

  • 决策突变- 在此突变中,您必须对做出决策的代码进行突变。例如,您可以将 > 更改为 <。

突变测试的优势

  • 突变测试 (MT) 有助于覆盖代码逻辑的重要部分

  • 轻松捕获经常绕过的错误

  • 评估和修改测试套件的测试质量

  • 帮助测试代码的特定部分,不限于分支、语句或路径

突变测试 (MT) 的缺点

  • 这是一项耗时且耗费资源的任务,因为您必须处理为每个代码块生成的大量突变体

  • 你必须反检查每一个活的突变体

突变测试 (MT) 工具

一些用于突变测试的工具包括 Stryker、PIT、Insure ++ 和 Jumble。

突变测试的一些技巧

不管程序有多小,突变体的数量总是很大。因此,您可能需要使用突变体的子集。

您可能需要根据应用程序的编程语言、设计和规范指定不同的变异运算符。

如果您发现活的突变体,这可能意味着两件事——突变体可能无效,或者数据集不足。

一些自动变异测试的单元测试框架和工具包括 jester、pester 和 MuClipse 等。

结论

突变测试的作用是评估和避免程序中的不确定性。测试驱动开发 (TDD) 通常有助于编码,但它们不能总是保证精益代码。无论您设计的代码有多好,它们并不总是按照您的期望工作。有时开发人员在没有描述期望的情况下添加代码,这通常会使整个代码库处于危险之中。突变测试用于以 TDD 节奏捕捉这些违规行为。 


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐