WebFuzzing/EvoMaster
GitHub: WebFuzzing/EvoMaster
首个开源的 AI 驱动模糊测试工具,专为 Web API 自动生成系统级测试用例与回归测试套件。
Stars: 674 | Forks: 103
# EvoMaster:自动生成系统级测试用例的工具

[](https://central.sonatype.com/artifact/org.evomaster/evomaster-client-java)
[](https://javadoc.io/doc/org.evomaster/evomaster-client-java-controller)

[](https://codecov.io/gh/WebFuzzing/EvoMaster)
[](https://doi.org/10.5281/zenodo.5052036)
[](https://www.gnu.org/licenses/lgpl-3.0)
[](https://github.com/WebFuzzing/EvoMaster/releases)
### 概述
_EvoMaster_ ([www.evomaster.org](http://evomaster.org)) 是首个 (2016) 开源的 AI 驱动工具,
能够为 Web/企业应用自动*生成*系统级测试用例。
这与 [Fuzzing](https://en.wikipedia.org/wiki/Fuzzing) 相关。
特别是,_EvoMaster_ 可以对 REST、GraphQL 和 RPC 等 API 进行模糊测试。
_EvoMaster_ 不仅能生成发现程序崩溃的输入,还能生成可用于*回归测试*的小型高效测试套件(例如 Python、JavaScript 和 Java/Kotlin JUnit 格式)。
_EvoMaster_ 是一个 AI 驱动的工具。
具体来说,它在内部使用 [进化算法](https://en.wikipedia.org/wiki/Evolutionary_algorithm)
和 [动态程序分析](https://en.wikipedia.org/wiki/Dynamic_program_analysis) 来
生成有效的测试用例。
其方法是从随机的初始种群中*进化*出测试用例,试图最大化代码覆盖率和故障检测等指标。
_EvoMaster_ 使用多种 AI 启发式算法进一步提升性能,
建立在 [基于搜索的软件测试](https://en.wikipedia.org/wiki/Search-based_software_engineering) 领域数十年的研究基础之上。
### 1 分钟示例
在控制台上,复制并粘贴以下命令(需要安装 _Docker_)。
它将根据 Swagger 对 PetClinic 示例 API 进行 30 秒的模糊测试,如下面的视频所示。
```
docker run -v "$(pwd)/generated_tests":/generated_tests webfuzzing/evomaster --blackBox true --maxTime 30s --ratePerMinute 60 --bbSwaggerUrl https://petstore.swagger.io/v2/swagger.json
```

#### 在不同的 Shell 中使用 Docker
请注意,根据您使用的 Shell 和操作系统,在使用 `-v` 选项挂载文件夹时,可能需要稍作调整。
例如,如果在 Windows 上的 MSYS shell(如 _Git Bash_)中运行,需要在 $ 之前加一个额外的 /。
```
docker run -v "/$(pwd)/generated_tests":/generated_tests webfuzzing/evomaster --blackBox true --maxTime 30s --ratePerMinute 60 --bbSwaggerUrl https://petstore.swagger.io/v2/swagger.json
```
如果您使用的是命令提示符 终端,则需要使用 `%CD%` 而不是 `$(pwd)` 来引用当前文件夹:
```
docker run -v %CD%/generated_tests:/generated_tests webfuzzing/evomaster --blackBox true --maxTime 30s --ratePerMinute 60 --bbSwaggerUrl https://petstore.swagger.io/v2/swagger.json
```
另一方面,在 PowerShell 中,您需要使用 `${PWD}`:
```
docker run -v ${PWD}/generated_tests:/generated_tests webfuzzing/evomaster --blackBox true --maxTime 30s --ratePerMinute 60 --bbSwaggerUrl https://petstore.swagger.io/v2/swagger.json
```
#### 故障排除
如果您在运行命令时遇到问题:
* 确保已安装 Docker 并正在运行。
* 检查您是否有正确的权限来挂载指定的卷。
* 请参阅您的 Shell 环境的 Docker 文档以了解特定的语法要求。
#### 生成的输出
命令执行完毕后,您可以在 `generated_tests` 文件夹下查看生成的文件。
注意,从 4.0.0 版本开始,_EvoMaster_ 现在默认还会创建一个交互式 Web 报告。


### 主要特性
* _Web APIs_: 目前,_EvoMaster_ 可以为 __REST__、__GraphQL__ 和 __RPC__(例如 __gRPC__ 和 __Thrift__)API 生成测试用例。
* _免费_: 这是一个开源项目,由公共研究资金支持(例如教授、博士后和博士生)。
使用此工具不涉及任何金钱成本,也不需要使用任何付费的外部服务(例如外部 LLM API)。
如果您是欧盟、挪威、阿根廷、中国或任何与 ERC 有关的关联国家的居民,感谢您的税收支持本项目。
* _本地部署,无遥测_: 目前 _EvoMaster_ 中没有使用遥测技术,且不需要连接到互联网上的任何外部服务(被测应用除外)。据我们所知,它可以在内部安全运行,无需担心将任何 IP 泄露给外部各方(如果不是这样,请新建一个 issue 告诉我们要如何实现,我们会尝试修复)。
* _黑盒_ 测试模式: 可以在任何 API 上运行(无论其编程语言如何,例如 Python 和 Go)。
然而,黑盒测试的结果将不如白盒测试(例如,由于缺乏代码分析)。
默认的测试用例输出是 Python,但也提供其他格式。
* _白盒_ 测试模式: 可用于编译到
JVM 的 API(例如 Java 和 Kotlin)。_EvoMaster_ 分析被测应用的字节码,并使用
多种启发式方法(如 _可测试性转换_ 和 _污点分析_)来生成
更有效的测试用例。我们支持 JDK __8__ 及之后的主要 LTS 版本(目前是 JDK __21__)。可能在其他 JVM 版本上也能工作,但我们对此提供 __NO__ 支持。
注意:最初也支持其他语言,例如 JavaScript/TypeScript 和 C#,但它们未处于稳定、功能完整的状态。至少暂时取消了对这些语言白盒测试的支持。
* _安装_: 我们为主要操作系统提供安装程序:_Windows_ (`.msi`)、
_OSX_ (`.dmg`) 和 _Linux_ (`.deb`)。我们还提供一个 uber-fat JAR 文件。
要下载它们,请查看 [发布页面](https://github.com/WebFuzzing/EvoMaster/releases)。
发布说明位于 [release_notes.md](https://github.com/WebFuzzing/EvoMaster/blob/master/release_notes.md) 文件中。
如果您使用的是 uber-fat JAR,它应该适用于任何主要的 LTS 版本(从 JDK 8 开始)。
而对于白盒测试所需的客户端库,我们可能会长期支持 JDK 8,但请注意,可执行 JAR 的未来版本可能在不远的将来开始要求更高版本的 JDK。
如果要求的版本高于您当前的 JVM 版本,而您又无法升级或机器上安装了 2 个不同的 JDK,那么您不应使用 uber-jar,而应使用其中一个安装程序。
当您使用其中一个安装程序时,请记住目前它们不会更新 `PATH` 变量。这需要手动完成,[请参阅文档](docs/download.md)。
另外请记住,我们没有支付 [Microsoft/Apple 税](docs/download.md)。这意味着您的操作系统默认会阻止安装,声称无法验证它是否为恶意软件。
但该阻止[是可以绕过的](docs/download.md)。
* _Docker_: _EvoMaster_ 现在也通过 Docker 发布,位于 Docker Hub 上的 [webfuzzing/evomaster](https://hub.docker.com/r/webfuzzing/evomaster)。有关如何通过 Docker 使用 _EvoMaster_ 的更多信息,[请参阅文档](docs/docker.md)。
* _GitHub Action_: 可以在 GitHub Actions 中运行 _EvoMaster_,作为持续集成的一部分,通过使用[以下自定义操作](https://github.com/WebFuzzing/evomaster-action)(位于不同的 GitHub 仓库中)。
* _硬件_: 尽管使用了最先进的 AI 技术,但运行 _EvoMaster_ 没有主要的硬件要求。即使在旧笔记本电脑上它也能工作。主要的计算瓶颈在于运行被测应用程序以及向它们发起网络调用。
* _最先进水平_: 一项[独立研究 (2022)](https://arxiv.org/abs/2204.08348) 在 20 个 RESTful API 上比较了 10 个模糊测试工具,结果表明 _EvoMaster_ 提供了最佳结果。另一项由不同研究小组完成的[独立研究 (2024)](https://arxiv.org/abs/2410.12547) 证实了这些结果。
* _Schema_: REST APIs 必须提供 [OpenAPI/Swagger](https://swagger.io) 格式的 schema(_v2_ 或 _v3_)。
* _输出_: 该工具生成 _JUnit_(版本 4 或 5)测试,可用 Java 或 Kotlin 编写,以及 Python 和 JavaScript 的测试套件。完整列表请参阅 CLI 参数 [--outputFormat](docs/options.md) 的文档。
一些示例:PYTHON_UNITTEST, KOTLIN_JUNIT_5, JAVA_JUNIT_4 和 JS_JEST。
请注意,生成的测试依赖于第三方库(例如,用于发起 HTTP 调用)。
这些需要在您的项目中进行设置,[请参阅文档](docs/library_dependencies.md)。
* _Web 报告_: 除了生成不同编程语言的可执行测试外,默认情况下还会创建一个交互式 _index.html_ Web 报告,可视化和总结生成测试的结果。
* _故障检测_: _EvoMaster_ 可以生成揭示被测应用程序中故障/错误的测试用例。
采用了不同的启发式方法,例如检查 500 状态码、与 API schema 不匹配以及访问策略违规。
* _自包含测试_: 对于白盒测试,生成的测试会启动/停止应用程序,并绑定到一个临时端口。
这意味着生成的测试可用于_回归测试_(例如,添加到应用程序的 Git 仓库中,并使用任何构建工具如 Maven 和 Gradle 运行)。
对于黑盒测试,您需要确保在执行测试之前应用程序已启动并运行。
* _数据库处理_: 对于白盒测试,_EvoMaster_ 可以拦截和分析所有与 SQL 及 MongoDB 数据库的通信,并利用
这些信息生成更高代码覆盖率的测试用例。此外,它可以直接向数据库中生成数据,并自动将此类初始化添加到生成的测试中。
目前,_EvoMaster_ 支持 _Postgres_、_MySQL_、_H2_ 和 MongoDB 数据库。
* _认证_: 我们支持基于认证标头和 Cookie 的认证。
除了使用固定的 HTTP 标头外,
还可以声明式地指定应使用哪个登录端点来为每次测试执行动态获取认证信息(例如 auth token 或 Cookie)。[请参阅文档](docs/auth.md)。
### 已知限制
* _驱动程序_: 用于_白盒_测试时,用户需要[手动编写驱动程序](docs/write_driver.md)。
我们建议先尝试_黑盒_模式(只需几分钟即可启动并运行),以了解 _EvoMaster_ 能为您做些什么。
* _JDK 9+_: 白盒测试需要字节码操作。
JDK 的每个新版本都使这项工作变得越来越困难。
处理 __8__ 以上版本的 JDK 是可行的,但需要进行一些设置。
[请参阅文档](docs/jdks.md)。
* _执行时间_: 为了获得良好的结果,您可能需要运行搜索数小时。
我们建议首先尝试运行搜索 10 分钟,只是为了了解可以生成什么类型的测试。
但是,之后您应该运行 _EvoMaster_ 大约 1 到 24 小时(越长越好,但在 24 小时后不太可能获得更好的结果)。
* _RPC APIs_: 目前,我们不直接支持 RPC schema 定义。模糊测试 RPC APIs 需要编写驱动程序,使用 API 的客户端库进行调用。
* _外部服务_: (例如其他 RESTful APIs)目前不支持它们(例如自动 Mock 它们)。
相关工作正在进行中。
* _失败的测试_: _EvoMaster_ 生成的测试应该全部通过,而不是失败,即使在它们检测到故障时也是如此。
在这些情况下,注释/测试名称会指出测试揭示了可能的故障,但仍然通过。
然而,在某些情况下,生成的测试可能会失败。这是由于所谓的 _flaky_ 测试,例如,当
测试包含基于时钟时间的断言(例如日期和时间戳)时。
我们正在努力解决这个问题,但目前尚未完全解决。