最近在不断地学习和探索EvoSuite框架的时候,在生产JUnit单元测试框架后,出现以下问题:html
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部分,有一个参数:java
org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationPerLoop=10000;
复制代码
上述报错就是由于这一项的设置形成的。那么该org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationPerLoop是干什么的呢?这里咱们就要进入EvoSuite的源代码里面看看了。git
通过源代码分析,在源代码中:github
evosuite/runtime/src/main/java/org/evosuite/runtime/LoopCounter.java
复制代码
发现其110行到123行部分可以抛出对应的异常,依据做者注释,该类就是为了不无限循环的出现而专门作的一个循环计数的类。经过源代码的异常抛出位置能够看出就是一位代码执行的循环次数超过了10000而抛出的异常,这么大次数的循环有多是mock的数据致使的,也有多是内部脚本逻辑异常致使的。apache
经过对应github项目的查找发现这不是一个fixed的issue。可是能够经过设置该参数避免该异常出现。 经过maxNumberOfIterationPerLoop出现的条件部分的判断: evosuite/runtime/src/main/java/org/evosuite/runtime/LoopCounter.java的96到98行,以下:bash
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的值。xss
因为测者并无彻底掌握该框架,所以这种的修改到底会带来什么后果尚未进一步的研究。oop