自動的自動化:智慧化測試框架EvoSuite的一個坑以及填坑方法
問題
最近在不斷地學習和探索EvoSuite框架的時候,在生產JUnit單元測試框架後,出現如下問題:
分析和修訂
所有的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行,如下:

和/Users/chancriss/Desktop/WorkSpace/JavaSpace/github/evosuite/runtime/src/main/java/org/evosuite/runtime/instrumentation/RuntimeInstrumentation.java下的144行到146行,如下:
可知,要避免這類問題的出現,並不是在對應的JUnit指令碼的父類中擴大org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationPerLoop的值,而是將其設定成為一個小於0的值。
由於測者並沒有完全掌握該框架,因此這種的修改到底會帶來什麼後果還沒有進一步的研究。