[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fmtBHSwUGRZ1IHXmK1ZB25uliz3Kh_CSFACtOOGM4edk":3},{"item":4,"related":51},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":39,"sourceName":40,"sourceUrl":41,"status":42,"seoTitle":43,"seoDescription":44,"canonicalUrl":45,"isFeatured":46,"sno":47,"sortOrder":48,"publishedAt":49,"updatedAt":50,"createdAt":50},"e958c89d-ebf2-4e02-ad21-b66cf10efa07","article","AI 写出来的测试靠谱吗？测试通过就代表没问题吗","ai-generated-tests-are-not-proof","AI 可以快速生成测试，但绿色结果只说明当前输入触发了当前断言。本文拆解 AI 测试最常见的遗漏，介绍如何用行为表、真实数据和故障注入判断测试是否真的在保护产品。","“测试都通过了”听起来像一句结论，但在 AI 编程项目里，它更像一个需要继续追问的证据。测试可能是 AI 刚刚生成的，也可能只覆盖了它自己写出的实现；如果断言写错，测试通过反而会让人更安心地忽略问题。\n\n## 测试通过到底证明了什么\n\n一个测试至少包含输入、执行过程和预期结果。它通过，只能说明当前代码在这个输入和这个断言下得到了预期结果。如果输入过于简单、断言过于宽松，或者测试根本没有被真正执行，绿色结果并不代表功能符合用户需要。\n\n例如，一个登录测试只断言“页面没有报错”，却不检查错误密码是否被拒绝；一个价格测试只检查返回值是数字，却不检查货币单位；一个导出测试只检查文件存在，却没有打开文件确认内容。这样的测试可以很稳定地通过，却没有验证关键行为。\n\n## AI 生成测试最容易犯的四种错\n\n第一，围着实现细节写测试。模型看到某个私有函数，就直接断言它被调用几次；以后只要重构实现，测试马上失败，即使用户行为没有改变。\n\n第二，只覆盖快乐路径。正常输入、正常网络、正常权限很容易生成，但空值、超长文本、重复点击、超时和权限不足往往被遗漏。\n\n第三，复制同一种样例。十个测试使用几乎相同的数据，看起来数量很多，实际覆盖范围仍然很窄。\n\n第四，为了让测试通过而修改断言。当实现与需求不一致时，AI 可能把预期结果改成当前结果。测试没有再报错，产品却没有变正确。\n\n## 怎样让测试真正帮助开发\n\n先写行为表，再让 AI 补代码。行为表至少包含条件、动作和结果：\n\n| 条件 | 动作 | 应观察到的结果 |\n| --- | --- | --- |\n| 标签为空 | 打开筛选器 | 显示全部内容，不出现异常 |\n| 用户重复提交 | 连续点击保存 | 只创建一条记录 |\n| 网络超时 | 等待接口返回 | 显示可理解提示，按钮可以重试 |\n\n有了这些行为，模型可以生成测试，但人仍然要检查每个断言是否对应用户真正关心的结果。官方的单元测试提示建议把测试拆成少量、聚焦、相互独立的案例，并使用接近真实场景的数据；这比单纯追求数量更有价值。\n\n## 测试之外，还要检查测试本身\n\n可以做三件事。第一，故意让实现出错，确认测试真的会失败；如果删掉权限判断后测试仍然全绿，说明覆盖不足。第二，查看测试是否被测试运行器发现，避免文件命名或配置错误导致“没有运行”。第三，定期删除重复测试，保留能表达业务规则的案例。\n\n高风险功能还需要更高层次的检查。支付、权限、数据迁移和文件上传，不能只靠单元测试；还需要集成测试、端到端测试、静态分析和人工演练。不同层次的测试负责发现不同类型的问题。\n\n## 一条适合 Vibe Coding 的原则\n\n让 AI 负责扩大测试覆盖，让人负责定义什么值得被覆盖。每次生成测试时都要求它解释：这个案例防止哪一种回归？如果不能回答，测试很可能只是为了增加绿色数字。\n\n所以，“测试通过”应该被翻译成更准确的一句话：在已经定义并真正执行的这些场景下，当前实现没有触发断言失败。它是有用的信号，但从来不是产品正确性的证明。\n\n## 来源\n\n- [GitHub Copilot 负责任使用说明](https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcopilot\u002Fresponsible-use)\n- [GitHub Copilot：生成单元测试的提示示例](https:\u002F\u002Fdocs.github.com\u002Fes\u002Fcopilot\u002Ftutorials\u002Fcustomization-library\u002Fprompt-files\u002Fgenerate-unit-tests)","\u002Fuploads\u002F2026-09-13\u002F04a1c4c6-4a18-4122-9fb7-e8c237fdee9c.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31,35],{"id":24,"name":25,"slug":26},"0848beb4-db26-4fb8-b391-f852a11be192","AI编程","ai-coding",{"id":28,"name":29,"slug":30},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding",{"id":32,"name":33,"slug":34},"63b56667-dcdb-4b8b-bcbe-c405143a7ec2","测评","test",{"id":36,"name":37,"slug":38},"4c2bbea6-eab7-40a8-8447-1de478ff7749","分析","analyse","GitHub Copilot 官方文档","GitHub Copilot：生成单元测试的提示示例","https:\u002F\u002Fdocs.github.com\u002Fes\u002Fcopilot\u002Ftutorials\u002Fcustomization-library\u002Fprompt-files\u002Fgenerate-unit-tests","published","AI 生成测试靠谱吗：测试通过为何不等于没问题","解释 AI 生成测试的常见盲点，区分断言通过与真实行为正确，并给出行为表、故障注入和多层测试的实用方法。",null,false,47,0,"2026-09-13T00:00:00.000Z","2026-09-13T11:55:46.344Z",[52,60,69],{"id":53,"type":6,"title":54,"slug":55,"summary":56,"coverUrl":57,"authorName":14,"sno":58,"publishedAt":49,"createdAt":59},"88cd83c5-bb5f-411a-85bf-1eefdcacebf4","AI 代码审查能不能替代人类 Code Review","ai-code-review-human-review","AI 很适合做第一轮代码审查，却不一定理解业务语义、风险取舍和变更完整性。本文梳理 AI 审查的强项与盲区，并给出自动检查、AI 建议和人工批准的三层协作方式。","\u002Fuploads\u002F2026-09-13\u002F1ff872e2-ecfe-4bd4-9dd1-327a09a8f6dc.jpg",41,"2026-09-13T11:55:47.724Z",{"id":61,"type":6,"title":62,"slug":63,"summary":64,"coverUrl":65,"authorName":14,"sno":66,"publishedAt":67,"createdAt":68},"9ad033ff-1bd4-49bd-b843-635ae2c48eaa","Property-based Testing：不要只测试几个例子","property-based-testing-ai-coding","性质测试通过描述输入输出应保持的规律，自动生成大量边界样本，帮助发现 AI 生成代码中隐藏的错误。","\u002Fuploads\u002F2026-09-14\u002Ff5f43a98-2205-40be-b69c-cba464cac309.jpg",43,"2026-09-14T00:00:00.000Z","2026-09-14T15:01:45.728Z",{"id":70,"type":6,"title":71,"slug":72,"summary":73,"coverUrl":74,"authorName":14,"sno":75,"publishedAt":49,"createdAt":76},"7cc644a5-e0de-4d7b-802e-9e8b69677e12","AI 生成的代码会不会复制开源项目","ai-code-open-source-reference-license","AI 生成代码不等于天然没有来源。本文区分常见写法与高相似片段，解释代码引用、许可证、依赖供应链和轻量来源检查，帮助团队把合规当成代码质量的一部分。","\u002Fuploads\u002F2026-09-13\u002F920327ad-de7f-4caa-a2f4-816d467c9f9c.jpg",40,"2026-09-13T11:55:49.911Z"]