test-02-test case generate 测试用例生成 EvoSuite 介绍

拓展阅读

junit5 系列
基于 junit5 实现 junitperf 源码分析

Auto generate mock data for java test.(便于 Java 测试自动生成对象信息)

Junit performance rely on junit5 and jdk8+.(java 性能测试框架。性能测试。压测。测试报告生成。)

拓展阅读

自动生成测试用例

什么是 EvoSuite?

EvoSuite是一个自动生成Java类的JUnit测试套件的工具,其目标是满足代码覆盖率标准,如分支覆盖率。

它采用基于遗传算法的演化方法来生成测试套件。

为了提高可读性,生成的单元测试被最小化,并向测试中添加了捕获被测试类当前行为的回归断言。

使用 EvoSuite

有不同的方式使用 EvoSuite:

1. 命令行中使用 EvoSuite

EvoSuite作为一个可执行的jar文件提供,可以通过以下方式调用:

bash 复制代码
java -jar evosuite.jar <options>

生成测试套件的命令示例:

bash 复制代码
java -jar evosuite.jar <target> [options]

其中 <target> 可以是一个类:

bash 复制代码
-class <ClassName>

或一个包前缀,此时 EvoSuite 尝试为类路径中与该前缀匹配的每个类生成一个测试套件:

bash 复制代码
-prefix <PrefixName>

或一个类路径条目,此时 EvoSuite 尝试为给定类路径条目中的每个类生成一个测试套件:

bash 复制代码
-target <jar file or directory>

最重要的选项是设置类路径,使用标准的Java类路径语法:

bash 复制代码
-projectCP <classpath>

更多选项,请查阅文档:

bash 复制代码
java -jar evosuite.jar -help

2. Docker Hub 上使用 EvoSuite

EvoSuite在Docker Hub上提供了一个容器镜像。你可以拉取该镜像:

bash 复制代码
docker pull evosuite/evosuite:<version>

或手动在本地构建该镜像:

bash 复制代码
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:

bash 复制代码
docker run -it -u ${UID} -v ${PWD}:/evosuite evosuite/evosuite:<version>-java-<java_version> <options>

它假设要测试的项目位于调用命令的当前目录中。当前目录 ${PWD} 映射到容器内的 /evosuite 目录。这也是 EvoSuite 的工作目录。所有的结果都将映射回主机系统上的目录。-u ${UID} 确保结果具有与启动命令的用户相同的文件所有权。

当 EvoSuite 需要在后台运行时,可以使用 -d 代替 -it

3. 大规模实验运行器

Docker 镜像还提供了一个标签(evosuite/evosuite:<version>-java-<java_version>-experiment),以便轻松运行大规模实验。可以通过从 Docker Hub 拉取该镜像获取:

bash 复制代码
docker pull evosuite/evosuite:<version>-experiment

或手动在本地构建该镜像:

bash 复制代码
git clone https://github.com/EvoSuite/evosuite.git
cd evosuite
git checkout <version> # 例如 git checkout v1.1.0
docker build -f Dockerfile.java8-experiment . --tag evosuite/evosuite:<version>-java-8-experiment
docker build -f Dockerfile.java11-experiment . --tag evosuite/evosuite:<version>-java-11-experiment

实验运行器可以这样调用:

bash 复制代码
docker run -it -u ${UID} -v ${PWD}:/evosuite evosuite/evosuite:<version>-java-<java_version>-experiment [<options>] <configurations_file> <projects_file>

它假设当前工作目录下有一个名为 projects 的文件夹,其中包含每个要测试项目的子目录,包含该项目的所有jar文件。当前目录还应包含两个csv文件:

  • 一个用于实验不同配置的文件,包含两列用于 configuration_nameuser_configuration
  • 一个用于每个项目的类的文件,包含两列用于 project_name(应与 projects 下的文件夹相同)和 class(应为完整的类路径)

例如,目录结构的示例为:

bash 复制代码
./projects/<project1_name>/<project 1的第一个jar文件>
./projects/<project1_name>/<project 1的第二个jar文件>
./projects/<project2_name>/<project 2的jar文件>
./configurations.csv
./projects.csv

configurations.csv 文件的内容示例为:

bash 复制代码
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

镜像已经提供了 projectCPclassseed 和输出位置的配置。

projects.csv 文件的内容示例为:

bash 复制代码
project_name,class
<project1_name>,com.project1.application

该镜像将实验的输出放置在以下位置(在当前目录内):

bash 复制代码
./results/<configuration_name>/<project_name>/<class_name>/logs/<round>
./results/<configuration_name>/<project_name>/<class_name>/reports/<round>/
./results/<configuration_name>/<project_name>/<class_name>/tests/<round>/

运行该镜像时,它将在当前目录中自动生成一个名为 SEEDS 的文件,其中包含它用于实验的种子。如果要复制实验,可以将该文件放回同一位置,而不是创建新的种子,镜像现在将使用这些种子。

如果要手动设置类路径而不是让脚本为您确定一个,可以在每个项目文件夹内放置名为 'CLASSPATH' 的文件,其中第一行是该项目的

类路径。

当 EvoSuite 需要在后台运行时,可以使用 -d 代替 -it

相关推荐
仿生狮子1 小时前
怎么给CC上下文窗口免费扩容?
开源·claude·vibecoding
折哥的程序人生 · 物流技术专研3 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
xxie1237943 小时前
return与print
开发语言·python
秋93 小时前
从 Python 后端工程师转型 AI Engineer(AI 工程化)的完整补课清单(2026实战版)
开发语言·人工智能·python
一条泥憨鱼3 小时前
【Redis】数据类型和常用命令
java·数据库·redis·后端·缓存
lularible3 小时前
从沙子到车辙(7.4):《兰亭集序》的启示
开源·嵌入式·汽车电子
云烟成雨TD3 小时前
Spring AI Alibaba 1.x 系列【78】沙箱(Sandbox)
java·人工智能·spring
程序员二叉3 小时前
【Java】 异常高频面试题精讲 | 易错点+对比总结
java·开发语言·面试
Soari4 小时前
开源项目解析 openmed —— 面向医疗智能应用的 OpenMed 开源平台
开源
周航宇JoeZhou4 小时前
JB3-9-SpringAI(二)
java·ai·agent·多智能体·调度·智能体·观察