EvoSuite是什么?
EvoSuite是一个自动为Java类生成JUnit测试套件的工具,旨在达到如分支覆盖等代码覆盖率标准。它使用基于遗传算法的进化方法来生成测试套件。为了提高可读性,生成的单元测试会被最小化,并添加回归断言来捕获被测试类的当前行为。
使用EvoSuite
有多种使用EvoSuite的方式:
在命令行中使用EvoSuite
EvoSuite以可执行jar文件的形式提供,你可以按以下方式调用:
java -jar evosuite.jar <选项>
要使用EvoSuite生成测试套件,请使用以下命令:
java -jar evosuite.jar <目标> [选项]
目标可以是一个类:
-class <类名>
或者是一个包前缀,这种情况下EvoSuite会尝试为类路径中与该前缀匹配的每个类生成测试套件:
-prefix <前缀名>
或者是一个类路径条目,这种情况下EvoSuite会尝试为给定类路径条目中的每个类生成测试套件:
-target <jar文件或目录>
最重要的选项是设置类路径,使用标准Java类路径语法:
-projectCP <类路径>
更多选项,请参见文档
java -jar evosuite.jar -help
Docker Hub上的EvoSuite
EvoSuite在Docker Hub上提供了容器镜像。你可以通过拉取镜像来获取容器:
docker pull evosuite/evosuite:<版本>
或者在本地手动构建镜像:
git clone https://github.com/EvoSuite/evosuite.git
cd evosuite
docker build -f Dockerfile.java8 . --tag evosuite/evosuite:latest-java-8
docker build -f Dockerfile.java11 . --tag evosuite/evosuite:latest-java-11
可以按以下方式调用EvoSuite:
docker run -it -u ${UID} -v ${PWD}:/evosuite evosuite/evosuite:<版本>-java-<java版本> <选项>
这假设要测试的项目位于调用命令的当前目录中。当前目录${PWD}
被映射到容器内的/evosuite
目录。这个位置也是EvoSuite的工作目录。所有结果都会映射回主机系统上的目录。-u ${UID}
确保结果具有与发起命令的用户相同的文件所有权。
当需要在后台运行EvoSuite时,可以使用-d
代替-it
。
<选项>
与从命令行调用EvoSuite时相同。
大规模实验运行器
docker镜像还提供了一个标签(evosuite/evosuite:<版本>-java-<java版本>-experiment
)以轻松运行大规模实验。你可以通过从Docker Hub拉取镜像来获取:
docker pull evosuite/evosuite:<版本>-experiment
或者在本地手动构建镜像:
git clone https://github.com/EvoSuite/evosuite.git
cd evosuite
git checkout <版本> # 例如 git checkout v1.1.0
docker build -f Dockerfile.java8-experiment . --tag evosuite/evosuite:<版本>-java-8-experiment
docker build -f Dockerfile.java11-experiment . --tag evosuite/evosuite:<版本>-java-11-experiment
实验运行器可以按以下方式调用:
docker run -it -u ${UID} -v ${PWD}:/evosuite evosuite/evosuite:<版本>-java-<java版本>-experiment [<选项>] <配置文件> <项目文件>
并具有以下选项:
-h 打印帮助并退出
-m <内存> EvoSuite客户端进程的内存限制(MB)(默认:2500)
-p <并行实例> 并行执行数量的限制(默认:1)
-r <轮次> 执行每个实验的轮次数(默认:1)
-s <种子文件> 包含实验执行种子的文件(默认:SEEDS)
-t <超时> 在EvoSuite进程被终止前的时间量(默认:10m)
它假设当前工作目录有一个名为projects
的文件夹,其中包含每个被测项目的子目录,子目录中包含该项目的所有jar文件。当前目录还应包含两个csv文件:
- 一个用于实验的不同配置,有两列分别是
configuration_name
和user_configuration
- 一个用于每个项目的类,有两列分别是
project_name
(应与projects
下的文件夹名称相同)和class
(应为完整的类路径)
目录结构示例:
./projects/<项目1名称>/<项目1的第一个jar文件>
./projects/<项目1名称>/<项目1的第二个jar文件>
./projects/<项目2名称>/<项目2的jar文件>
./configurations.csv
./projects.csv
configurations.csv:
configuration_name,user_configuration
default60,-generateMOSuite -Dalgorithm=DynaMOSA -Dsearch_budget=60 -Dassertion_timeout=120 -Dminimization_timeout=120
default120,-generateMOSuite -Dalgorithm=DynaMOSA -Dsearch_budget=120 -Dassertion_timeout=120 -Dminimization_timeout=120
projectCP、class、seed和输出位置的配置已由镜像提供。
projects.csv:
project_name,class
<项目1名称>,com.project1.application
镜像会将实验输出放在以下位置(在当前目录内):
./results/<配置名称>/<项目名称>/<类名>/logs/<轮次>
./results/<配置名称>/<项目名称>/<类名>/reports/<轮次>/
./results/<配置名称>/<项目名称>/<类名>/tests/<轮次>/
当你运行镜像时,它会自动在当前目录中生成一个SEEDS文件,包含它用于实验的种子。如果你想复制这个实验,你可以将该文件放回同一位置,这样镜像就会使用这些种子而不是创建新的种子。
如果你想设置手动类路径而不是让脚本为你确定,可以在各个项目文件夹中放置一个名为'CLASSPATH'的文件,其中第一行是该项目的类路径。
当需要在后台运行EvoSuite时,可以使用-d
代替-it
。
Eclipse的EvoSuite插件
有一个实验性的Eclipse插件可以通过以下更新站点获得: http://www.evosuite.org/update
要了解该插件的功能,请查看屏幕录像。
Maven的EvoSuite插件
EvoSuite有一个Maven插件,可以在构建过程中生成新的测试用例。这至少有以下优点:
- 可以从持续集成服务器(如Jenkins)运行EvoSuite,配置开销最小
- 生成的测试可以根据pom.xml文件直接放在系统的类路径中
- 无需在本地机器上安装EvoSuite(Maven会自动处理)
更多详情,请查看文档
IntelliJ的EvoSuite插件
请查看文档。
获取EvoSuite
EvoSuite的当前版本(主EvoSuite jar文件和插件)可以在http://www.evosuite.org/downloads/下载。
要访问源代码,请使用github仓库:
git clone https://github.com/EvoSuite/evosuite.git
构建EvoSuite
EvoSuite使用Maven。
要在命令行上构建EvoSuite,请安装maven,然后调用
mvn compile
要创建包含所有依赖项的二进制分发包,你也可以使用Maven:
mvn package
要在Eclipse中构建EvoSuite,请确保已安装M2Eclipse插件,并将EvoSuite作为Maven项目导入。这将确保Eclipse使用Maven来构建项目。
更多信息
使用文档可以在http://www.evosuite.org/documentation/找到
开发者邮件列表托管在https://groups.google.com/forum/#!forum/evosuite
EvoSuite已产生了许多出版物,所有这些都可以在http://www.evosuite.org/publications/找到