ARTICLE DETAIL

资讯详情

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

wecom-cli端到端测试实战:wiremock+mockito搭建双层e2e测试框架

wecom-cli端到端测试实战:wiremock+mockito搭建双层e2e测试框架 wecom-cli端到端测试实战wiremockmockito搭建双层e2e测试框架【免费下载链接】wecom-cli企业微信开放平台命令行工具 — 让人类和 AI Agent 都能在终端中操作企业微信项目地址: https://gitcode.com/gh_mirrors/we/wecom-cliwecom-cli 是企业微信开放平台命令行工具让人类和 AI Agent 都能在终端中操作企业微信。为了在改动代码时快速验证完整链路项目采用了一套wiremock mockito 双层的端到端e2e测试框架库级别用 wiremock 拦截 HTTP 请求进程级别用 mockito 驱动真实二进制。本文带你从 0 到 1 看懂这套框架的搭建思路新手也能快速上手添加自己的 e2e 用例。为什么要“双层”两种 mock 各管一半很多 CLI 项目的端到端测试要么全部启动真实二进制慢、易抖动要么只测内部函数覆盖不到入口逻辑。wecom-cli 的答案是把用例切成两层层级位置mock 库测什么Library-level库级crates/wecom/test-e2e/wiremock构造wecom::Client并调用Client::run(argv)覆盖 discovery、方法调用、分页、长任务、输出路由等全部核心行为Process-level进程级crates/wecom-cli/test-e2e/mockito用assert_cmd启动真实wecom-cli二进制只测main.rs入口独有逻辑配置解析、日志初始化、JSON 修复提示、旧凭据迁移、沙箱路径等取舍原则凡是能在库级测到的一律走库级——更快、更稳定、mock 控制更精确还不用编译二进制只有启动装配阶段的行为才交给进程级。目录结构desc.md 与 test.rs 紧挨着放框架没有搞复杂的 trait 抽象而是把“用例描述 测试代码”放在同一个目录里crates/wecom/test-e2e/ run.rs # 编译入口按 group 用 include! 引入各用例 helpers/ # 共享工具discovery mock 构造、断言 helpers cases/ group/NNN-slug/ desc.md # 用例描述前置条件 / 命令 / 断言 test.rs # 测试代码两个 crate 各有一套库级 进程级规范统一沉淀在 docs/e2e/FRAMEWORK.md。run.rs用include!把每个test.rs挂进 module 树好处是 改用例时描述和代码在同一目录不用来回跳 所有用例通过use super::*共享同一套 helpers 单用例可精确定位例如cargo test -p wecom --test e2e run::method_call。运行 e2e 测试套件4 条命令全覆盖# 库级全套件最常用 cargo test -p wecom --test e2e # 进程级全套件必须带 feature 才真正执行 cargo test -p wecom-cli --test e2e --features custom-endpoint # 只跑一个用例 cargo test -p wecom --test e2e run::method_call进程级用例依赖custom-endpointfeature子进程通过WECOM_CLI_BASE_URL环境变量拿到 mock server 地址未启用该 feature 时用例会编译为#[ignore]占位函数保证默认cargo test始终全绿。新增一个 e2e 用例只需三步框架把每个测试拆成Setup → Execute → Assert三阶段helper 函数按需组合即可。以库级最典型的 run/001-method-call 为例骨架是#[tokio::test] async fn run() { // 1. Setup起 mock server 挂载 discovery / 方法端点 let server wiremock::MockServer::start().await; setup_discovery_mocks(server).await; setup_method_mock(server, /department/list, api_response(json!({ ... }))).await; // 2. Execute像真实用户一样传入 argv let client build_test_client(server.uri()); let result client.run(hr_dept_list_argv([])) .output(wecom::CliRunOutput::new(buf.clone())).await; // 3. AssertCLI 输出 HTTP 命中次数 assert_cli_ok(result, buf, method call); } 三步流程写desc.md按 DESC_SPEC.md 规范写清 Transport、前置条件、命令、断言写test.rs按三阶段组合 helpers协议构造器在 discovery.rs进程级 mockito 版在 mock_setup.rs在run.rs加一段include!把用例挂进对应的 group module。避坑清单框架帮你踩过的 5 个坑常见坑框架的解法mock 端口冲突wiremock / mockito 均自动分配随机端口每个测试独立 server子进程连不上 mock同步 server ServerGuard绑定到_keep保证存活到子进程结束环境变量泄漏污染其他用例库级不直接set_var进程级经Command::env()天然隔离长任务轮询拖慢测试mock 响应里把polling_interval_ms设为 1 加速tempdir 提前被清理库级用leaked_tempdir()进程级把 tempdir 绑定到测试结束另外断言 helper 都自带“丰富诊断”比如 assert_cli_ok 失败时会打印退出码、渲染后的错误和完整 stdout遇到 HTTP 501 还会直接提示你检查 mock 的 matcher——调试体验非常友好。用例覆盖现状与延伸阅读目前库级共 50 个用例覆盖client、run、pagination、output、directive、error、schema、cache、headers等 10 个 group进程级覆盖startup、config、logging、repair、auth、sandbox_paths等入口行为。想继续深入推荐按这个顺序读 docs/e2e/FRAMEWORK.md框架总设计文档核心决策 helper 清单 映射规则 docs/e2e/DESC_SPEC.md / DESC_SPEC_HUMAN.md用例描述格式规范 docs/e2e/CODEGEN.mddesc.md → test.rs 的生成手册 crates/wecom/test-e2e/cases/ 与 crates/wecom-cli/test-e2e/cases/现成的用例范例库掌握这套“双层 mock 目录即用例”的 e2e 测试框架后你可以用同样的模式为任何 CLI 项目搭建可维护的端到端测试体系 【免费下载链接】wecom-cli企业微信开放平台命令行工具 — 让人类和 AI Agent 都能在终端中操作企业微信项目地址: https://gitcode.com/gh_mirrors/we/wecom-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表