天天看點

智能單測用例生成工具 Evosuite

前言

EvoSuite是由Sheffield等大學聯合開發的一種開源工具,用于自動生成測試用例集,生成的測試用例均符合Junit的标準,可直接在Junit中運作。得到了Google和Yourkit的支援。

使用

evosuite支援三種方式運作:本地jar包、maven插件、idea插件

本文說下maven插件的方式

配置方式

要使用EvoSuite,就要在Maven工程的pom.xml檔案中引入EvoSuite的插件如下(在 的子節點加入如

下内容):

<build>
    <plugins>
      <plugin>
        <groupId>org.evosuite.plugins</groupId>
        <artifactId>evosuite-maven-plugin</artifactId>
        <version>1.0.6</version>
      </plugin>
    </plugins>
  </build>
           

Maven自動的就會下載下傳EvoSuite的相關依賴,如果加入後,出現下載下傳依賴的錯誤,那麼需要加入EvoSuite的Maven Respository。

在settings檔案中和pom檔案中添加

<pluginRepositories>
  <pluginRepository>
    <id>EvoSuite</id>
    <name>EvoSuite Repository</name>
    <url>http://www.evosuite.org/m2</url>
  </pluginRepository>
</pluginRepositories>
           

完成後,通過如下指令進行一下evosuite的測試。

mvn evosuite:help
           

預期出現說明文檔,就是環境OK了。

可以開始生成單測腳本了

#最基本的指令
mvn evosuite:generate

#可以指定被測試的類
mvn evosuite:generate -Dcuts=***.java

#更多的參數
-DmemoryInMB=2000 		//表示使用 2000MB 的記憶體
-Dcores=2 				//表示用2個 cpu 來并行加快生成速度
-Dcuts=com.xxx.xxx.api.service.impl.CurriculumServiceImpl 	//表示隻針對 com.xxx.xxx.api.service.impl.CurriculumServiceImpl 這個類生成用例。多個用例可以用英文逗号分隔
-DtargetFolder=src/test/java/evosuite 						//表示生成的用例放到 src/test/java/evosuite
           

生成用例的時間有點長,給點耐心~

最終生成的用例會是這麼個結構

![image.png](https://img-blog.csdnimg.cn/img_convert/089fb63d839c6cf0aa28efe868a517cb.png#clientId=u66c63fb8-a112-4&from=paste&height=334&id=u67853d2e&margin=[object Object]&name=image.png&originHeight=668&originWidth=604&originalType=binary&ratio=2&size=242564&status=done&style=none&taskId=udaeee5fe-0785-4140-80d5-efb79b9acdb&width=302)

  • best-tests 測試腳本的最佳案例
  • evosuite-seeds 被測試類的分析結果(位元組碼增強的結果)
  • logs 生成用例過程中的日志
  • reports 每個被測試類的覆寫度報告
  • tests 生成的原始測試腳本
  • project_info.xml 整個項目/module的覆寫度報告

腳本整理和運作

Maven項目的JUnit的測試cases一般都是放在src/test/java下,但是EvoSuite生成實在.evosuite下,那麼通過如下指令就可以完成對應腳本的而移動了。

mvn evosuite:export

#
-DtargetFolder=src/test/evosuite  指定移動目錄
           

mvn test執行測試

要想通過 mvn test指令執行測試,還需要在pom的 内加入如下内容:

<dependency>
  <groupId>org.evosuite</groupId>
  <artifactId>evosuite-standalone-runtime</artifactId>
  <version>1.0.6</version>
  <scope>test</scope>
</dependency>
           

有時候,我們會同時執行兩類腳本,一類是RD手寫的代碼,一類是EvoSuite自動生成的,進入同時測試并不會出現什麼大問題,但是也會對測試結果有片面的影響,是以需要隻能EvoSuite僅對其生成的腳本起作用,需要在pom中加入如下插件。

<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>
           

總結(待完善)

  • 适用範圍
  • 生成腳本特點
  • 運作使用
  • 後續優化

踩坑記錄:

1、注意配置pom時,plugins和pluginManagement的差別,dependencies和dependencyManagement的差別。

2、evosuite是基于位元組碼檔案生成用例的,是以generate之前要先編譯一下。

3、生成測試用例的時候很占用cpu記憶體資源,是以别想着開多并發了,我開了4并發直接跪。