Macro测试策略全解:vitest+Playwright+Rust集成测试三层防线
【免费下载链接】macroMacro is a unified workspace for teams: email, chat, docs, tasks, agents, calls, and CRM — @-linked together with shared AI memory.项目地址: https://gitcode.com/GitHub_Trending/macro3/macro
Macro 是一款团队统一工作区(email、chat、docs、tasks、agents、calls、CRM 全部 @-linked 协同),它的代码质量靠一条清晰的三层测试防线支撑:前端单元测试用vitest,浏览器端到端用Playwright,后端 Rust 集成测试跑在本地 E2E 栈上。本文带你读懂这套组合拳是怎么搭起来的。
一、三层防线总览:各管一段,互不越位
| 层级 | 工具 | 测什么 | 速度 |
|---|---|---|---|
| 第一层 | vitest | 前端组件、缓存、GraphQL、业务逻辑 | 秒级 |
| 第二层 | Playwright | 真实浏览器里的完整用户旅程 | 分钟级 |
| 第三层 | Rust 集成测试(local E2E 栈) | 服务、数据库、WebSocket 的真实行为 | 需 Docker |
二、第一层防线:vitest 多项目单元测试 🧪
前端仓库 apps/web/vitest.config.ts 用 vitest 的projects 机制把上千个测试文件切分成十几个独立“项目”:
- core / queries:核心库与查询层
- graphql-cache / urql-solid:GraphQL 缓存相关测试单独启用
jsdom环境(见 vitest.config.ts 第 52-66 行) - feature 级项目:email、channel、notifications、block-call 等各模块独立配置,互不干扰
- 跨包项目:
packages/email-renderer、packages/collaboration、packages/lexical-core也接入同一入口
好处是:每个项目只加载自己需要的插件与环境(比如 SolidJS 响应式构建),失败定位快、并行效率高。
本地运行方式:在apps/web目录下执行just test-watch(定义于 apps/web/justfile),即可进入 watch 模式,改动即测。
三、第二层防线:Playwright 浏览器端到端测试 🌐
Playwright 配置在 apps/web/playwright.config.ts,有两个值得学习的设计:
1. 三种运行模式自动切换
- 本地开发:
webServer直接bun run dev起开发服务器,且reuseExistingServer复用已开实例 - CI 环境:跑
vite preview预览生产构建,forbidOnly防止误留test.only,retries: 1兜底偶发失败(见 playwright.config.ts 第 146-152 行) - 本地 E2E 模式:
LOCAL_E2E=true时只跑单 worker 的 chromium 项目,保证与种子数据共享的确定性
2. 登录态复用
CI 模式下的 chromium/firefox/webkit 三个浏览器项目都依赖setup项目先生成登录态playwright/.auth/user.json,再并行执行用例(见 playwright.config.ts 第 86-126 行)。
3. 本地 E2E 种子数据驱动
真正的重头戏在tests/e2e/local-*.spec.ts系列文件。以冒烟测试 apps/web/tests/e2e/local-smoke.spec.ts 为例:它读取localE2ESeed固定种子数据,断言文档列表和频道页面正确渲染出预期的实体(如 第 31-42 行)。这套文件与 Rust 集成测试共享同一份 seed fixture,保证前后端测的是同一个世界。
一键启动整套本地 E2E(起隔离栈 → 种子数据 → 跑 Playwright):
just local-e2e # 仅 web 套件 just local-e2e-rust # 仅 Rust 集成测试 just local-e2e-all # 两者都跑配方定义见 tooling/just/xtask.just,底层由 xtask 本地编排器统一拉起 Docker 服务栈。
四、第三层防线:Rust 集成测试 + 本地 E2E 栈 🦀
Rust 侧测试位于 crates/integration_tests/local_e2e/,包含三个测试入口:
- channel_mutations.rs:频道增删改查
- channel_websocket.rs:WebSocket 实时推送
- bot_entity_access.rs:机器人实体权限边界
关键设计(见 crates/integration_tests/local_e2e/README.md):
#[ignore]隔离:这些测试默认被忽略,日常cargo test不依赖 Docker 服务,只有显式-- --ignored或just local-e2e-rust才运行- 确定性栈:通过 xtask 编排器启动独立命名实例,种子数据与 Playwright 共用,跑完即弃,不留脏状态
- 测试后自清理:如 bot 权限测试用随机 UUID 建数据、验证后自行删行
此外,各数据库 crate(如 crates/macro_db_client/)还内置大量fixtures/*.sql离线 fixture 与单测,配合SQLX_OFFLINE=true的 clippy/check 门禁(tooling/just/rust.just),在提交前就把问题拦下。
五、给新手的可复制清单 ✅
- 单元优先:像 Macro 一样用 vitest projects 拆分测试域,让每个测试目录独立配置环境
- E2E 要“种子化”:固定种子数据 + 确定性栈,比每次手点一遍 UI 稳得多
- Rust 集成测试默认 ignore:保持日常
cargo test秒级反馈,重活交给专用编排命令 - 一键入口:把“起栈 → 种子 → 跑测试”封装成
just local-e2e-all这类单一命令(参考 根 justfile),新人五分钟就能跑通 - CI 加保险:
forbidOnly、失败重试、trace 保留(trace: 'retain-on-failure'),一个都不能少
这套三层防线让 Macro 在覆盖邮件、聊天、文档、CRM 等十几个功能域的同时,依然保持了从秒级单测到分钟级 E2E 的完整反馈梯度——值得任何中大型前端 + Rust 全栈项目借鉴。
【免费下载链接】macroMacro is a unified workspace for teams: email, chat, docs, tasks, agents, calls, and CRM — @-linked together with shared AI memory.项目地址: https://gitcode.com/GitHub_Trending/macro3/macro
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考