变异测试

简介: 变异测试

变异测试1970年被一个学生DickLipton提出,首次发现和公之于众。变异测试最初是为了定位揭示测试单元的弱点。这个理论是:如果一个边缘被引入,同时出现的行为(通常是输出)不受影响的情况下,那么这说明了:变异代码从没有被执行过(产生了过剩代码)或者测试单元无法定位错误。


1基本概念


变异测试是指如果代码中,对一个小的操作进行一点改动(比如“+”改为“-”),测试用例在完整的情况下就可以发现程序被改动,而报错。首先我们来了解下等价变体的概念。


源代码如下:

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


变体1如下:

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


变体2如下:

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


由此可见变体1与源代码是等价的:i0开始,经历2,3,4,5,6,7,8,910,在源代码中由于10<10返回False,退出循环;在变体1中由于10!=10返回False,退出循环。而变体2与源代码是非等价的:i0开始,经历-1-2-3…永远达不到i<10False的情形。


2 6个概念


在变异测试中需要关注以下六点


1)变异算子


1987年,针对Fortran 77语言定义了22个变异算子,而在下面我们介绍的Mutpy中定义了以下27个变异体。

  1. AOD - arithmetic operatordeletion(删除算术运算符)
  2. AOR - arithmetic operatorreplacement(替换算术运算符)
  3. ASR - assignment operatorreplacement(替换赋值运算符)
  4. BCR - break continuereplacement(交换breakcontinue语句)
  5. COD - conditional operatordeletion(删除条件运算符)
  6. COI - conditional operatorinsertion(插入条件运算符)
  7. CRP - constant replacement(替换常量)
  8. DDL - decorator deletion(替换修饰符)
  9. EHD - exception handlerdeletion(删除异常处理)
  10. EXS - exception swallowing(吞咽异常)
  11. IHD - hiding variable deletion(删除隐藏变量)
  12. IOD - overriding methoddeletion(删除覆盖方法)
  13. IOP - overridden method callingposition change(重写调用位置更改的方法)
  14. LCR - logical connectorreplacement(更换逻辑连接器)
  15. LOD - logical operator deletion(删除逻辑运算符)
  16. LOR - logical operatorreplacement(替换逻辑运算符)
  17. ROR - relational operatorreplacement(替换关系运算符)
  18. SCD - super calling deletion(删除超级调用)
  19. SCI - super calling insert(插入超级调用)
  20. SIR - slice index remove(移除切片索引)
  21. CDI – class method decoratorinsertion(插入类方法装饰器)
  22. OIL - one iteration loop(一个迭代循环)
  23. RIL - reverse iteration loop(反向迭代循环)
  24. SDI – static method decoratorinsertion(插入静态方法装饰器)
  25. SDL - statement deletion(删除语句)
  26. SVD - self variable deletion(删除自变量)
  27. ZIL - zero iteration loop(零迭代循环)


2)一阶变异体


3)高阶变异体


看下面代码

[A] z = x * y

[B] z = x / y

[C] z = x/y*2

[D] z =4x/y*2

BA的一阶变异,CB的一阶变异,DA的高阶变异


4)可删除变异体


如果测试用例测试源代码和测试编译代码不一致,则这个测试用例可以删除


5)可存活变异体


如果测试用例测试源代码和测试编译代码不一致,则这个测试用例不可以删除


6)等价变异体


变异体与源代码语法不同,语义相同,则为等价变异体


3 测试方法


image.png


如果这个过程中,有减分,说明测试用例不完善或者出现重复的测试用例。


3. 工具


在变异测试中Java常用的工具为PITestPython常用的工具为Mutpy,现在我们来学习一下Mutpy


1)安装


在线安装

#pip install mutpy


离线安装

#git clone  git@github.com:mutpy/mutpy.git

#cd mutpy/

#python setup.py install


2)被测程序:calculator.py

def mul(x, y):
    return x * y


3)测试程序:test_calculator.py

from unittestimport TestCase
from calculatorimport mul
classCalculatorTest(TestCase):
    def test_mul(self):
        self.assertEqual(mul(2, 2), 4)


4)运行


root@ubuntu:/home/jerry/muttest#  mut.py --target calculator --unit-test test_calculator -m

[*] Start mutation process:

   - targets: calculator

   - tests: test_calculator

[*] 1 tests passed:

   - test_calculator [0.00040 s]

[*] Start mutants generation and  execution:

   - [#    1] AOR calculator:

--------------------------------------------------------------------------------

   1: def mul(x, y):

- 2:     return x * y

+ 2:     return x / y

--------------------------------------------------------------------------------

[0.01345 s] killed by test_mul  (test_calculator.CalculatorTest)

   - [#    2] AOR calculator:

--------------------------------------------------------------------------------

   1: def mul(x, y):

- 2:     return x * y

+ 2:     return x // y

--------------------------------------------------------------------------------

[0.01476 s] killed by test_mul  (test_calculator.CalculatorTest)

   - [#    3] AOR calculator:

--------------------------------------------------------------------------------

   1: def mul(x, y):

- 2:     return x * y

+ 2:     return x ** y

--------------------------------------------------------------------------------

[0.01048 s] survived

[*] Mutation score [0.11673 s]: 66.7%

   - all: 3

   - killed: 2 (66.7%)

   - survived: 1 (33.3%)

   - incompetent: 0 (0.0%)

   - timeout: 0 (0.0%)

You have new mail in  /var/mail/root

 


注:我在Win10下测试没有成功,在Linux下测试成功。


各位可以看到3个变异,存活了1个,杀死了22个,最后得分为66.7%。分析一下原因。


这里对于x * y3个变异,分别为x / y ,x // yx ** y

在测试用例中x=2y=2 ,测试结果为4 返回 True

在变异x / y,测试结果为1 返回 False

在变异x // y,测试结果为1 返回 False

在变异x ** y,测试结果为2 返回 True

所以当x=2y=2变异x ** y是与源代码等价的。我们修改一下测试代码。

test_calculator.py

from unittestimport TestCase
from calculatorimport mul
classCalculatorTest(TestCase):
    def test_mul(self):
        self.assertEqual(mul(2, 3), 6)


分析一下:

源代码:2 * 3 = 6,返回True

对于x / y2/3!= 6False

对于x // y2//3 =0!= 6False

对于x ** y2**3=8!= 6False

所以三个都被杀死了,得分为100%

运行一下。


root@ubuntu:/home/jerry/muttest#  mut.py --target calculator --unit-test test_calculator -m

[*] Start mutation  process:

   - targets: calculator

   - tests: test_calculator

[*] 1 tests passed:

   - test_calculator [0.00050 s]

[*] Start mutants  generation and execution:

   - [#    1] AOR calculator:

--------------------------------------------------------------------------------

  1: def mul(x, y):

- 2:     return x * y

+ 2:     return x / y

--------------------------------------------------------------------------------

[0.05670 s] killed by  test_mul (test_calculator.CalculatorTest)

   - [#    2] AOR calculator:

--------------------------------------------------------------------------------

  1: def mul(x, y):

- 2:     return x * y

+ 2:     return x // y

--------------------------------------------------------------------------------

[0.03214 s] killed by  test_mul (test_calculator.CalculatorTest)

   -  [#   3] AOR calculator:

--------------------------------------------------------------------------------

  1: def mul(x, y):

- 2:     return x * y

+ 2:     return x ** y

--------------------------------------------------------------------------------

[0.04315 s] killed by  test_mul (test_calculator.CalculatorTest)

[*] Mutation score  [0.20079 s]: 100.0%

   - all: 3

   - killed: 3 (100.0%)

   - survived: 0 (0.0%)

   - incompetent: 0 (0.0%)

   - timeout: 0 (0.0%)


得分果然是100%

目录
相关文章
|
机器学习/深度学习 算法 测试技术
【网安专题10.25】10 TitanFuzz完全自动化执行基于变异的模糊测试:生成式(如Codex)生成种子程序,逐步提示工程+第一个应用LLM填充模型(如InCoder)+差分测试
【网安专题10.25】10 TitanFuzz完全自动化执行基于变异的模糊测试:生成式(如Codex)生成种子程序,逐步提示工程+第一个应用LLM填充模型(如InCoder)+差分测试
452 0
|
4月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
751 23
|
9月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
6月前
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
721 24
|
6月前
|
SQL 测试技术
除了postman还有什么接口测试工具
最好还是使用国内的接口测试软件,其实国内替换postman的软件有很多,这里我推荐使用yunedit-post这款接口测试工具来代替postman,因为它除了接口测试功能外,在动态参数的支持、后置处理执行sql语句等支持方面做得比较好。而且还有接口分享功能,可以生成接口文档给团队在线浏览。
243 2
|
8月前
|
JSON 前端开发 测试技术
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
355 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
|
8月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
349 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
7月前
|
存储 JSON API
Python测试淘宝店铺所有商品接口的详细指南
本文详细介绍如何使用Python测试淘宝店铺商品接口,涵盖环境搭建、API接入、签名生成、请求发送、数据解析与存储、异常处理等步骤。通过具体代码示例,帮助开发者轻松获取和分析淘宝店铺商品数据,适用于电商运营、市场分析等场景。遵守法规、注意调用频率限制及数据安全,确保应用的稳定性和合法性。
|
7月前
|
监控 API 开发工具
Socket.IO介绍,以及怎么连接测试Socket.IO接口?
Socket.IO 是一个用于浏览器和服务器间实时双向通信的库,支持低延迟消息传递、跨平台运行及自动重连。文章介绍了其特点与调试需求,并详细说明如何使用 Apifox 工具创建、连接、发送/接收 Socket.IO 事件,以及团队协作和调试技巧。掌握这些技能可提升实时应用开发效率与质量。
|
8月前
|
小程序 测试技术 数据安全/隐私保护
微信公众号接口测试实战指南
微信公众号接口测试是确保系统稳定性和功能完整性的重要环节。本文详细介绍了测试全流程,包括准备、工具选择(如Postman、JMeter)、用例设计与执行,以及常见问题的解决方法。通过全面测试,可以提前发现潜在问题,优化用户体验,确保公众号上线后稳定运行。内容涵盖基础接口、高级接口、微信支付和数据统计接口的测试,强调了功能验证、性能优化、安全保护及用户体验的重要性。未来,随着微信生态的发展,接口测试将面临更多挑战和机遇,如小程序融合、AI应用和国际化拓展。