Java單測代碼生成工具之Evosuite

EvoSuite 是由 Sheffield 等大學聯合開發的一種開源工具,用於自動生成測試用例集,生成的測試用例均符合 Junit的標準,可直接在 Junit 中運行。
通過使用此自動測試工具能夠在保證代碼覆蓋率的前提下極大地提高測試人員的開發效率。但是隻能輔助測試,並不能完全取代人工,測試用例的正確與否還需人工判斷。
官網地址:https://www.evosuite.org/contact/
github地址:https://github.com/EvoSuite/evosuite

一 核心功能:
對於指定類,生成 Junit4 類型的單測代碼。------Generation of JUnit 4 tests for the selected classes
根據不同覆蓋指標調整生成的用例,例如 行覆蓋,分支覆蓋,輸出覆蓋等。------Optimization of different coverage criteria, like lines, branches, outputs and mutation testing
單測用例最小化,只有對覆蓋率有貢獻的單測用例纔會被保留。------Tests are minimized: only the ones contributing to achieve coverage are retained
生成的單測用例中包含 Junit 斷言。------Generation of JUnit asserts to capture the current behavior of the tested classes
測試運行在 sandbox 中。------Tests run in a sandbox to prevent potentially dangerous operations
虛擬文件系統。------Virtual file system
虛擬網絡。------Virtual network
二、使用
官方提供了包括命令行工具、eclipse 插件、idea 插件、maven 插件 在內的數種運行方式。
參考官方的 http://www.evosuite.org/documentation/tutorial-part-2/

2.1 命令行工具
命令行進入到 項目根目錄/target/classes/ 目錄下,輸入命令:

java -jar evosuite-1.0.6.jar -class ClassName -projectCP targetPath/。

參數說明:
-class :執行的對象
-projectCP:設置測試生成的類路徑
-help:要查看可用的命令行選項
-criterion :測試的標準參數有(line、branch、cbranch、mutation 、exception等)
-Dminimize=false //它會刪除所有不滿足覆蓋率目標所需的語句
-Dassertion_strategy=all //使用大量斷言生成長測試
更過參數請參考開發文檔:http://www.evosuite.org/documentation/tutorial-part-1/

2.2 maven 插件
調整 junit 版本(Junit4.12以上),並增加 evosuite 運行依賴

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.evosuite</groupId>
    <artifactId>evosuite-standalone-runtime</artifactId>
    <version>1.0.6</version>
    <scope>test</scope>
  </dependency>
</dependencies>
添加 evosuite 插件
<plugin>
   <groupId>org.evosuite.plugins</groupId>
   <artifactId>evosuite-maven-plugin</artifactId>
   <version>1.0.6</version>
</plugin>
有時候,我們會同時執行兩類腳本,一類是RD手寫的代碼,一類是EvoSuite自動生成的,進入同時測試並不會出現什麼大問題,但是也會對測試結果有片面的影響,因此需要只能EvoSuite僅對其生成的腳本起作用,需要在pom中加入如下插件。
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.20</version>
   <configuration>
     <properties>
       <property>
          <name>listener</name>
          <value>org.evosuite.runtime.InitializingListener</value>
      </property>
     </properties>
  </configuration>
</plugin> 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
執行命令生成單元測試代碼
注意:Evosuite 是基於編譯後的字節碼來生成單測代碼的,因此源代碼必須先進行編譯,然後才能使用evosuite.

示例1:
mvn evosuite:help -Ddetail=true -Dgoal=generate
示例2:
mvn evosuite:generate -Dcuts=com.isoftstone.pcis.service.impl.ApiServiceImpl 
#注意:當工程代碼量大時,生成花費的時間可能很長。
示例3:
mvn compile -DmemoryInMB=2000 -Dcores=2 -DtargetFolder=src/test/java/evosuite evosuite:generate evosuite:export test
注意:當工程代碼量大時,生成花費的時間可能很長。
1
2
3
4
5
6
7
8
可用參數和常用命令說明:
a. -DmemoryInMB=2000 表示使用 2000MB 的內存
b. -Dcores=2 表示用2個 cpu 來並行加快生成速度
c. -Dcuts=packageName.className 表示只針對指定類生成用例。多個用例可以用英文逗號分隔
d. -DtargetFolder=src/test/java/evosuite 表示生成的用例放到 src/test/java/evosuite 。
e. 常用命令
e1. prepare:需要同時運行EvoSuite測試和現有測試mvn evosuite:prepare test
e2. evosuite:generate 表示執行生成用例
e3. evosuite:export 表示導出用例到 targetFolder 的值所在的目錄中(默認值爲“ src / test / java”)
e4. evosuite:clean:刪除“ .evosuite”文件夾中的所有數據,該文件夾用於存儲到目前爲止生成的所有最佳測試
具體更多詳情可evosuite:help進行查看

執行完畢後,在 .evosuite 的目錄下會生成測試文件
針對一個類會生成兩份測試文件: _ESTest.java包含單測用例,_scaffolding.java 用例基類,用來在測試前初始化Evosuite的沙盒環境。
效果評估
a. 可以看到 Evosuite 會自動對 servce 依賴的其他對象進行 mock。
b. 針對被測方法的參數,根據參數類型會使用各種邊界值進行測試。使用 evoSuite 生成的單測代碼覆蓋率可以達到:方法覆蓋100%,行覆蓋51%。
c. 工具存在的不足之處: Mock 對象的方法調用只能返回空值 null 等, 沒有對方法進行特定的 stub ,因此正常的邏輯無法走到。EvoSuite 生成的單測用例更適用於測試邊界情況和異常情況。正常場景還是得靠人

2.3 eclipse 插件
EvoSuite 插件需要 Java 8 的運行環境,並且只支持 Eclipse 的 Lunar 和 Mars 版本,若系統中有多種 Java 開發環境,需將 Eclipse 的默認 jre 設置成 Java 8 版本。參考

插件安裝,並重啓Eclipse
插件參數設置
選中需要測試的類,右擊鼠標,選擇Generate tests with EvoSuite
Junit測試報告的生成

2.4 idea 插件
插件安裝,並重啓IDEA
選中需要測試的類,右擊鼠標,選擇Run EvoSuite
在參數輸入對話框中,設置參數並執行參考

三、其他類似擴展
商業工具:AgitarOne,Jtest對應zhihu
免費工具:CodePlex AnalytiX,EvoSuite,Randoop, JUnitGenerator V2.0(IDEA plugins)
————————————————
https://www.likecs.com/show-40143.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章