别只测页面有没有显示:用 danwo 给 Web 与移动应用做端到端故障测试
一条注册流程的 UI 测试通过,不代表用户真的只收到一封欢迎邮件;支付按钮能点,也不代表重复提交不会扣两次款。传统端到端测试常验证“页面看起来对不对”,但副作用是否正确,往往还要靠另一套脆弱的集成测试补足。
danwo 是 Carbonme Inc 发布的开源端到端测试框架,仓库采用 Apache-2.0。它的思路是先像用户一样驱动 UI,再按需检查后端状态:常规定位器测试不需要模型;自然语言步骤可以在首次运行时借助模型找出操作并记录,之后重放记录;若测试涉及支付、邮件或 webhook,则可加上模拟 Provider、业务不变量断言和故障矩阵。
先用确定性定位器覆盖关键路径
项目 README 给出的最小测试使用 @danwo/sdk 的 test,通过 app.open、screen.getByLabel 和 getByRole 操作页面。下面是同类写法的示意,具体选择器需与应用 DOM 相符:
import { test } from "@danwo/sdk"
test("用户可以注册", async ({ app, screen, expect }) => {
await app.open("/sign-up")
await screen.getByLabel("Email").fill("ada@example.com")
await screen.getByLabel("Password").fill("example-password")
await screen.getByRole("button", { name: "Create account" }).click()
await expect(screen.getByRole("heading", { name: "Welcome, Ada" })).toBeVisible()
})
这类测试不调用模型,适合登录、表单校验、导航等稳定交互。仓库说明支持 Web,以及 Android Emulator、iOS Simulator 上的移动应用;移动测试的主机要求与 Web 不同,开始前应按文档核对环境。
自然语言步骤适合探索,不必每次都付模型调用
当 UI 经常变化、定位器难以快速写出时,可以用 agent.act 描述任务,再用断言和截图检查结果。README 的示例是将两只蓝色马克杯加入购物篮并前往结账。首次运行需要模型与 API key,工具会记录操作;后续可重放记录,必要时才重新求助模型。CI 可以运行 danwo test --replay-only,确保该路径不调用模型。
import { test } from "@danwo/sdk"
test("购物篮中有两只蓝杯", async ({ app, agent, screen, expect }) => {
await app.open("/")
await agent.act("add two blue mugs to the basket and go to checkout")
await agent.assert("the basket shows two blue mugs")
await expect(screen).toHaveScreenshot("checkout")
})
要点是把自然语言当作记录生成与 UI 变化的适配方式,而非取消断言。对价格、数量、权限等关键结果,仍应保留可重复的确定性检查。
用不变量与故障矩阵检查副作用
如果测试注册流程,可在 UI 断言之外增加后端不变量:例如数据库中恰好一条注册记录、模拟邮件收件箱中恰好一封欢迎邮件。danwo README 展示了 .invariant(...) 回调,也列出 Stripe、Clerk、Resend、Google、Slack 等模拟 Provider;模拟器通过代理响应,无需真实沙箱密钥或修改应用代码(以各 Provider 文档的当前支持范围为准)。
接着可运行故障矩阵:
npx @danwo/cli matrix tests/waitlist.danwo.ts
README 示例会针对邮件服务 429、重置后响应、数据库序列化失败、重复提交等故障重跑测试,并由不变量判断系统是否仍满足业务规则。真实价值不是“故障越多越好”,而是把幂等性、重试和部分失败变成可执行的验收条件。上线前先选一条有明确副作用的流程,再逐步增加故障类型,避免一开始就把测试矩阵做得难以诊断。
安装与适用边界
项目 Quickstart 要求 Node.js 22.22.3 或更高的 22.x,或 24.11.1 及以上;新项目可在应用目录初始化:
npx @danwo/cli init npm run test:danwo
初始化过程会询问测试目标、模型/Provider 和编码 Agent 配置,并生成配置及首个测试。仓库同时说明项目仍处早期阶段、API 可能变化,因此建议先在非关键项目试跑,锁定依赖版本,并把生成的测试与记录纳入代码评审。移动端测试还需遵循官方 Android/iOS 环境要求。
danwo 适合希望把“用户界面行为”和“后台副作用”放在同一端到端验收里的团队;若只需要简单稳定的 DOM 断言,普通测试框架可能更轻。它不是免维护测试的捷径:模型生成的首次操作仍需审阅,而不变量要由团队根据业务定义。
相关链接