測者的測試技術手冊:自動化的自動化EvoSuite:Maven專案整合EvoSuite實戰
EvoSuite是由Sheffield等大學聯合開發的一種開源工具,用於自動生成測試用例集,生成的測試用例均符合Junit的標準,可直接在Junit中執行。得到了Google和Yourkit的支援。
前期準備
本次所有內容的例子可以通過測者公眾號後臺,回覆evo_mvn關鍵字獲取下載地址
解壓到自己的工程目錄,在 Tutorial_Maven
的示例目錄執行如下命令:
-
mvn compile
完成compile後代碼中的classes的編譯位元組碼放到target/classes目錄下。在示例程式碼中 src/test/java目錄下是有一些測試cases,可以通過如下命令執行一下:
-
mvn test
如果執行ok,那麼說明配置一切正常,就可以開始整合EvoSuite了。
-
-------------------------------------------------------
-
T E S T S
-
-------------------------------------------------------
-
Running tutorial.StackTest
-
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.094 sec
加入EvoSuite生成Junit的Cases
要使用EvoSuite,就要在Maven工程的pom.xml檔案中引入EvoSuite的外掛如下(在 <project>
的子節點加入如下內容):
-
<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。
-
<pluginRepositories>
-
<pluginRepository>
-
<id>EvoSuite</id>
-
<name>EvoSuite Repository</name>
-
<url>http://www.evosuite.org/m2</url>
-
</pluginRepository>
-
</pluginRepositories>
完成後,通過如下命令進行一下evosuite的測試。
-
mvn evosuite:help
第一次使用EvoSuite外掛,Maven會下來和EvoSuite相關的所有依賴,下載完成後,出現如下相似資訊表示配置成功:
-
[INFO] --- evosuite-maven-plugin:1.0.6:help (default-cli) @ Tutorial_Maven ---
-
[INFO] Maven Plugin for EvoSuite 1.0.6
-
Plugin used to run EvoSuite to automatically generate high coverage JUnit
-
tests
-
This plugin has 7 goals:
-
evosuite:clean
-
Remove all local files created by EvoSuite so far
-
evosuite:coverage
-
Execute the manually written test suites (usually located under src/test/java)
-
and return the coverage of each class.
-
evosuite:export
-
When run, EvoSuite generate tests in a specific folder. New runs of EvoSuite
-
can exploit the tests in such folder, and/or modify them.
-
So, with 'export' we can copy all generated tests to a specific folder, which
-
by default points to where Maven searches for tests. If another folder is
-
rather used (or if we want to run with Maven the tests in the default EvoSuite
-
folder), then Maven plugins like build-helper-maven-plugin are needed
-
evosuite:generate
-
Generate JUnit tests
-
evosuite:help
-
Display help information on evosuite-maven-plugin.
-
Call mvn evosuite:help -Ddetail=true -Dgoal=<goal-name> to display parameter
-
details.
-
evosuite:info
-
Obtain info of generated tests so far
-
evosuite:prepare
-
Workaround mojo to overcome bug in Maven. Needed when EvoSuite tests are run
-
together with manual ones
-
[INFO] ------------------------------------------------------------------------
-
[INFO] BUILD SUCCESS
-
[INFO] ------------------------------------------------------------------------
-
[INFO] Total time: 1.489 s
-
[INFO] Finished at: 2016-04-04T10:55:45+01:00
-
[INFO] Final Memory: 9M/109M
-
[INFO] ------------------------------------------------------------------------
配置完成後,執行如下命令生成測試程式碼和mock資料:
-
mvn evosuite:generate
這有可能需要一段時間,如果電腦效能比較好,可以通過引數設定多併發的generate:
-
mvn -Dcores=4 evosuite:generate
完成後,可以看到生成了一個.evosuite的目錄,裡面的best-test就是你需要的程式碼了。可以通過如下的命令,檢視一下generate指令碼的資訊怎麼樣:
-
mvn evosuite:info
返回資訊如下:
-
As we have just invoked EvoSuite on 4 classes, you should get an output like this:
-
[INFO] --- evosuite-maven-plugin:1.0.6:info (default-cli) @ Tutorial_Maven ---
-
[INFO] Going to query EvoSuite info on current project
-
[INFO] * EvoSuite 1.0.6
-
[INFO] Total number of classes in the project: 4
-
[INFO] Number of classes in the project that are testable: 4
-
[INFO] Number of generated test suites: 4
-
[INFO] Overall coverage: 0.99
-
[INFO] ------------------------------------------------------------------------
Maven專案的JUnit的測試cases一般都是放在src/test/java下,但是EvoSuite生成實在.evosuite下,那麼通過如下命令就可以完成對應指令碼的而移動了。
-
mvn evosuite:export
mvn test執行測試
要想通過 mvn test
命令執行測試,還需要在pom的 <dependencies></dependencies>
內加入如下內容:
-
<dependency>
-
<groupId>org.evosuite</groupId>
-
<artifactId>evosuite-standalone-runtime</artifactId>
-
<version>1.0.6</version>
-
<scope>test</scope>
-
</dependency>
EvoSuite的指令碼和RD的指令碼分開存放
通過如下命令可以制定指令碼的移動位置
-
mvn evosuite:export -DtargetFolder=src/test/evosuite
或者,通過新增properites制定移動位置
src/test/evosuite
若果在專案中配置了指令碼的移動目錄,要再次使用mvn test就會報錯,因此需要顯示指出測試指令碼的位置:
-
<plugin>
-
<groupId>org.codehaus.mojo</groupId>
-
<artifactId>build-helper-maven-plugin</artifactId>
-
<version>1.8</version>
-
<executions>
-
<execution>
-
<id>add-test-source</id>
-
<phase>generate-test-sources</phase>
-
<goals>
-
<goal>add-test-source</goal>
-
</goals>
-
<configuration>
-
<sources>
-
<source>${targetFolder}</source>
-
</sources>
-
</configuration>
-
</execution>
-
</executions>
-
</plugin>
RD的Junit指令碼和EvoSuite的指令碼同時執
有時候,我們會同時執行兩類指令碼,一類是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>