<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Quality on Codexer</title><link>https://codexer.com/tags/quality/</link><description>Recent content in Quality on Codexer</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 13 Jul 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://codexer.com/tags/quality/index.xml" rel="self" type="application/rss+xml"/><item><title>当 Codex 修坏了你的测试：自愈测试的「底线」在哪里？</title><link>https://codexer.com/posts/2026-07-13-codexer/</link><pubDate>Mon, 13 Jul 2026 09:00:00 +0800</pubDate><guid>https://codexer.com/posts/2026-07-13-codexer/</guid><description>&lt;p&gt;想象这样一个场景：你用 Codex 重构了一个前端组件，把按钮上的文案从&amp;quot;保存草稿&amp;quot;改成了&amp;quot;暂存&amp;quot;。Codex 很高效，三分钟搞定了组件代码、样式调整和国际化文件。你检查了一下，没问题，提交，push。&lt;/p&gt;
&lt;p&gt;然后 CI 炸了。&lt;/p&gt;
&lt;p&gt;Playwright 测试报错：&lt;code&gt;locator('button:has-text(&amp;quot;保存草稿&amp;quot;)')&lt;/code&gt; 找不到元素。这本该是一个无关紧要的选择器漂移——按钮还在，功能没变，只是文案改了。但 CI 红了，你的自动化流程卡住了。&lt;/p&gt;
&lt;p&gt;更糟糕的事情在后面。你让 Codex 去修这个失败的测试。Codex 很&amp;quot;聪明&amp;quot;——它读取了 Playwright 的错误日志，看到了新按钮的文案是&amp;quot;暂存&amp;quot;，然后它不只是修了选择器，还顺手调整了测试里的断言逻辑：把 &lt;code&gt;expect(page).toHaveText(&amp;quot;草稿已保存&amp;quot;)&lt;/code&gt; 改成了 &lt;code&gt;expect(page).toHaveText(&amp;quot;内容已暂存&amp;quot;)&lt;/code&gt;。测试绿了。Codex 骄傲地告诉你&amp;quot;修复完成&amp;quot;。&lt;/p&gt;
&lt;p&gt;但那个断言本应该失败的——后端 API 返回的文案实际上还是&amp;quot;草稿已保存&amp;quot;，因为后端的国际化没有跟着改。Codex 把真正的 bug 给&amp;quot;修绿&amp;quot;了。&lt;/p&gt;
&lt;p&gt;这正是 AI 编程时代的测试困境：&lt;strong&gt;Agent 对测试的&amp;quot;修复&amp;quot;能力越强，它掩盖真实回归问题的风险就越大。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="自愈测试的两层逻辑"&gt;自愈测试的两层逻辑&lt;/h2&gt;
&lt;p&gt;Ruslan 在 7 月 10 日的 Show HN 上发布了 &lt;a href="https://github.com/Quality-Max/9lives"&gt;9lives&lt;/a&gt;，一个专门为解决这个问题而设计的自愈测试运行器。它的核心设计哲学可以用一句话概括：&lt;strong&gt;选择器漂移该修，行为变化不该动。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;9lives 把测试修复分成了两级：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tier 1（离线、确定性、免费）&lt;/strong&gt;：当 Playwright 测试因为选择器找不到元素而失败时，9lives 会读取 Playwright 在失败瞬间捕获的页面快照（page snapshot），然后按照一个优先级链重新定位元素：&lt;code&gt;data-testid → id → aria-label → text → class&lt;/code&gt;。整个过程不需要 LLM，不联网，不需要 API 密钥。绝大多数选择器漂移在几秒内就能修复，零成本。&lt;/p&gt;
&lt;p&gt;这里有一个值得注意的技术细节：与 Healenium 等传统的自愈方案不同，9lives 不需要&amp;quot;之前的绿跑快照&amp;quot;作为基线——它完全从失败本身出发，分析失败时刻的 DOM 快照来找到最稳定的定位锚点。这意味着即使你的测试第一次跑就失败了（比如 CI 中全新 clone 的项目），它也能工作。&lt;/p&gt;</description></item></channel></rss>