frp 测试框架是一个端到端 (e2e) 测试系统,旨在验证 frp 组件在受控环境下的功能和可靠性。该框架通过模拟真实场景,实现了对客户端(frpc)和服务器(frps)组件的自动化测试。
测试框架专注于通过运行实际的软件实例并验证它们之间的交互来验证 frp 组件的行为。本文档解释了 e2e 测试框架的架构、组件和用法。
来源: test/e2e/framework/framework.go1-42 hack/run-e2e.sh1-34
测试框架基于 Ginkgo v2 测试库构建,该库提供了 BDD 风格的测试结构。框架负责测试组件的生命周期,包括进程管理、端口分配和资源清理。
来源: test/e2e/framework/framework.go43-91 hack/run-e2e.sh1-34
Framework 结构是测试框架的核心组件。它负责管理测试的生命周期,包括设置和拆卸操作、资源分配和进程管理。
主要职责
来源: test/e2e/framework/framework.go26-62 test/e2e/framework/framework.go85-110
端口分配器确保并行运行的测试不会因使用相同的网络端口而发生冲突。它将可用端口范围分配给测试工作进程,并在分配端口之前验证端口是否确实可用。
来源: test/e2e/pkg/port/port.go1-116
RunProcesses 方法负责使用配置模板启动 frps 和 frpc 进程。框架会渲染配置模板,将其写入临时文件,然后启动实际的进程。
关键能力
来源: test/e2e/framework/process.go13-69 test/e2e/framework/process.go71-100
每个测试都遵循框架管理的标准生命周期
设置 (BeforeEach):
测试执行:
拆卸 (AfterEach):
此生命周期确保每个测试都在隔离环境中运行,并且不会干扰其他并行运行的测试。
来源: test/e2e/framework/framework.go86-164
该框架使用 Go 模板来生成 frps 和 frpc 的配置文件。模板可以包含用于动态端口分配的占位符,框架会将这些占位符替换为实际分配的端口。
模板中端口分配的示例
[common]
bind_port = {{ .Port1 }}
框架将从模板中提取端口名称,分配实际端口,并渲染最终的配置文件。
来源: test/e2e/framework/framework.go166-231
要运行 e2e 测试,请使用 run-e2e.sh 脚本
./hack/run-e2e.sh
该脚本支持多个环境变量来控制测试执行
| 可变 | 描述 | 默认 |
|---|---|---|
| DEBUG | 启用调试输出 | false |
| LOG_LEVEL | 设置日志级别 | debug |
| FRPC_PATH | frpc 二进制文件的路径 | ./bin/frpc |
| FRPS_PATH | frps 二进制文件的路径 | ./bin/frps |
| CONCURRENCY | 并行测试工作进程的数量 | 16 |
来源: test/e2e/framework/process.go13-69 test/e2e/framework/framework.go86-164
框架提供方法来运行带有自定义命令行参数的 frps 和 frpc
来源: test/e2e/framework/process.go71-92
您可以生成具有特定内容的配置文件
来源: test/e2e/framework/process.go94-100
框架允许为 frps 和 frpc 进程设置环境变量
来源: test/e2e/framework/framework.go257-259
使用模板渲染:利用模板渲染机制来创建具有动态端口分配的配置文件。
清理资源:框架会自动清理资源,但请确保任何自定义资源都已正确释放。
处理故障:在启动进程和分配端口时检查错误。
调试输出:在排查测试故障时启用调试输出。
并行测试:设计独立运行的测试,以利用并行测试执行。
frp e2e 测试框架提供了一种健壮的方式来在受控环境中测试 frp 组件的功能。它处理了进程管理、端口分配和资源清理等复杂任务,使测试作者能够专注于编写有意义的测试场景。
有关为 frp 项目贡献和了解开发指南,请参阅 贡献指南。