---
title: "AI 生成代码的 QA - 博客"
canonical: https://wavect.io/zh/blog/qa-for-ai-generated-code/
language: zh
description: "Lovable、Cursor、Claude Code 和 Replit 生成的代码在上线前会在哪里出问题，以及 Wavect 用来排查的生产就绪清单。"
image: "https://wavect.io/img/blog/headers/header_qa-for-ai-generated-code.png"
---

[**返回**](/zh/blog/overview/)

[![Christof Jori](/img/team/christof.webp)](/zh/team/christof-jori/)

[Christof Jori](/zh/team/christof-jori/) https://linkedin.com/company/wavect

8 分钟 阅读 · 08 Jun 2026

[**下一篇**](/zh/blog/why-ai-agent-projects-get-cancelled/)

# AI 生成代码的 QA：上线前会出什么问题，以及如何排查

要点速览

AI 生成的代码不是更差的代码，是没被审过的代码：工具只优化"能跑且符合 prompt"，故障每次都聚在同样的地方，最常见的是只在前端做的授权检查、从不校验的输入、硬编码密钥、缺失的错误处理和无法扩展的查询。我们的生产就绪清单覆盖授权审计、输入边界测试、密钥清扫、失败路径、并发与依赖扫描。典型的 vibe-coded MVP 加固需要一到三周，先看代码再定范围。

相关服务: [Vibe Coding Rescue](/zh/services/vibe-coding-rescue/)

用 Lovable、Cursor、Claude Code 或 Replit 做出的 AI 原型，能在一个周末把你带到一个能跑的 demo。它带不了你到生产环境。"在我屏幕上能跑" 和 "扛得住真实用户、真实负载和一次安全审查" 之间的那道缝，正是 AI 生成代码悄悄失效的地方。这是我们对 AI 辅助构建在上线前所跑的 QA 流程，以及我们最常见到的失效模式。

这些都不是反对用 AI 来构建。我们自己也用 AI 构建。这是在说：要像测试任何即将触碰真实金钱、真实数据和真实用户的代码那样，去测试它的产出。

## 为什么 AI 生成的代码在生产环境会出问题？

AI 编码工具只优化一件事：产出一个能跑、且符合 prompt 的东西。它们不优化那些决定软件能否在用户接触下存活的东西。模型看不到你的威胁模型、你的数据量、你的边界情况，也看不到你的合规义务。它把 happy path 写得不错，几乎跳过其余一切，因为没人去问。

结果就是：demo 干净、出错可预测的代码。这些故障不是随机的。它们每次都聚在同样的地方，而这正是它们可被测试的原因。

## AI 生成的代码实际会在哪里出问题？

这是我们在每个 AI 辅助构建上逐项过的清单，按出问题的频率排序。

- **认证与授权的漏洞。** 登录页能用。那个阻止用户 A 读取用户 B 数据的检查缺失，或只在前端做。这是我们发现的最常见的严重缺陷，遥遥领先。
- **从不校验的输入。** 表单什么都收。没有长度限制，没有类型检查，没有清洗。demo 数据是干净的，所以这个漏洞从没暴露。
- **放错位置的密钥。** API key、数据库 URL 和 token 被硬编码进客户端代码，或被提交进仓库。AI 工具把它们内联进去，因为这样示例才能跑起来。
- **没有错误处理。** happy path 覆盖了。一次失败的网络调用、一次超时或一个空结果，就抛出未处理的异常，屏幕一片空白。
- **无法扩展的查询。** 把数据库调用塞进渲染里循环的代码，或为了数行数而拉整张表。10 条记录没事，10 万条就致命。
- **竞态条件与重复提交。** 点两下生成两个订单。两个并行请求都通过余额检查，都扣了款。
- **没人审过的依赖。** 模型引入了过时、被弃用或带有已知漏洞的包。
- **会说谎的状态。** UI 说支付成功了；后端从没记录过。乐观更新，却没有对账。

![Christof Jori](/img/team/christof.webp)

"AI 不是故意写出不安全的代码。它写的是你要求的代码，以及你忘了要求的那些都没写。生产环境，就是你忘了要求的一切之和。"

## AI 辅助构建的生产就绪清单

这是一次 Wavect 评审的结构。在你打电话给任何人之前，可以自己先跑一遍。

1. **授权审计。** 对每个端点、每次数据读取，确认服务端会检查谁在请求、是否被允许。前端检查不算数。
2. **输入边界测试。** 对每个入口点抛入畸形、超大和恶意的输入。确认它们被干净地拒绝，而不是被吞下。
3. **密钥清扫。** 扫描仓库和客户端打包产物，找 key、token 和凭证。把泄露的全部轮换，并挪到服务端。
4. **失败路径覆盖。** 强制每个外部调用失败，确认应用优雅降级而不是崩溃。
5. **负载与查询评审。** 在真实数据量下对数据库做性能剖析。在 N+1 查询和无界读取干掉你之前，先干掉它们。
6. **并发测试。** 对一切写入金钱或状态的地方，发起并行和重复请求。在缺失的地方补上幂等性。
7. **依赖与许可扫描。** 检查每个包是否有已知漏洞和不兼容的许可。
8. **回归套件。** 把原型从没有过的测试补上，这样下一次 AI 辅助的改动就不会悄悄弄坏已经能用的东西。关于为什么在 AI 写代码时这一点更重要、而非更不重要，参见 [测试驱动开发](/zh/glossary/tdd/) 。

这是我们 [软件 QA 服务](/zh/services/software-quality-assurance/) 的核心。交付的不是一份满是抱怨的 PDF，而是一个修好、测过的代码库，以及让它一直保持修好的测试套件。

## 我能不能直接让 AI 修它自己的代码？

部分可以。你一指到位置，AI 工具就会乐意加上一个校验检查，或把一个调用包进错误处理。它做不到的，是决定该去哪里看。它没有你的 [技术债](/zh/glossary/technical-debt/) 模型，不记得各部分是按什么顺序搭起来的，也没有那种直觉去预判真实用户第二天会撞上的边界情况。找出这些漏洞是人的活。补上它们，越来越是人机共担的活。我们正是这样推进这类合作的。对于其中一个窄 discovery 步骤，我们的 [Cisco Antares 本地 CWE 漏洞定位评测](/zh/blog/cisco-antares-local-vulnerability-localization/) 解释了为什么模型给出的候选文件仍必须由安全 reviewer 确认。

## 让 AI 生成的代码达到生产就绪，需要多久？

对一个典型的 vibe-coded MVP，一轮聚焦的评审加加固跑下来是一到三周。波动由两件事决定：产品触碰多少真实金钱或敏感数据，以及 AI 在无人监督下跑了多远。一个处理支付和个人数据的周末原型，需要的 QA 不止一个周末。一个只读的内部工具则少得多。我们在先看一眼之后再定范围，而不是在那之前。

## 代码什么时候已经救不回来了？

少见，但确实会发生。如果数据模型从根上就错了，或同一个坏模式被复制到了上百个文件里，那重建核心比打补丁更便宜。我们会在第一通电话里就告诉你这一点，而不是收你一个月的钱去修一个本该重新浇筑的地基。在这件事上诚实，对所有人都更便宜。

## 最终思考

AI 生成的代码不是更差的代码。它是没被审过的代码。那个花了一个周末的原型，跳过了每个生产系统都需要的那几周加固，而这几周的账单不会因为第一稿是模型写的就消失。它只是挪到了上线那天，在那时它最贵。

在你把真实用户放到一个 AI 辅助构建面前之前，先把清单过一遍。如果授权、输入和失败路径那几节让你心里发慌，那就是信号：在上线前、而不是事故后，找第二双眼睛来看一看。

## 你可能也喜欢..

[**外部 QA 基准：前 30 天** 公开缺陷研究支持什么、哪些 QA 指标可以比较，以及为什么不存在诚实的通用 bug 配额。](/zh/blog/external-qa-benchmark-first-30-days/) [**Wavect vs Dotbite** 对两家奥地利软件工作室的公允比较，以及哪一家更适合创始人主导的 AI 构建，哪一家更适合维也纳的定制软件项目。](/zh/compare/wavect-vs-dotbite/)

QA 与生产就绪

## 继续浏览此集群

- [外部 QA 基准：软件产品前 30 天通常会发现什么](/zh/blog/external-qa-benchmark-first-30-days/)
- [软件上线后维护要花多少钱：DACH SaaS 基准](/zh/blog/software-maintenance-cost-benchmark-dach-saas/)
- [敏捷去工程化](/zh/blog/agile-de-engineering/)
- [Lovable、Bolt 和 Replit 应用尽职调查](/zh/blog/lovable-bolt-replit-app-due-diligence/)
- [Vibe-Code 生产就绪清单](/zh/blog/vibe-code-production-readiness-checklist/)

只收重要内容

## 关注与你相关的内容

每当我们发布新文章，你会收到一封简短邮件。你可以关注整个博客，也可以只选感兴趣的主题。

[**返回**](/zh/blog/overview/)

[![Christof Jori](/img/team/christof.webp)](/zh/team/christof-jori/)

[Christof Jori](/zh/team/christof-jori/) https://linkedin.com/company/wavect

8 分钟 阅读 · 08 Jun 2026

[**下一篇**](/zh/blog/why-ai-agent-projects-get-cancelled/)

邮件订阅新文章 ×

×

通过邮件获取新文章

我们发布时给你一封简短邮件。免费，不做跟踪。

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/zh/blog/qa-for-ai-generated-code/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-07-07",
      "inLanguage": "zh",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-07-07",
      "url": "https://wavect.io/zh/blog/qa-for-ai-generated-code/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "abstract": "AI 生成的代码不是更差的代码，是没被审过的代码：工具只优化\"能跑且符合 prompt\"，故障每次都聚在同样的地方，最常见的是只在前端做的授权检查、从不校验的输入、硬编码密钥、缺失的错误处理和无法扩展的查询。我们的生产就绪清单覆盖授权审计、输入边界测试、密钥清扫、失败路径、并发与依赖扫描。典型的 vibe-coded MVP 加固需要一到三周，先看代码再定范围。",
  "articleBody": " 博客概览/交付与 QA/QA 与生产就绪 AI 生成代码的 QA：上线前会出什么问题，以及如何排查 要点速览 AI 生成的代码不是更差的代码，是没被审过的代码：工具只优化\"能跑且符合 prompt\"，故障每次都聚在同样的地方，最常见的是只在前端做的授权检查、从不校验的输入、硬编码密钥、缺失的错误处理和无法扩展的查询。我们的生产就绪清单覆盖授权审计、输入边界测试、密钥清扫、失败路径、并发与依赖扫描。典型的 vibe-coded MVP 加固需要一到三周，先看代码再定范围。 相关服务: Vibe Coding Rescue 用 Lovable、Cursor、Claude Code 或 Replit 做出的 AI 原型，能在一个周末把你带到一个能跑的 demo。它带不了你到生产环境。\"在我屏幕上能跑\" 和 \"扛得住真实用户、真实负载和一次安全审查\" 之间的那道缝，正是 AI 生成代码悄悄失效的地方。这是我们对 AI 辅助构建在上线前所跑的 QA 流程，以及我们最常见到的失效模式。 这些都不是反对用 AI 来构建。我们自己也用 AI 构建。这是在说：要像测试任何即将触碰真实金钱、真实数据和真实用户的代码那样，去测试它的产出。 为什么 AI 生成的代码在生产环境会出问题？ AI 编码工具只优化一件事：产出一个能跑、且符合 prompt 的东西。它们不优化那些决定软件能否在用户接触下存活的东西。模型看不到你的威胁模型、你的数据量、你的边界情况，也看不到你的合规义务。它把 happy path 写得不错，几乎跳过其余一切，因为没人去问。 结果就是：demo 干净、出错可预测的代码。这些故障不是随机的。它们每次都聚在同样的地方，而这正是它们可被测试的原因。 AI 生成的代码实际会在哪里出问题？ 这是我们在每个 AI 辅助构建上逐项过的清单，按出问题的频率排序。 认证与授权的漏洞。登录页能用。那个阻止用户 A 读取用户 B 数据的检查缺失，或只在前端做。这是我们发现的最常见的严重缺陷，遥遥领先。 从不校验的输入。表单什么都收。没有长度限制，没有类型检查，没有清洗。demo 数据是干净的，所以这个漏洞从没暴露。 放错位置的密钥。API key、数据库 URL 和 token 被硬编码进客户端代码，或被提交进仓库。AI 工具把它们内联进去，因为这样示例才能跑起来。 没有错误处理。happy path 覆盖了。一次失败的网络调用、一次超时或一个空结果，就抛出未处理的异常，屏幕一片空白。 无法扩展的查询。把数据库调用塞进渲染里循环的代码，或为了数行数而拉整张表。10 条记录没事，10 万条就致命。 竞态条件与重复提交。点两下生成两个订单。两个并行请求都通过余额检查，都扣了款。 没人审过的依赖。模型引入了过时、被弃用或带有已知漏洞的包。 会说谎的状态。UI 说支付成功了；后端从没记录过。乐观更新，却没有对账。 \"AI 不是故意写出不安全的代码。它写的是你要求的代码，以及你忘了要求的那些都没写。生产环境，就是你忘了要求的一切之和。\" AI 辅助构建的生产就绪清单 这是一次 Wavect 评审的结构。在你打电话给任何人之前，可以自己先跑一遍。 授权审计。对每个端点、每次数据读取，确认服务端会检查谁在请求、是否被允许。前端检查不算数。 输入边界测试。对每个入口点抛入畸形、超大和恶意的输入。确认它们被干净地拒绝，而不是被吞下。 密钥清扫。扫描仓库和客户端打包产物，找 key、token 和凭证。把泄露的全部轮换，并挪到服务端。 失败路径覆盖。强制每个外部调用失败，确认应用优雅降级而不是崩溃。 负载与查询评审。在真实数据量下对数据库做性能剖析。在 N+1 查询和无界读取干掉你之前，先干掉它们。 并发测试。对一切写入金钱或状态的地方，发起并行和重复请求。在缺失的地方补上幂等性。 依赖与许可扫描。检查每个包是否有已知漏洞和不兼容的许可。 回归套件。把原型从没有过的测试补上，这样下一次 AI 辅助的改动就不会悄悄弄坏已经能用的东西。关于为什么在 AI 写代码时这一点更重要、而非更不重要，参见测试驱动开发。 这是我们软件 QA 服务的核心。交付的不是一份满是抱怨的 PDF，而是一个修好、测过的代码库，以及让它一直保持修好的测试套件。 我能不能直接让 AI 修它自己的代码？ 部分可以。你一指到位置，AI 工具就会乐意加上一个校验检查，或把一个调用包进错误处理。它做不到的，是决定该去哪里看。它没有你的技术债模型，不记得各部分是按什么顺序搭起来的，也没有那种直觉去预判真实用户第二天会撞上的边界情况。找出这些漏洞是人的活。补上它们，越来越是人机共担的活。我们正是这样推进这类合作的。对于其中一个窄 discovery 步骤，我们的Cisco Antares 本地 CWE 漏洞定位评测解释了为什么模型给出的候选文件仍必须由安全 reviewer 确认。 让 AI 生成的代码达到生产就绪，需要多久？ 对一个典型的 vibe-coded MVP，一轮聚焦的评审加加固跑下来是一到三周。波动由两件事决定：产品触碰多少真实金钱或敏感数据，以及 AI 在无人监督下跑了多远。一个处理支付和个人数据的周末原型，需要的 QA 不止一个周末。一个只读的内部工具则少得多。我们在先看一眼之后再定范围，而不是在那之前。 代码什么时候已经救不回来了？ 少见，但确实会发生。如果数据模型从根上就错了，或同一个坏模式被复制到了上百个文件里，那重建核心比打补丁更便宜。我们会在第一通电话里就告诉你这一点，而不是收你一个月的钱去修一个本该重新浇筑的地基。在这件事上诚实，对所有人都更便宜。 最终思考 AI 生成的代码不是更差的代码。它是没被审过的代码。那个花了一个周末的原型，跳过了每个生产系统都需要的那几周加固，而这几周的账单不会因为第一稿是模型写的就消失。它只是挪到了上线那天，在那时它最贵。 在你把真实用户放到一个 AI 辅助构建面前之前，先把清单过一遍。如果授权、输入和失败路径那几节让你心里发慌，那就是信号：在上线前、而不是事故后，找第二双眼睛来看一看。 你可能也喜欢.. 外部 QA 基准：前 30 天 公开缺陷研究支持什么、哪些 QA 指标可以比较，以及为什么不存在诚实的通用 bug 配额。 Wavect vs Dotbite 对两家奥地利软件工作室的公允比较，以及哪一家更适合创始人主导的 AI 构建，哪一家更适合维也纳的定制软件项目。 QA 与生产就绪继续浏览此集群外部 QA 基准：软件产品前 30 天通常会发现什么软件上线后维护要花多少钱：DACH SaaS 基准敏捷去工程化Lovable、Bolt 和 Replit 应用尽职调查Vibe-Code 生产就绪清单 集群中的上一篇把一个 vibe-coded 应用做到生产可用要花多少钱？集群中的下一篇从 Lovable 和 Cursor 原型到生产：迁移清单 最合适的下一步： Vibe Coding 救援 软件 QA 软件开发 Fractional CTO AI 咨询 看看生产环境中的应用: Polity 先做决定: 如何把 vibe coding 出来的原型推向生产环境 只收重要内容 关注与你相关的内容 每当我们发布新文章，你会收到一封简短邮件。你可以关注整个博客，也可以只选感兴趣的主题。 Company 电子邮箱 你希望接收哪些内容？ 完整的 Wavect 博客接收六个主题下的每一篇新文章。 仅接收所选主题请在下方选择一个或多个分类。 选择主题 AI 与智能体 产品与 MVP 交付与 QA 领导力与团队 商业与监管 Web3 与隐私 我希望接收所选的 Wavect 博客邮件，并已阅读 隐私信息。我可以随时退订。 发送确认邮件→ 免费、双重确认、不使用跟踪像素。 ",
  "articleSection": "Engineering",
  "author": {
    "@id": "https://wavect.io/team/christof-jori/#person",
    "@type": "Person",
    "name": "Christof Jori",
    "sameAs": [
      "https://www.wikidata.org/wiki/Q139796367",
      "https://www.linkedin.com/in/jocr77/",
      "https://github.com/jo-chris"
    ],
    "url": "https://wavect.io/team/christof-jori/"
  },
  "dateModified": "2026-07-07",
  "datePublished": "2026-06-08",
  "description": "AI 生成的代码不是更差的代码，是没被审过的代码：工具只优化\"能跑且符合 prompt\"，故障每次都聚在同样的地方，最常见的是只在前端做的授权检查、从不校验的输入、硬编码密钥、缺失的错误处理和无法扩展的查询。我们的生产就绪清单覆盖授权审计、输入边界测试、密钥清扫、失败路径、并发与依赖扫描。典型的 vibe-coded MVP 加固需要一到三周，先看代码再定范围。",
  "headline": "AI 生成代码的 QA",
  "image": "https://wavect.io/img/blog/headers/header_qa-for-ai-generated-code.svg",
  "inLanguage": "zh",
  "mainEntityOfPage": {
    "@id": "https://wavect.io/zh/blog/qa-for-ai-generated-code/",
    "@type": "WebPage"
  },
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/zh/blog/qa-for-ai-generated-code/",
  "wordCount": 222
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/",
      "name": "首页",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/overview/",
      "name": "博客概览",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/topics/delivery-qa/",
      "name": "交付与 QA",
      "position": 3
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/clusters/qa-production/",
      "name": "QA 与生产就绪",
      "position": 4
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/qa-for-ai-generated-code/",
      "name": "AI 生成代码的 QA - 博客 | ",
      "position": 5
    }
  ]
}
```
