变异测试 java_编码的喜悦……以及Java中的变异测试

变异测试 java

多年以来,为源代码编写单元测试一直是一种好习惯。 并且还可以使用测试覆盖率报告来查看测试覆盖了多少代码。 尽管行+分支覆盖率报告非常有用,但是它并不能告诉您单元测试的实际效果。 因此,甚至在测试中没有一个断言的情况下,甚至有可能达到100%的覆盖率。

对更好的测试方法感兴趣,我参加了今年的“ 欢乐编码”会议中的“突变测试”研讨会。
变异测试是执行和分析单元测试的结果和覆盖范围的一种截然不同的方法。 无需测量单元测试“访问了”多少代码,而是确定单元测试实际上“测试了”多少代码。

那么它实际上是如何工作的

变异测试背后的基本思想是对(字节)代码进行微小的更改(变异),然后执行测试以查看是否被单元测试检测到。
可能的突变是将“ > ”更改为“ >= ”,将“ ++ ”替换为“ -- ”,并删除“ void ”方法调用。
因此,每个突变都会创建代码的变更版本,称为“突变”。

在进行实际的变异测试之前,首先需要对原始代码执行单元测试,以查看是否没有测试失败。

然后,将针对每个“突变体”运行单元测试(这可能非常耗时),看是否:

  • 我们的单元测试检测到该突变体:测试失败,因此“突变体”被视为“已杀死”。
  • 我们的单元测试没有注意到该突变体:测试没有“没有”失败(“突变体”被认为是“存活”)并且没有注意到突变; 这意味着单元测试实际上是“不”测试(未发现)“突变体”的。

变异测试的一个例子

那么,这种“变异测试”实际上是如何工作的呢?
请考虑以下方法:

public String foo(int i) {if ( i >= 0 ) {return "foo";} else {return "bar";}
}

单元测试仅包含一种测试方法这一事实:

@Test
public void testFoo() {testee.foo(0);
}

如果我们要创建代码的“突变体”,将“ >= ”更改为“ > ”,该怎么办?
我们希望我们的单元测试方法能够检测到这一点,对吧? 好吧,在这种情况下不是因为测试方法不包含单个断言。

我们将更改一个“ testFoo”方法以包含一个断言:

@Test
public void testFoo() {String result = testee.foo(0);assertEquals("foo", result);
}

现在,我们的单元测试方法将失败并检测(也称为“杀死”)“突变”代码。

除了将“ >= ”更改为“ > ”之外,还可以创建其他“突变体”:

  • 可以将第一个return方法更改为返回null (而不是"foo" );
    由于使用“ assertEquals”语句,此“突变体”被“ testFoo”方法“杀死”,但仍未被注意到原始的“ testFoo”方法(没有任何断言)。
  • 可以将第二个return方法更改为返回null (而不是"bar" );
    由于没有测试方法实际覆盖该执行路径,因此该“突变”将不会被注意到。

注意 :一些变异测试工具(例如Java的PIT)甚至不会费心为第二个return语句创建“变异”,因为它不会被单元测试所覆盖(如传统的行覆盖率所检测)。

等效突变导致假阳性

与传统的行+分支覆盖相比,突变覆盖可能会导致假阳性。
它可能“错误地”报告(假阳性)单元测试未检测到“突变”为“未”。

例如,考虑以下Java代码:

public int someNonVoidMethod() { return 0; }
public void foo() {int i = someNonVoidMethod();// do more stuff with i
}

在变异测试期间(使用具有某些“非”默认配置的PIT变异测试),可能会创建以下“变异”:

public int someNonVoidMethod() { return 0; }
public void foo() {int i = 0;// do more stuff with i
}

“ mutant”中的“ int i = 0 ”语句在功能上与“ someNonVoidMethod ”返回0的原始代码“等效”。
由于单元测试不会(也不应该)失败,因此无法检测到这种“等效突变”。
因此,它将被报告为未覆盖,而实际上它是一个假阳性。

根据文档 ,在使用PIT(一种用于Java的突变测试框架)时,“等效突变”应使用“默认”的一组突变体最小化。
例如,默认情况下会禁用导致“ int i = 0 ”等效突变的PIT的“非无效方法调用突变器”。

结论

在参加了研讨会,一些额外的调查并与PIT合作之后,我非常热衷于在不久的将来在当前项目中使用“变异测试”(从新组件开始)。
与传统的覆盖率报告相适应,变异测试覆盖率实际上可以衡量您的测试质量,不能像传统的覆盖率报告那样被愚弄。

如果您也有兴趣:

  • 请查看克里斯·里默(Chris Rimmer)的这个非常有趣的演示,它介绍了突变测试的基本概念。
  • 此外,还有一家名为TheLadders的公司使用PIT突变测试工具撰写了一篇有趣的文章 。
  • Filip van Laenen还写了一篇有关超载杂志第108版中的“变异测试”的详尽文章 。
  • 最后但并非最不重要的一点是PIT突变测试网站上的文档。

翻译自: https://www.javacodegeeks.com/2014/03/joy-of-coding-and-mutation-testing-in-java.html

变异测试 java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】国家开放大学2019年春季 1009离散数学(本) 参考试题

试卷代号:1009 2019年春季学期期末统一考试 离散数学(本)试题(半开卷) 2019年7月 一、单项选择题(每小题3分,本题共15分) 1.若集合A{1,2,3),则下列表述正确的…

光纤收发器的安装

光纤收发器分为单模光纤收发器和多模光纤收发器两种,同时根据光纤接头的不同,又可分为SC接头光纤收发器和ST接头光纤收发器。那么,光纤收发器安装和使用注意事项有哪些呢?接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#…

【渝粤教育】国家开放大学2019年春季 1158现代教育原理 参考试题

试卷代号:1158 2019年春季学期期末统一考试 现代教育原理试题 2019年7月 一、选择题(每小题只有一个正确答案,请选择正确的标号并填写在题后括号内。每小题5分,共30分) 1.教育活动的基本要素不包括( )。 A.教育者 B.受…

JSON和XML:它们如何比较?

JSON和XML:它们如何比较? JSON和XML是两种人类可读的文本格式,多年来已成为竞争对手。 XML的目的是通过可选使用模式来存储和定义文档和数据。 JSON几乎与之完全相反-序列化格式的要求非常简单,可以放在信用卡背面。 但是&#xf…

光纤收发器故障导致不能上网该如何解决?

光纤收发器的作用就是光信号和电信号之间的相互转换,其过程大概为:把电信号转换为光信号,通过光纤传送出去,在另一端再把光信号转化为电信号,再接入路由器、交换机等等设备。但是,光纤收发器在使用过程中难…

【渝粤教育】国家开放大学2019年春季 1332中文学科论文写作 参考试题

试卷代号:1332 中文学科论文写作 试题(开卷) 2019年7月 注意事项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试 结束后,把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考…

【渝粤教育】国家开放大学2019年春季 2110行政法与行政诉讼法 参考试题

试卷代号:21 10 行政法与行政诉讼法 试题 2019年7月 一、选择题(共20分) (一)单项选择题(每小题只有一项答案正确,请将正确答案的序号填在括号内。每小题1分,共10分) 1.行…

【渝粤教育】国家开放大学2019年春季 2507学前儿童艺术教育(音乐) 参考试题

试卷代号:2507 2 0 1 9年春季学期期末统一考试 学前儿童艺术教育(音乐) 试题 2019年7月 一、填空题(每空1分,共10分) 1.节奏的两个方面是拍子、。 2.音乐的句法因素是、和声、节奏。…

spring发邮件_跟踪异常–第4部分– Spring的邮件发件人

spring发邮件如果您阅读过本系列以前的任何博客,您可能会记得我正在开发一个小型但几乎具有工业实力的应用程序,该应用程序在日志文件中搜索异常。 您可能还记得,我现在有一个可以包含大量结果的类,这些结果需要发送给感兴趣的任何…

光纤收发器分发射和接收吗?光纤收发器配对使用问题详解!

光纤收发器是光口与电口之间的转换,是网口通过光纤来延伸的一种设备,光纤收发器作为光电转换设备一般是成对使用,但也可以出现光纤收发器与光纤交换机、光纤收发器与SFP收发器配对使用也是可以的,原则上只要光传输波长是一样的、信…

【渝粤教育】国家开放大学2019年春季 2773特种动物养殖 参考试题

试卷代号:2773 特种动物养殖试题 2019年7月 一、单项选择题(共15分,每题3分) 1.母兔有一对完全独立的子宫,属( )类型。 A.双角子宫 B.单子宫 C.双子宫 D.双分…

【渝粤教育】国家开放大学2019年春季 4有机合成单元反应 参考试题

科目编号:0004 座位号: 2018-2019学年度第二学期期末考试 有机合成单元反应试题 2019年7月 一、选择题(每小题3分,共45分) 1、分子结构中具有( )官能团的有机化合物,通常称之为羧酸。 A&…

光纤收发器元器件指标详情

在以太网光纤收发器设计中,元器件的选择举足轻重,它决定了产品的性能、寿命和成本。光电介质转换芯片(OEMC)是整个收发器的核心。选择介质转换芯片是以太网光纤收发器设计的第一步,也是非常重要的一步。它的选择直接影响和决定了其它元器件的…

【渝粤教育】国家开放大学2019年春季 771初级会计实务(二) 参考试题

科目编号:[0771] 座位号 2018-2019学年度第二学期期末考试 初级会计实务(二) 试题 2019年 7 月 一、单选题(本大题共10小题,每小题3分,共计30分) (★请考生务必将答案填入到下面对应…

【渝粤教育】电大中专电大中专计算机应用基础考试考核试题作业 题库

CAE是目前发展迅速的应用领域之一,其含义是( ) A.计算机辅助教育 B.计算机辅助制造 C.计算机辅助设计 D.计算机辅助工程 错误 正确答案:左边查询 学生答案:A 2.大规模和超大规模集成电路芯片组成的微型计算机属于现代计…

如何在网络中成对使用光纤收发器?

我们知道,传统以太网中非屏蔽双绞线的传输距离只能达到100米,而且很容易受到电磁干扰(EMI),导致网络性能不佳。以太网光纤收发器的出现有效地将传统以太网和现代光纤网络结合在一起,完美地解决了上述问题。那么,如何在…

职业综合英语 章节答案考试答案 深圳职业技术学院[渝粤教育]

教育 -职业综合英语-章节资料考试资料-深圳职业技术学院【】 Quiz 1、【判断题】 Google is the world’s most popular website. A、正确 B、错误 参考资料【 】 2、【判断题】Larry Page set up Google in January 1996 at Stanford. A、正确 B、错误 参考资料【 】 3、【判断…

junit:junit_JUnit ExpectedException规则:超越基础

junit:junitJUnit测试中有多种处理异常的方法。 正如我在以前的一篇文章中所写的那样 ,我最好的方法是使用org.junit.rules.ExpectedException规则。 基本上,规则是对org.junit.Before , org.junit.After , org.junit.BeforeClass…

什么是工业光纤收发器,工业收发器的作用是什么?

工业收发器是发射器和接收器的组合,两者共享公共电路。通常,收发器用于无线通信系统中。从历史上看,收发器用于将计算机连接到外围设备,例如打印机,键盘,调制解调器,操纵杆和鼠标。当前&#xf…

自动化测试在CI CD管道中的作用

业界广泛采用的软件开发实践:持续集成和持续部署可确保良好地交付产品并经常交付。 常规代码提交需要常规/连续测试,而如果忽略它,则可能导致基础架构无法恢复。 如何交付坚固的CI CD管道? 对于许多公司来说,这是一个问…