当前位置: 首页 > news >正文

测者的测试技术手册:智能化测试框架EvoSuite的一个坑以及填坑方法

测者的测试技术手册:智能化测试框架EvoSuite的一个坑以及填坑方法

问题

最近在不断地学习和探索EvoSuite框架的时候,在生产JUnit单元测试框架后,出现如下问题:

Exception:
Caused by: org.evosuite.runtime.TooManyResourcesException: Loop has been executed more times than the allowed 10000
at org.evosuite.runtime.LoopCounter.checkLoop(LoopCounter.java:115)
at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)
at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
at org.apache.xerces.impl.XMLEntityScanner.skipSpaces(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
at org.apache.poi.util.DocumentHelper.readDocument(DocumentHelper.java:137)
at org.apache.poi.POIXMLTypeLoader.parse(POIXMLTypeLoader.java:115)
at org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument$Factory.parse(Unknown Source)
at org.apache.poi.xssf.model.StylesTable.readFrom(StylesTable.java:203)
at org.apache.poi.xssf.model.StylesTable.(StylesTable.java:146)
复制代码

分析和修订

所有的EvoSuite生成的单元测试class都继承自一个同名的scaffolding的类,在对应的脚手架后缀名的类中的@BeforeClass部分,有一个参数:

org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationPerLoop=10000;
复制代码

上述报错就是因为这一项的设置造成的。那么该org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationPerLoop是干什么的呢?这里我们就要进入EvoSuite的源代码里面看看了。

经过源代码分析,在源代码中:

evosuite/runtime/src/main/java/org/evosuite/runtime/LoopCounter.java
复制代码

发现其110行到123行部分能够抛出对应的异常,依据作者注释,该类就是为了避免无限循环的出现而专门做的一个循环计数的类。通过源代码的异常抛出位置可以看出就是一位代码执行的循环次数超过了10000而抛出的异常,这么大次数的循环有可能是mock的数据导致的,也有可能是内部脚本逻辑异常导致的。

解决该问题

通过对应github项目的查找发现这不是一个fixed的issue。但是可以通过设置该参数避免该异常出现。 通过maxNumberOfIterationPerLoop出现的条件部分的判断: evosuite/runtime/src/main/java/org/evosuite/runtime/LoopCounter.java的96到98行,如下:

 if(RuntimeSettings.maxNumberOfIterationsPerLoop < 0){
            return; //do nothing, no check
        }
复制代码

和/Users/chancriss/Desktop/WorkSpace/JavaSpace/github/evosuite/runtime/src/main/java/org/evosuite/runtime/instrumentation/RuntimeInstrumentation.java下的144行到146行,如下:

	if (RuntimeSettings.maxNumberOfIterationsPerLoop >= 0) {
			cv = new LoopCounterClassAdapter(cv);
		}
复制代码

可知,要避免这类问题的出现,并不是在对应的JUnit脚本的父类中扩大org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationPerLoop的值,而是将其设置成为一个小于0的值。

由于测者并没有完全掌握该框架,因此这种的修改到底会带来什么后果还没有进一步的研究。

关注测者,关注测试



转载于:https://juejin.im/post/5c1c42836fb9a049d1321a81

相关文章:

  • cookie和session
  • Android EditText控件自动转换大小写,光标位置不跳位
  • Android aidl Binder框架浅析
  • 4.8_获取页面元素的内容_getTable
  • java框架学习日志-10(自定义类实现AOP)
  • 说一说飞机上的无线上网
  • C#中的线程池使用(一)
  • android实现图片识别的几种方法
  • 12月24日云栖精选夜读 | 刚刚,阿里开源首个深度学习框架 X-Deep Learning!
  • 微信智能开放平台
  • SqlServer如何获取存储过程的返回值
  • MyEclipse2014配置Tomcat开发JavaWeb程序JSP以及Servlet http://my.csdn.net/21aspnet/message CSDN Five...
  • 梯度下降
  • ES7 ES8 的新特性(部分)
  • Android程序完全退出
  • (三)从jvm层面了解线程的启动和停止
  • __proto__ 和 prototype的关系
  • Flex布局到底解决了什么问题
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JDK 6和JDK 7中的substring()方法
  • LeetCode18.四数之和 JavaScript
  • spring-boot List转Page
  • v-if和v-for连用出现的问题
  • Vim Clutch | 面向脚踏板编程……
  • 欢迎参加第二届中国游戏开发者大会
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 那些年我们用过的显示性能指标
  • 前端
  • 前嗅ForeSpider教程:创建模板
  • 王永庆:技术创新改变教育未来
  • 责任链模式的两种实现
  • 如何正确理解,内页权重高于首页?
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #LLM入门|Prompt#3.3_存储_Memory
  • #WEB前端(HTML属性)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (4)logging(日志模块)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (zt)最盛行的警世狂言(爆笑)
  • (搬运以学习)flask 上下文的实现
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (四)汇编语言——简单程序
  • (算法设计与分析)第一章算法概述-习题
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)编辑寄语:因为爱心,所以美丽
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .net CHARTING图表控件下载地址
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net的C#语言取月份数值对应的MonthName值
  • /bin、/sbin、/usr/bin、/usr/sbin