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

突变测试

变异测试是软件测试的另一种形式,是statement(s)对源代码中的哪些进行更改或变异的测试,以确定测试用例是否可以检测到源代码中的错误。它的进行是为了确保测试用例的质量,因为它必须使变异的源代码失败。

变异测试不仅用于确定现有软件测试的质量,还用于设计新的软件测试。在突变测试中,程序会以小方式进行修改。它强调帮助测试人员开发有效的测试并检测程序测试数据中的瓶颈。

1971 年,Richard Lipton 首次提出突变检测。最初,由于其成本高,突变测试并没有被广泛使用。然而,今天它被广泛用于多种语言,如 Java 和 XML。它是一种白盒测试,可以应用于设计模型、规范、数据库、测试甚至 XML。突变测试,是一种典型的结构测试技术。万一真实程序和突变program(s)产量使用代码的结构来指导测试。它可以被认为是一个以小的方式重写源代码以避免其中冗余的过程。

测试人员需要记住的一件重要事情是将源代码中的更改保持在极小的范围内,以免影响程序的主要目的。它也被称为基于故障的测试策略,因为它涉及一个有故障的程序,主要用于单元测试。

突变测试的类型

  • 值突变 -在此测试中,修改值以查找程序中的错误。较小的值被修改为较大的值,反之亦然。通常,常量在值突变测试中会发生变化。

  • 决策突变 -在此测试中,修改逻辑/算术运算符以发现程序中的错误。

  • Statement Mutations -在这个测试中,一个语句被删除或被另一个语句替换。

突变测试程序

  • 通过引入许多称为突变体的版本,在源代码中创建了错误。一个变种人必须只有一个错误。目的是导致此类突变版本无法显示测试用例的有效性。

  • 然后,将测试用例应用于真实程序和变异程序。测试用例必须是合适的,并经过调整以发现程序中的错误。

  • 将真实程序的结果与变异程序的结果进行比较。

  • 如果真实程序和突变体的program(s)产量不同output(s),则测试用例会破坏突变体。因此,测试用例足以找到两个程序之间的变化——真实的和突变的。

创建突变程序

突变是在程序语句中进行的单个语法修改。每个这样的突变程序必须与真实程序相差一个突变。例如,

真实节目突变程序
If (x>y)如果 (x<y)
print “Hello readers.”打印“读者你好。”
else别的
print “How you doing?”打印“你好吗?”

在突变程序中进行的更改

有许多技术可以生成突变程序,例如 -

操作数替换运算符表达式修饰运算符语句修改运算符
The operand is replaced with another one or with the constant value.运算符或新运算符的插入在程序语句中被替换。Programmatic statements are changed so as to create mutant program.
例如, if (a>b) 替换 a 和 b 值 if (5>b) 替换 a 为 5例如, if (a==b) 用 >= 替换 == 并使突变程序成为 if (a>=b) 并在 if (x==++y) 语句中添加 ++例如,删除 if-else 语句中的 else 语句。删除整个 if-else 语句以确定程序的行为方式。样本变异算子:
  • GOTO 标签更换

  • 返回语句替换

  • 语句删除

  • 一元运算符插入

  • 逻辑连接器更换

  • 可比数组名替换

  • 从 if-else 语句中删除 else。

  • 添加或替换运算符

  • 通过修改数据替换语句

自动化突变测试

变异测试耗费大量时间,手动执行也非常复杂。因此,建议使用自动化工具和技术来加快测试过程。这些工具也减少了测试过程的支出。一些用于突变测试的自动化工具是 -

  • Stryker - 这个开源工具有助于对of.NETCore 和 .NET Framework 项目进行变异测试。它可以通过在源代码中临时引入错误来测试测试用例。它可以控制 30 多个支持的突变。Stryker 通过使用代码分析和并行测试运行程序来加速测试。此工具支持 JavaScript、TypeScript、C# 和 Scala。Stryker 使用智能和称职的报告来发现幸存的突变体并提高测试效率。

  • PIT 测试- PIT流程集成测试工具有助于为流程集成场景设置自动化测试。这个工具背后的想法是;从 SAP Process Integration 或 SAP Process Orchestration System 的运行时检索已处理的消息。消息存储在 PIT 系统的数据库中,以后可以在不同的系统(称为目标系统)上运行。这些运行消息是在运行完成后从目标系统收集的。将结果与参考进行比较message(s)从源头。该工具是变异测试领域的最新技术,为 JAVA 和 JVM 提供标准测试覆盖率。该工具快速、强大且易于与现代测试和构建工具集成。PIT 测试易于使用、积极开发和支持。它以易于阅读和理解的格式生成报告,集成了行覆盖和突变覆盖信息。

突变测试的概念

  • Mutants -它是源代码的修改版本的变异,包含小的变化。当通过突变体执行测试数据时,它产生与原始源代码不同的结果。它们也被称为突变程序。

  • Survived Mutants -这些是通过源代码的原始版本和变异版本执行测试数据后仍然存活的突变体。存活的突变体必须被摧毁,也被称为活体突变体。

  • Killed Mutants -这些突变体在突变测试完成后被摧毁。这些是从原始和变异源代码的不同结果中获得的。

  • 等效突变体 -这些突变体与活突变体密切相关,即使在通过它们运行测试数据后,它们仍然活着。它们与其他的不同,因为它们与原始源代码具有相同的含义,而不管它们可能不同的上下文。

  • 突变分数 -突变分数是被破坏的突变体与突变体总数的百分比 -

突变分数 =(被摧毁的突变体 / 突变体总数)* 100

如果变异分数为 100%,则认为测试用例具有足够的变异性。研究和实验表明,变异技术是衡量测试用例充分性或适当性的有效方法。然而,突变测试的一个主要缺点是创建突变体和针对该突变体程序执行测试用例的成本很高。

突变测试的优势

  • 一种获得源程序高覆盖率的强大方法。

  • 全面测试突变程序的能力。

  • 良好的错误检测水平。

  • 检测源代码中的冗余和歧义,能够检测程序中的所有错误。

  • 提供最可靠、最稳定的系统。

突变测试的缺点

  • 由于必须生成大量突变程序,因此极其昂贵且耗时。

  • 由于其复杂性高,自动化工具是突变测试的必备工具。

  • 每个突变具有与原始程序相同数量的测试用例;因此,必须使用实际的测试套件来测试大量的变异程序。

  • 它涉及源代码更改,因此不能应用于黑盒测试。

突变测试的一个例子

考虑一个允许用户注册的医院网站。它收集各种信息,例如出生日期或年龄等。如果患者的年龄大于 15 岁,则会为他们指定一名医生作为他们的主要医生。为此,它启用了查找可用医生的“医师”功能。可能还有其他一些功能。10 岁以下的患者可能会被指派一名儿科医生,依此类推。但我们只考虑 15 岁以上的情况。代码可能看起来像 -

  • 阅读年龄。

  • 如果(年龄>15)

  • 医生 = Physician()

  • 万一。

请注意,代码特定于任何语言,因此不会运行。它只是一个伪代码。

我们的目标是检查 4 个值(14、15、0 和 5)的数据集是否足以发现此代码中的所有问题和冗余。

现在,突变测试如何实现这一点?首先,创建突变体——程序的变体。突变体只是一个编写为偏差的程序。它带有一个自种问题,例如,算术运算符替换、逻辑连接器替换、语句删除等。这些替换被称为变异运算符。

结论

执行详尽测试的最佳方法是通过变异测试——测试任何程序的最全面的方法。该技术检查程序的有效性和准确性,以检测系统中的故障或错误。

以上是 软件测试中的突变测试——突变评分和分析示例 的全部内容, 来源链接: utcz.com/z/359907.html

回到顶部