【原創】單測代碼生成工具Evosuite試用


工具簡介

Evosuite是國外大學機構主導開發的一款開源的Java單測代碼生成工具,在數次SBST Unit Testing Tool Competition中評測獲得最高分。官網地址:http://www.evosuite.org/

Evosuite的主要特性(翻譯自官網):

1.對於指定類,生成Junit4類型的單測代碼。

2.根據不同覆蓋指標調整生成的用例,例如 行覆蓋,分支覆蓋,輸出覆蓋等。

3.單測用例最小化,只有對覆蓋率有貢獻的單測用例才會被保留。

4.生成的單測用例中包含Junit斷言。

5.測試運行在sandbox中。

6.虛擬文件系統。

7.虛擬網絡。

工具安裝方法

工具支持4種方式,包括:1.命令行,2.Eclipst plugin,3.Idea plugin,4.Maven plugin。因為我們工程都是maven工程,因此使用Maven plugin方式介紹。(其他詳細用法可參考官網)

1.首先確保項目中有Junit,推薦Junit4.12以上

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>

2.在pom.xml中添加下面三段(前兩段必須,第三段可選)。 第一段里 evosuite-standalone-runtime.jar是跑單測代碼時需要用到的Evosuie運行時環境。第二段 maven plugin用來生成單測代碼。第三段是evosuite統計單測覆蓋率的plugin。

<dependency>
  <groupId>org.evosuite</groupId>
  <artifactId>evosuite-standalone-runtime</artifactId>
  <version>${evosuiteVersion}</version>
  <scope>test</scope>
</dependency>
-------------------------------------------------------
<pluginManagement>
<plugins>
   <plugin>
      <groupId>org.evosuite.plugins</groupId>
      <artifactId>evosuite-maven-plugin</artifactId>
      <version>1.0.6</version>
      <executions><execution>
         <goals> <goal> prepare </goal> </goals>
         <phase> process-test-classes </phase>
      </execution></executions>
  </plugin>
</plugins>
</pluginManagement>
-----------------------------------------------------
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.17</version>
   <configuration>
     <properties>
       <property>
          <name>listener</name>
          <value>org.evosuite.runtime.InitializingListener</value>
      </property>
     </properties>
  </configuration>
</plugin>


工具使用方法

Evosuite maven plugin主要包括以下用法:1.generate用來生成單測代碼,生成后的單測代碼在.evosuite目錄下;2.export用來把.evosuite中的單測代碼移到指定文件夾下,
默認目標路徑是src/test/java,指定路徑時使用-DtargetFolder參數;3.info用來顯示生成的單測代碼信息;4.clean用來清除.evosuite目錄下的單測代碼;

示例1:mvn evosuite:help -Ddetail=true -Dgoal=generate 顯示generate的詳細用法,支持的參數。
示例2:mvn evosuite:generate -Dcuts=com.ucenter.users.service.impl.ApiServiceImpl  只針對對ApiServiceImpl生成單測用例。注意:Evosuite基於字節碼來生成單測代碼,因此源代碼必須先編譯后,才能使用evosuite.
示例3:mvn -DmemoryInMB=2000 -Dcores=2 evosuite:generate evosuite:export  test,終極用法,編譯-》會針對所有類生成單測用例並導出到src/test/java下-》運行單測,-DmemoryInMB=2000表示試用2000MB的內存,-Dcores=2表示用2個cpu來並行加快生成速度。

注意:當工程代碼量大時,生成花費的時間可能很長。

工具效果評估

使用業務工程中server層一個service類ApiServiceImpl進行試用,會生成兩份文件,ApiServiceImpl_ESTest.java包含單測用例,ApiServiceImpl_ESTest_scaffolding.java 用例基類,用來在測試前初始化Evosuite的沙盒環境。

1.可以看到Evosuite會自動對servce依賴的其他對象進行mock。
2.針對被測方法的參數,根據參數類型會使用各種邊界值進行測試。使用evoSuite生成的單測代碼覆蓋率可以達到:方法覆蓋100%,行覆蓋51%。
3.工具存在的不足之處是,Mock對象的方法調用只能返回空值null值等, 沒有對方法進行特定的stub,因此正常的邏輯無法走到。EvoSuite生成的單測用例更適用於測試邊界情況和異常情況。作為測試邊界和異常情況時,使用Evosuite是可以省不少力的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM