ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Keploy 快速上手:基于 eBPF 的 API 录制-回放测试从零到一

Keploy 快速上手:基于 eBPF 的 API 录制-回放测试从零到一 Keploy 快速上手基于 eBPF 的 API 录制-回放测试从零到一【免费下载链接】keployOpen-source platform for creating safe, isolated production sandboxes for API, integration, and E2E testing.项目地址: https://gitcode.com/GitHub_Trending/ke/keployKeploy 是一个面向开发者的 API 与集成测试工具它把真实的 API 调用连同数据库等依赖交互一起录制下来并在回放阶段自动生成带 mock 的测试用例。本文以 Keploy 官方文档法语版 README为主线走通「安装 Agent → 录制用例 → 离线回放测试」的完整流程并结合仓库源码安装脚本、CLI 命令实现、配置参数定义深入解释每个步骤背后的机制与关键参数的取值。一、Keploy 定位比单元测试更快的 API 测试Keploy 的核心理念可以用两句话概括测试比单元测试更快生成不写测试代码把用户流量API 调用直接转成测试用例不仅录制 API还录制依赖Keploy 会同时捕获数据库等下游调用并在回放时自动用 mock/stub 顶替因此回放时不再需要真实的数据库、Redis、Kafka。文档原文强调Keploy 是一个面向开发者的 API 测试工具它创建自带 mock 的测试速度比编写单元测试更快。Keploy 不仅记录 API 调用还记录数据库调用并在测试时回放。这与仓库的英文 README 描述一致Keploy 在底层使用 eBPF 在网络层捕获流量对用户而言是零代码侵入、语言无关的。二、快速安装一条命令安装本地 Agent文档给出的官方安装命令curl --silent -O -L https://keploy.io/install.sh source install.sh安装完成后本地即拥有keploy命令不需要修改任何业务代码。2.1 安装脚本做了什么源码级解读仓库中保留了一份可审计的安装脚本 keploy.sh它揭示了安装流程的细节版本与安装模式参数installKeploy()keploy.sh#L160-L192-v vsemver指定安装的版本号需匹配^v[0-9].*默认latest-noRoot不使用 sudo把二进制装到$HOME/.keploy/bin并把该目录写入PATHmacOS 默认走此分支-platform shell指定当前 shell默认取$SHELL的 basename用于决定写.zshrc、.bashrc还是.profile-isCICI 模式跳过交互式 UI下载进度条、加载动画。平台分发macOSDarwin下载keploy_darwin_all.tar.gz强制NO_ROOTtrue二进制解包路径为/tmp/keploy/keployLinuxx86_64/aarch64分别下载keploy_linux_amd64.tar.gz/keploy_linux_arm64.tar.gz默认安装到/usr/local/bin/keployLinux 下若/sys/kernel/debug未挂载会尝试mount -t debugfs debugfs /sys/kernel/debugeBPF 运行所需见 keploy.sh#L443-L448Windows 环境脚本明确提示 OSS 构建没有原生 Windows 后端eBPF 仅 Linux 可用建议走 WSL2 或使用 Docker 运行应用。默认路由说明脚本末尾默认安装 Keploy Community Edition需要 OSS 版时传--oss参数keploy.sh#L493-L511。体验细节脚本实现了下载进度条轮询文件大计算百分比、spinner 加载动画安装结束后自动执行keploy example展示示例用法。2.2 无本地安装的自动运行文档还提供了一条免安装路径借助 GitHub Codespace 等云端开发环境直接配置并运行 Keploy无需在本地机器上安装二进制。适合只想快速体验流程的读者。三、录制测试用例keploy record文档核心操作keploy record -c CMD_TO_RUN_APP把CMD_TO_RUN_APP换成你的应用启动命令即可各语言的典型写法文档原文示例语言命令Pythonkeploy record -c python main.pyGolangkeploy record -c go run main.goJavakeploy record -c java -jar xyz.jarNode.jskeploy record -c npm start运行期间Keploy 会把真实流量转换成测试用例 mocks/stubs并落盘保存。3.1record命令的源码实现cli/record.go 定义了该命令命令注册名record用途描述为 “record the keploy testcases from the API calls”官方示例即keploy record -c /path/to/user/appPreRunE阶段通过cmdConfigurator.Validate校验参数RunE阶段从ServiceFactory取出recordSvc.Service对应 pkg/service/record 中的录制服务并调用Start(ctx)启动整个录制流水线。3.2 支持 Docker/Compose 场景当应用以容器方式启动时record支持 Docker 命令作为-c参数并可用--buildDelay指定容器构建等待时间cli/provider/cmd.go#L79-L82keploy record -c docker run -p 8080:8080 --name containerName --network networkName applicationImage --buildDelay 60源码中还有贴心提示若buildDelay≤ 30 秒CLI 会主动提醒你为慢构建调大--buildDelaycli/provider/cmd.go#L1366-L1369。四、运行测试keploy test --delay文档给出的回放命令keploy test -c CMD_TO_RUN_APP --delay 10关键前置步骤先停掉应用依赖的数据库、Redis、Kafka 等所有外部服务——回放阶段 Keploy 用录制的 mock 顶替它们真实服务不参与测试。4.1--delay参数与就绪探测--delay简写-d表示“应用就绪前等待的秒数”cli/provider/cmd.go#L421User provided time to run its applicationKubernetes 场景下的语义是Seconds to wait for the runner to be ready before it starts issuing calls。源码中还有一个默认值提醒逻辑若Delay 5CLI 会提示你根据应用启动耗时调大--delaycli/provider/cmd.go#L1627-L1628。从 config/config.go#L386-L391 的配置结构看Delay之外还提供了更精细的就绪探测选项HealthURL可选的 HTTP(S) 健康检查地址在发起第一个测试前先轮询它为空则保持固定的--delay行为HealthPollTimeout健康轮询的超时上限超时后回退到--delayAppReadyProbeAddr对没有 HTTP 健康端口的应用用host:portTCP 探测代替且只用于就绪探测、绝不影响请求路由KeepAppAlive只启动一次用户应用、跨所有测试集复用跳过每个测试集的重新启动和--delay等待适用于需要长连接跨测试集暴露的问题如 asyncpg 连接池、JDBC HikariCP 池。4.2test命令的源码实现cli/test.go 定义了回放命令描述为 “run the recorded testcases and execute assertions”官方示例keploy test -c /path/to/user/app --delay 6RunE中取出replaySvc.Service对应 pkg/service/replay并defer了一个兜底清理无论测试出错还是上下文取消都会调用utils.ExecCancel()停掉 Keploy避免残留进程。五、覆盖率与单元测试框架组合文档建议把 Keploy 的集成测试与你现有的单元测试框架go test、JUnit、pytest、jest 等结合使用获得合并后的覆盖率视图。这对应官方特性中的 “Couverture de Tests Combinés / Combined Test Coverage”Keploy 负责 API 集成层面的覆盖单元测试框架负责语句/分支级覆盖二者合并后覆盖率指标更客观。六、魔法如何运作代理 eBPF文档「Comment la magie opère」一节的原文要点Keploy 的代理会捕获并回放你应用所有的网络交互包括非幂等 API 的 CRUD 操作。结合仓库源码可以进一步印证这条链路eBPF 钩子Linux 平台的流量拦截基于 eBPF编译产物位于 pkg/agent/hooks/linux含bpf_x86_bpfel.o、bpf_arm64_bpfel.o等内核对象负责在系统调用/网络层挂钩并收集连接信息这也是为什么安装脚本要挂载debugfs以及 eBPF 仅支持 Linux 的根本原因代理捕获捕获与转发逻辑集中在 pkg/agent/proxy其中 pkg/agent/proxy/relay 负责连接中继、pkg/agent/proxy/tls 负责 TLS 场景的 CA 与握手处理按协议划分的捕获器包括 pkg/agent/proxy/incoming/http.go、gRPC 捕获pkg/agent/proxy/incoming/gRPC以及 MySQL 等数据库协议的检测与分发pkg/agent/proxy/mysql_detect.gomock 存储与匹配落盘的 mock 通过 pkg/agent/proxy/mockmanager.go 与 pkg/platform/yaml/mockdb 的 YAML 存储管理回放时按请求特征匹配并返回录制响应。从源码结构看「录制 → 落盘 → 回放匹配」这条流水线被拆成了 agent捕获、servicerecord/replay 编排、matcher请求匹配三层与文档「捕获并重放所有网络交互」的描述相互印证。七、关键特性一览文档列出的五项核心能力逐条说明组合测试覆盖率♻️将 Keploy 测试与任意测试库JUnit、go test、pytest、jest的结果合并得到统一的覆盖率视图eBPF 插桩eBPF 是实现「零代码集成、语言无关、轻量」的关键技术无需在任何服务中注入 SDKCI/CD 集成测试可在本地 CLI、CI 流水线Jenkins、GitHub Actions 等或 Kubernetes 集群中运行mock 随用例一起流转复杂流录制-回放️分布式、多跳的 API 流程可整体捕获并回放为 mock/stub相当于给测试配了一台「时间机器」多用途 MockKeploy 生成的 mock 不仅可以做测试回放还可以直接当作服务器测试server test使用即独立起一个由 mock 驱动的假服务。八、支持的语言由于捕获发生在网络层Keploy 对应用语言无要求。文档列出的支持语言包括Go、Java、Node.js、Rust、C#、Python英文 README 进一步列出了 C/C、TypeScript、Scala、Kotlin、Swift、Dart、PHP、Ruby、Elixir、.NET 等以及 gRPC、GraphQL、HTTP/REST、Kafka、RabbitMQ、PostgreSQL、MySQL、MongoDB、Redis 等常见协议与基础设施。九、当前限制如实说明文档专门列出了两条限制使用时应提前知悉单元测试Keploy 生成的是集成测试而非单元测试其定位是补充Go test、JUnit 等单元测试框架以提升总覆盖率而不是替代生产高负载环境Keploy 当前聚焦于开发者的测试生成场景。用例可以从任意环境捕获但尚未在高负载生产环境验证过——那需要强健的去重机制来避免捕获过多冗余用例文档引用了 issue #27 跟踪这一方向。十、延伸阅读与社区贡献指南CODE_OF_CONDUCT.md 与贡献文档文档中指向仓库内的贡献规范文件「Keploy 如何工作」的深度解释与 FAQ 在官方文档站docs.keploy.io对应章节项目使用 Go 编写入口为 main.goCLI 层位于 cli 目录record、test等子命令均在此注册测试用例可参考各目录下的*_test.go如 cli/record.go 配套的 cli/provider/cmd_test.go。适用前提小结eBPF 流量拦截要求 Linux 环境Windows 需 WSL2 或 Docker 方式运行应用eBPF 场景通常需要挂载 debugfs回放阶段应停止真实依赖服务以获得确定性的离线测试。按照本文的三步流程——安装 Agent、keploy record -c 启动命令、keploy test -c 启动命令 --delay 10——即可在不改一行代码的前提下把真实流量变成可重复执行的集成测试。【免费下载链接】keployOpen-source platform for creating safe, isolated production sandboxes for API, integration, and E2E testing.项目地址: https://gitcode.com/GitHub_Trending/ke/keploy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表