目录
介绍
配置和使用
引入Evosuite
可能的问题
查看Evosuite各个goal的详细信息
生成EvoSuite Test
查看产生了哪些信息
整和测试文件
运行EvoSuite Test
扩展
把EvoSuite Test和程序员写的Test分开
把EvoSuite Test和程序员写的Test一起运行
介绍
EvoSuite是由Sheffield(谢菲尔德)等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行。得到了Google和Yourkit的支持。
官网: https://www.evosuite.org/
GitHub: https://github.com/EvoSuite
配置和使用
Maven项目集成EvoSuite时,需要当前项目中已经引入Junit,因为EvoSuite是用来生成Junit文件,因此需要引入Junit的依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
引入Evosuite
修改项目的pom.xml文件,在<build>节点中引入EvoSuite的插件:
<build>
<plugins>
<plugin>
<groupId>org.evosuite.plugins</groupId>
<artifactId>evosuite-maven-plugin</artifactId>
<version>1.0.6</version>
</plugin>
</plugins>
</build>
运行下面的命令,执行Evosuite 插件的名为 help 的goal,第一次执行时,会去中央仓库下载EvoSuite和它的依赖,可能会等一会儿:
mvn evosuite:help
如果下载成功的话,可以看到下面的信息:
[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
Mojo needed to prepare the EvoSuite tests for execution. This is needed to
make sure that bytecode is properly instrumented.
可能的问题
如果你的中央仓库没有EvoSuite的包,可以引入EvoSuite的 Maven仓库来解决依赖问题,修改pom.xml文件,添加如下信息:
<pluginRepositories>
<pluginRepository>
<id>EvoSuite</id>
<name>EvoSuite Repository</name>
<url>http://www.evosuite.org/m2</url>
</pluginRepository>
</pluginRepositories>
扩展:
阿里云Maven中央仓库中也是有EvoSuite的,访问下面的链接,也可以使用它作为中央仓库:
阿里云Maven中央仓库:https://developer.aliyun.com/mvn/guide
查看Evosuite各个goal的详细信息
例如,获取更多关于generate goal的详细信息,可以执行下面的命令:
mvn evosuite:help -Ddetail=true -Dgoal=generate
运行成功的话,可以看到一系列的属性,用来设置generate plugin goal。
生成EvoSuite Test
执行下面的命令,生成Unit test,花费时间较长:
mvn evosuite:generatemvn evosuite:generate
如果你的机器很强大,多核,为了节省时间,可以并行执行EvoSuite jobs。
例如,为了运行4个 EvoSuite jobs ,你可以添加 -Dcores=4 在evosuite:generate 命令中:
mvn -Dcores=4 evosuite:generate
该命令,为每一个类都产生了一个 test suite。
默认情况下会在模块目录下生成一个隐藏文件夹 .evosuite,产生的test在 .evosuite/best-tests 下。
一半是 test suites,一半是scaffolding files。
查看产生了哪些信息
执行下面的命令:
mvn evosuite:info
类似这样的信息:
[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.98625
....
整和测试文件
如果你对生成的test很满意,你可以整和它们到source tree里。默认情况下,Maven项目中,Junit Test是放在 src/test/java 下的,Evosuite也是将 test suites放在这个路径,可以通过下面的命令完成:
mvn evosuite:export
执行成功后,那些 test suites就被copy到src/test/java 下了。
运行EvoSuite Test
可以直接运行下面的命令:
mvn test
你会发现在test 中有很多编译错误:package org.evosuite.runtime does not exist.。
因为EvoSuite测试依赖于EvoSuite运行时库,因为它们使用字节码执行容器(bytecode instrumentation)和其他各种方法来避免脆弱的测试。
引入运行时库:
<dependency>
<groupId>org.evosuite</groupId>
<artifactId>evosuite-standalone-runtime</artifactId>
<version>1.0.6</version>
<scope>test</scope>
</dependency>
引入成功后,再次运行mvn test,就可以执行成功。
扩展
把EvoSuite Test和程序员写的Test分开
如果想把自己写的Test和产生的Tests分开,先从src/test/java 中删除所有之前export过来的EvoSuite Test
rm src/test/java/*ESTest*.java
通过运行下面的命令,我们可以知道export goal的详细用法:
mvn evosuite:help -Ddetail=true -Dgoal=export
得到如下信息:
Available parameters:
targetFolder (Default: src/test/java)
User property: targetFolder
有两种方式来配置targetFolder:
直接修改export 命令
mvn evosuite:export -DtargetFolder=src/test/evosuite
修改pom.xml文件,在<project>节点下下,添加<properties> 配置:
<properties>
<targetFolder>src/test/evosuite</targetFolder>
</properties>
再次运行:
mvn evosuite:export
执行完上面其中一种方式,你会发现tests 被exported到src/test/evosuite。
如果现在去运行mvn test,你会发现src/test/evosuite的Tests不会被包含到测试中,需要做如下配置:
<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>
再次执行,log中会看到 EvoSuite Test也一起被执行了。
如果手写的tests和EvoSuite Test运行在相同的进程中,它们就会使用相同的执行容器版本。
为了确保执行容器只能激活EvoSuite tests,我们需要增加一个初始化Listener:
<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>