測定者のテスト技術マニュアル:インテリジェント化テストフレームEvoSuiteの穴と穴を埋める方法

3598 ワード

測定者のテスト技術マニュアル:インテリジェント化テストフレーム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行の部分に対応する異常が投げ出されることが分かったが,著者らの注釈によれば,このクラスは無限ループの出現を避けるために専門的に行われたループカウントのクラスである.ソースコードの異常放出位置から,1つのコードが実行するサイクル数が10000を超えて放出される異常であり,このような大きなサイクルはmockのデータによるものである可能性があり,内部スクリプトの論理異常によるものである可能性がある.

この問題を解決する


githubプロジェクトに対応する検索によりfixedのissueではないことが分かった.ただし、このパラメータを設定することで、この例外を回避できます.maxNum berOfIterationPerLoopに現れる条件部分の判断: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