2026年7月11日 2 分钟阅读

9lives 场景:AI 编码 Agent 改坏了你的测试?让 9lives 自动修复

tinyash 0 条评论

你的 Claude Code 刚重构了一个按钮的实现,CI 瞬间飘红。你切过去一看——Playwright 测试中 page.getByRole('button', { name: '提交订单' }) 找不到了,因为按钮的文字被你改成了”确认提交”。

以前的做法:打开测试文件,手动找定位器,改一下,重新跑。如果 Agent 一天改 10 个地方,你就得修 10 次测试。

9lives 就是来解决这个问题的——一个自愈式测试运行器(Self-healing QA),专为 AI 编码 Agent 时代设计。当你的 Agent 改了代码把测试搞坏了,9lives 自动分析失败原因、修复定位器、重跑验证,全程不需要你手动改一行测试。MIT 开源,pip install 9lives 一键安装,支持 Playwright、Cypress 和 Selenium。

安装

9lives 提供多种安装方式:

pip install 9lives

uv tool install 9lives

curl -sL 9lives.run | sh

9l doctor

需要 Node.js ≥ 18(Playwright 本身依赖 Node.js 运行时),你的 Playwright 项目结构保持不变。

场景一:Agent 改了按钮,测试自动修复

这是 9lives 最核心的场景——Selector Drift(定位器漂移)。你的 AI 编码 Agent 改了 UI 文案,Playwright 测试找不到元素了:

9l heal tests/login.spec.ts

9lives 做了四件事:

  1. 运行测试,捕获失败时的页面快照和错误信息
  2. Tier 1 离线修复:用快照中的 DOM 重新查找目标元素(按 text、testid、id、class、aria-label 多维度搜索),自动重写定位器——完全离线,零 API 调用
  3. 重跑验证,确认修复后的测试通过
  4. 展示 diff,等你确认后写入文件

整个过程在你的机器上完成,不需要任何 API key。输出是标准的 unified diff 格式,改动一目了然。

场景二:结构性变更,需要 Agent 的推理能力

如果定位器漂移发生在更复杂的场景——比如整个组件被重写、DOM 结构调整——Tier 1 的离线模式不够用。这时 9lives 自动升级到 Tier 2

9l heal checkout.spec.ts

Tier 2 会把当前失败测试、页面快照和错误信息打包成一个 prompt,直接调用你本机已安装的 Claude CodeCodexOpenCode CLI。这意味着:

  • 使用你已有的订阅(你的 Agent CLI 已经登录了账号),不需要额外申请 API key
  • Agent 的推理能力用于理解 DOM 结构变化,而不仅仅是匹配选择器
  • 修复后的 diff 仍然需要你确认后才写入

如果某个 Agent CLI 不可用,9lives 自动降级到下一个可用 CLI。你也可以通过环境变量强制指定:

NINELIVES_PROVIDER=anthropic 9l heal checkout.spec.ts

场景三:给 Agent 的 MCP 工具——开发循环内自愈

9lives 提供了一个 MCP 服务器,让 AI 编码 Agent 在写代码的循环中就能自愈测试,而不必等到 CI 阶段:

claude mcp add 9lives -- 9l mcp

注册后,Agent 可以调用 heal_testrun_test 两个 MCP 工具。Agent 写完代码跑测试发现失败时,不用等你介入——它自己调用 heal_test,修复定位器,确认 diff 后继续工作。

Agent 的 assertion 失败不会被静默修复——9lives 会明确标记为 needs-human,并提示”强制变绿会掩盖真正的 bug”。

其他实用命令

9l watch tests/ --yes

9l heal e2e/login.spec.ts --yes

9l report

9l report --md brittle-selectors.md

9l watch 配合 --yes 可以把修复嵌入编辑-保存循环——你改代码保存,测试自动修复,完全无感。

GitHub Actions 集成

在你的流水线中加一步,CI 自愈:

- uses: quality-max/9lives/action@v1
  with:
    specs: "tests/**/*.spec.ts"
    anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
    commit-healed: "true"

在你自己的 runner 上运行,用你自己的 API key,修复后的测试自动提交回分支,PR 上还会贴一份 🐾 报告。

支持三种测试框架

9lives 不只是 Playwright 的专属工具:

框架检测方式工作流
Playwright.spec.ts / 项目依赖原生支持,自动 scaffold
Cypress.cy.js / .cy.ts在你的项目中运行 npx cypress run
Selenium.py在你的 pytest 环境中运行
9l heal cypress/e2e/login.cy.js     # Cypress 测试
9l heal tests/test_checkout.py      # Selenium 测试

Cypress 的定位错误包装在 AssertionError 中,9lives 能识别出这是 selector drift 而非真正的断言失败——不会误判。

不会掩盖真正的 bug

这是 9lives 最重要的设计原则。assertion 失败不会被自动修复——如果测试中的断言(”页面包含’支付成功'”)失败了,说明应用的行为发生了变化,而不是选择器漂移。9lives 拒绝重写 assertion 来强制测试变绿,这是它与”傻瓜式自愈工具”的核心区别。

如果你正在开发阶段确实想更新断言(比如文案从”支付成功”改成了”订单已提交”),可以通过环境变量启用:

NINELIVES_HEAL_ASSERTIONS=1 9l heal payment.spec.ts

隐私与安全

  • Tier 1 完全离线,不发送任何数据
  • Tier 2 的 prompt 构建自失败测试和页面快照;在 subscription 模式下通过本地 Agent CLI 处理,在你的机器上完成
  • 测试记录(.9lives/history.jsonl)始终存在本地,不上传任何第三方
  • 所有操作都在你的机器或你的 CI runner 上执行

相关链接

发表评论

你的邮箱地址不会被公开,带 * 的为必填项。