1. 程式人生 > >測者的測試技術手冊:自動化的自動化EvoSuite:Maven專案整合EvoSuite實戰

測者的測試技術手冊:自動化的自動化EvoSuite:Maven專案整合EvoSuite實戰

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

前期準備

本次所有內容的例子可以通過測者公眾號後臺,回覆evo_mvn關鍵字獲取下載地址

解壓到自己的工程目錄,在 Tutorial_Maven的示例目錄執行如下命令:

  1. mvn compile

完成compile後代碼中的classes的編譯位元組碼放到target/classes目錄下。在示例程式碼中 src/test/java目錄下是有一些測試cases,可以通過如下命令執行一下:

  1. mvn test

如果執行ok,那麼說明配置一切正常,就可以開始整合EvoSuite了。

  1. -------------------------------------------------------

  2. T E S T S

  3. -------------------------------------------------------

  4. Running tutorial.StackTest

  5. Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.094 sec

加入EvoSuite生成Junit的Cases

要使用EvoSuite,就要在Maven工程的pom.xml檔案中引入EvoSuite的外掛如下(在 <project>的子節點加入如下內容):

  1. <build>

  2.    <plugins>

  3.      <plugin>

  4.        <groupId>org.evosuite.plugins</groupId>

  5.        <artifactId>evosuite-maven-plugin</artifactId>

  6.        <version>1.0.6</version>

  7.      </plugin>

  8.    </plugins>

  9.  </build>

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

  1. <pluginRepositories>

  2.  <pluginRepository>

  3.    <id>EvoSuite</id>

  4.    <name>EvoSuite Repository</name>

  5.    <url>http://www.evosuite.org/m2</url>

  6.  </pluginRepository>

  7. </pluginRepositories>

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

  1. mvn evosuite:help

第一次使用EvoSuite外掛,Maven會下來和EvoSuite相關的所有依賴,下載完成後,出現如下相似資訊表示配置成功:

  1. [INFO] --- evosuite-maven-plugin:1.0.6:help (default-cli) @ Tutorial_Maven ---

  2. [INFO] Maven Plugin for EvoSuite 1.0.6

  3.  Plugin used to run EvoSuite to automatically generate high coverage JUnit

  4.  tests

  5.  This plugin has 7 goals:

  6.  evosuite:clean

  7.    Remove all local files created by EvoSuite so far

  8.  evosuite:coverage

  9.    Execute the manually written test suites (usually located under src/test/java)

  10.    and return the coverage of each class.

  11.  evosuite:export

  12.    When run, EvoSuite generate tests in a specific folder. New runs of EvoSuite

  13.    can exploit the tests in such folder, and/or modify them.

  14.    So, with 'export' we can copy all generated tests to a specific folder, which

  15.    by default points to where Maven searches for tests. If another folder is

  16.    rather used (or if we want to run with Maven the tests in the default EvoSuite

  17.    folder), then Maven plugins like build-helper-maven-plugin are needed

  18. evosuite:generate

  19.    Generate JUnit tests

  20. evosuite:help

  21.    Display help information on evosuite-maven-plugin.

  22.    Call mvn evosuite:help -Ddetail=true -Dgoal=<goal-name> to display parameter

  23.    details.

  24. evosuite:info

  25.    Obtain info of generated tests so far

  26. evosuite:prepare

  27.    Workaround mojo to overcome bug in Maven. Needed when EvoSuite tests are run

  28.    together with manual ones

  29. [INFO] ------------------------------------------------------------------------

  30. [INFO] BUILD SUCCESS

  31. [INFO] ------------------------------------------------------------------------

  32. [INFO] Total time: 1.489 s

  33. [INFO] Finished at: 2016-04-04T10:55:45+01:00

  34. [INFO] Final Memory: 9M/109M

  35. [INFO] ------------------------------------------------------------------------

配置完成後,執行如下命令生成測試程式碼和mock資料:

  1. mvn evosuite:generate

這有可能需要一段時間,如果電腦效能比較好,可以通過引數設定多併發的generate:

  1. mvn -Dcores=4 evosuite:generate

完成後,可以看到生成了一個.evosuite的目錄,裡面的best-test就是你需要的程式碼了。可以通過如下的命令,檢視一下generate指令碼的資訊怎麼樣:

  1. mvn evosuite:info

返回資訊如下:

  1. As we have just invoked EvoSuite on 4 classes, you should get an output like this:

  2. [INFO] --- evosuite-maven-plugin:1.0.6:info (default-cli) @ Tutorial_Maven ---

  3. [INFO] Going to query EvoSuite info on current project

  4. [INFO] * EvoSuite 1.0.6

  5. [INFO] Total number of classes in the project: 4

  6. [INFO] Number of classes in the project that are testable: 4

  7. [INFO] Number of generated test suites: 4

  8. [INFO] Overall coverage: 0.99

  9. [INFO] ------------------------------------------------------------------------

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

  1. mvn evosuite:export

mvn test執行測試

要想通過 mvn test命令執行測試,還需要在pom的 <dependencies></dependencies>內加入如下內容:

  1. <dependency>

  2.  <groupId>org.evosuite</groupId>

  3.  <artifactId>evosuite-standalone-runtime</artifactId>

  4.  <version>1.0.6</version>

  5.  <scope>test</scope>

  6. </dependency>

EvoSuite的指令碼和RD的指令碼分開存放

通過如下命令可以制定指令碼的移動位置

  1. mvn evosuite:export -DtargetFolder=src/test/evosuite

或者,通過新增properites制定移動位置

src/test/evosuite

若果在專案中配置了指令碼的移動目錄,要再次使用mvn test就會報錯,因此需要顯示指出測試指令碼的位置:

  1. <plugin>

  2.    <groupId>org.codehaus.mojo</groupId>

  3.    <artifactId>build-helper-maven-plugin</artifactId>

  4.    <version>1.8</version>

  5.   <executions>

  6.     <execution>

  7.       <id>add-test-source</id>

  8.       <phase>generate-test-sources</phase>

  9.       <goals>

  10.         <goal>add-test-source</goal>

  11.       </goals>

  12.       <configuration>

  13.          <sources>

  14.            <source>${targetFolder}</source>

  15.          </sources>

  16.       </configuration>

  17.    </execution>

  18.  </executions>

  19. </plugin>

RD的Junit指令碼和EvoSuite的指令碼同時執

有時候,我們會同時執行兩類指令碼,一類是RD手寫的程式碼,一類是EvoSuite自動生成的,進入同時測試並不會出現什麼大問題,但是也會對測試結果有片面的影響,因此需要只能EvoSuite僅對其生成的指令碼起作用,需要在pom中加入如下外掛。

  1. <plugin>

  2.   <groupId>org.apache.maven.plugins</groupId>

  3.   <artifactId>maven-surefire-plugin</artifactId>

  4.   <version>2.17</version>

  5.   <configuration>

  6.     <properties>

  7.       <property>

  8.          <name>listener</name>

  9.          <value>org.evosuite.runtime.InitializingListener</value>

  10.      </property>

  11.     </properties>

  12.  </configuration>

  13. </plugin>

關注測者,關注測試