Skip to Content

18c - AI 驱动测试生成

本文是《AI Agent 实战手册》第 18 章第 3 节。 上一节:Agentic E2E 测试 | 下一节:PBT 深度指南

概述

AI 驱动测试生成正在重塑软件质量保障的方式——从手动编写测试用例,到由 AI 自动分析代码结构、理解需求文档、生成覆盖正常路径和边缘场景的测试代码。2025-2026 年,这一领域经历了从”辅助补全”到”自主生成”的跃迁:Qodo 的多 Agent 工作流能自动发现测试盲区,Kiro 的 Spec-Driven 流程将需求直接转化为 Property-Based Test,GitHub Copilot 的 /tests 命令让测试生成触手可及。本节系统讲解 AI 测试生成工具链、从需求到测试用例的自动化管线、以及多场景 Prompt 模板。


1. AI 测试生成工具全景

1.1 工具推荐

工具核心技术价格语言支持适用场景
Qodo (原 CodiumAI)多 Agent + RAG 管线免费版 / $30/用户/月 / 企业版联系销售Python, JS/TS, Java, Go, C++ 等上下文感知单元测试生成、PR 审查
Diffblue Cover强化学习(非 LLM)免费版(25 测试/月) / Pro ~$500/seat/年 / 企业版联系销售Java 专用大规模 Java 单元测试自动生成
GitHub CopilotLLM 代码补全 + Agent Mode免费版(2000 补全/月) / $10/月 / $39/月(Business)多语言IDE 内快速测试生成
Kiro (内置)Spec-Driven + PBT内置(Kiro 订阅)多语言需求驱动的 Property-Based Testing
TestSprite自主 AI Agent + 云沙箱免费试用 / 付费版联系销售JS/TS, Python自主生成、执行、自愈测试
ZencoderUnit Test Agent免费版 / $20/月起多语言遵循项目模式的单元测试生成
Cursor / Claude CodeLLM 对话式Cursor $20/月 / Claude Code $20/月多语言对话式测试生成与调试

1.2 工具选型决策树

你的主要语言是什么? ├── Java → Diffblue Cover(强化学习,无幻觉,企业级) ├── 多语言 + 企业合规需求 → Qodo Enterprise(SOC 2, 自托管) ├── 使用 Kiro IDE → Kiro Spec-Driven PBT(需求→属性→测试) ├── 使用 VS Code + Copilot → GitHub Copilot /tests 命令 ├── 需要自主测试 Agent → TestSprite(云沙箱执行) └── 通用对话式 → Cursor / Claude Code(灵活但需人工引导)

1.3 各工具核心差异

Qodo(原 CodiumAI) 采用多 Agent 架构:一个 Agent 分析代码上下文和依赖关系,另一个 Agent 生成测试用例,第三个 Agent 审查测试质量。其 RAG 管线能索引整个代码库,理解跨文件依赖,生成的测试更贴合项目实际。企业版支持 SOC 2 Type II 合规和自托管部署。

Diffblue Cover 是唯一不依赖 LLM 的 AI 测试工具——它使用强化学习直接从 Java 字节码生成测试,因此不会产生幻觉。系统以方法代码和项目结构为输入,通过强化学习生成包含边缘场景的 JUnit/TestNG 测试。最新版本引入了 LLM 增强智能和引导式覆盖率提升功能。

Kiro Spec-Driven PBT 是目前唯一将需求文档直接转化为可执行测试的工具。在 design.md 中定义正确性属性(Correctness Properties),Kiro 自动生成 Property-Based Test 代码,运行测试,发现反例时自动分析是代码 bug 还是 spec 问题。

TestSprite 是新兴的自主测试 Agent——它在云沙箱中自主规划、生成、执行和维护测试,支持 MCP 集成,能将修复建议推送回编码 Agent。在基准测试中,经过一轮迭代后测试通过率从 42% 提升到 93%。


2. Spec-Driven 测试生成工作流

2.1 核心理念:需求即测试

传统测试生成是”代码→测试”的后置流程,而 Spec-Driven 测试生成是”需求→属性→测试→代码”的前置流程:

传统流程: 写代码 → 写测试 → 发现 bug → 修代码 问题:测试只验证"代码做了什么",不验证"代码应该做什么" Spec-Driven 流程: 定义需求 → 提取正确性属性 → 生成 PBT → 写代码 → 运行测试 优势:测试验证"代码是否符合规格说明"

2.2 Kiro Spec-Driven 完整工作流

步骤 1:在 requirements.md 中定义验收标准

### Requirement 3: 文件同步引擎 #### Acceptance Criteria 1. WHEN a file is modified locally, THE sync engine SHALL detect the change within 5 seconds and queue a sync operation 2. WHEN syncing a file, THE sync engine SHALL compute a content hash and only transfer if the hash differs from the remote version 3. WHEN a sync conflict occurs, THE sync engine SHALL preserve both versions and notify the user

步骤 2:在 design.md 中定义正确性属性

## Correctness Properties Property 1: 哈希确定性 - 对于任意文件内容 content,hash(content) 在多次计算中必须返回相同结果 - Validates: Requirement 3, Criteria 2 Property 2: 同步幂等性 - 对于任意文件集合 files,如果本地和远程完全相同, computeSyncPlan(files, files) 的操作列表必须为空 - Validates: Requirement 3, Criteria 2 Property 3: 冲突检测完整性 - 对于任意两个不同内容的文件修改(本地和远程同时修改同一文件), sync engine 必须标记为冲突 - Validates: Requirement 3, Criteria 3

步骤 3:tasks.md 中生成测试任务

- [ ] 5.1 实现 Property 1 的 Property-Based Test(哈希确定性) - [ ] 5.2 实现 Property 2 的 Property-Based Test(同步幂等性) - [ ] 5.3 实现 Property 3 的 Property-Based Test(冲突检测完整性)

步骤 4:Kiro 自动执行

当执行测试任务时,Kiro 自动完成以下流程:

1. 读取 design.md 中的正确性属性定义 2. 分析目标代码的函数签名和类型信息 3. 选择合适的 PBT 框架(fast-check / proptest / Hypothesis) 4. 生成智能生成器(Generator),约束输入空间 5. 编写属性测试代码,标注 "Validates: Requirements X.Y" 6. 运行测试 7. 如果发现反例(counter-example): ├── 分析反例是否揭示代码 bug → 修复代码 ├── 分析反例是否揭示测试 bug → 修复测试 └── 分析反例是否揭示 spec 问题 → 提示用户确认 8. 更新 PBT 状态(passed / failed)

2.3 从需求到测试用例的自动化管线

对于不使用 Kiro 的团队,可以构建类似的自动化管线:

┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ 需求文档 │ │ AI 分析引擎 │ │ 测试代码 │ │ (PRD/User Story │────▶│ (LLM + RAG) │────▶│ (可执行测试) │ │ /验收标准) │ │ │ │ │ └─────────────────┘ └──────────────────┘ └─────────────────┘ │ │ │ ▼ ▼ ▼ 结构化输入 提取测试属性 生成测试代码 - 用户故事 - 正常路径 - 单元测试 - 验收标准 - 边缘场景 - 属性测试 - API 规格 - 错误处理 - 集成测试 - 业务规则 - 性能约束 - 断言验证

实现方式 1:使用 LLM API 构建管线

# requirements_to_tests.py - 需求到测试的自动化管线示例 import openai def extract_test_cases(requirement: str, code_context: str) -> str: """从需求文档和代码上下文中提取测试用例""" prompt = f""" 分析以下需求和代码,生成结构化的测试用例: ## 需求 {requirement} ## 代码上下文 {code_context} 请输出: 1. 正常路径测试用例(至少 3 个) 2. 边缘场景测试用例(至少 2 个) 3. 错误处理测试用例(至少 2 个) 4. 如果适用,提取可测试的属性(用于 Property-Based Testing) 输出格式:JSON """ response = openai.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": prompt}], response_format={"type": "json_object"} ) return response.choices[0].message.content

实现方式 2:使用 TestGenAI 等专用工具

遵循”需求 → 分析 → 特性 → 检查清单 → 测试用例”的方法论,将业务需求文档输入专用工具,自动生成可追溯的测试用例集。


3. Prompt 模板库

3.1 通用单元测试生成模板

你是一位资深测试工程师。基于以下代码,生成全面的单元测试。 ## 待测代码 文件路径:[文件路径]

[粘贴代码]

## 项目上下文 - 测试框架:[Jest/Vitest/Pytest/Go testing/JUnit] - 语言版本:[语言和版本] - 已有测试风格参考:[粘贴一个已有测试示例,如果有的话] ## 生成要求 1. 单元测试:覆盖正常路径、边缘场景、错误处理 2. 每个测试用例使用描述性命名(说明测试什么行为) 3. 不要使用 mock,尽量测试真实逻辑 4. 遵循 AAA 模式(Arrange-Act-Assert) 5. 包含以下场景: - 空输入 / null / undefined - 边界值(最大值、最小值、零) - 异常输入(错误类型、超长字符串) - 并发场景(如果适用)

3.2 Property-Based Testing 生成模板

你是一位精通 Property-Based Testing 的测试专家。基于以下代码和需求, 生成 PBT 测试。 ## 待测代码

[粘贴代码]

## 需求/验收标准 [粘贴相关需求] ## PBT 框架 使用 [fast-check (TypeScript) / proptest (Rust) / Hypothesis (Python) / QuickCheck (Haskell)] 框架 ## 生成要求 1. 从需求中提取至少 3 个可测试的属性(Property) 2. 每个属性包含: - 属性名称和描述 - 对应的需求编号(格式:Validates: Requirements X.Y) - 智能生成器(Generator)设计——约束到有意义的输入空间 - 属性断言 3. 不要使用 mock,测试真实逻辑 4. 生成器要考虑: - 输入范围的合理约束 - 特殊值的权重(空字符串、零、极大值) - 组合输入的关联约束 5. 测试命名格式:property_[属性描述]

3.3 从需求文档生成测试用例模板

你是一位 QA 架构师。将以下需求文档转化为结构化的测试用例集。 ## 需求文档 [粘贴 PRD / 用户故事 / 验收标准] ## 输出要求 ### 第一部分:测试用例矩阵 以表格形式输出: | 编号 | 测试场景 | 前置条件 | 操作步骤 | 预期结果 | 优先级 | 测试类型 | 测试类型包括:单元测试、集成测试、E2E 测试、属性测试 ### 第二部分:可执行测试代码 - 框架:[指定框架] - 对每个高优先级测试用例生成可执行代码 - 包含测试数据准备和清理 ### 第三部分:覆盖率分析 - 列出需求中每个验收标准的测试覆盖情况 - 标注未覆盖或难以自动化的场景 - 建议补充的手动测试场景 ### 第四部分:属性提取 - 从需求中提取适合 PBT 的属性 - 说明为什么这些属性适合用 PBT 验证

3.4 集成测试生成模板

你是一位后端测试专家。为以下 API 端点生成集成测试。 ## API 规格 端点:[HTTP 方法] [路径] 请求体: ```json [请求体 schema]

响应体:

[响应体 schema]

认证:[认证方式] 业务规则:[列出关键业务规则]

生成要求

  1. 正常路径测试(至少 3 个不同的有效输入)
  2. 参数验证测试(缺失字段、错误类型、超出范围)
  3. 认证/授权测试(未认证、权限不足、token 过期)
  4. 并发测试(如果涉及状态修改)
  5. 幂等性测试(如果是 PUT/DELETE)
  6. 使用真实数据库(测试数据库),不要 mock
  7. 每个测试包含数据准备和清理
### 3.5 测试审查与补全模板

你是一位测试审查专家。审查以下测试代码,找出覆盖盲区并补全。

待测源代码

[粘贴源代码]

现有测试代码

[粘贴现有测试]

审查要求

  1. 分析现有测试的覆盖情况:
    • 哪些代码路径已覆盖?
    • 哪些分支/条件未覆盖?
    • 哪些边缘场景遗漏?
  2. 评估测试质量:
    • 断言是否充分?(不只是”不抛异常”)
    • 是否存在过度 mock?
    • 测试是否脆弱(依赖实现细节)?
  3. 生成补充测试:
    • 只生成缺失的测试,不重复已有的
    • 优先补充高风险路径
    • 标注每个新测试覆盖的场景
--- ## 4. 各工具实操指南 ### 4.1 Qodo 实操 #### IDE 插件使用
  1. 安装 Qodo 插件(VS Code / JetBrains)
  2. 打开待测文件
  3. 右键选择 “Qodo: Generate Tests”
  4. Qodo 自动分析代码结构、依赖关系、边缘场景
  5. 生成测试代码,包含:
    • 正常路径测试
    • 边缘场景测试
    • 错误处理测试
    • 测试描述和注释
  6. 审查生成的测试,按需调整
#### CI/CD 集成 ```yaml # .github/workflows/qodo-tests.yml name: Qodo Test Generation on: pull_request: types: [opened, synchronize] jobs: generate-tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Qodo Test Coverage Analysis uses: qodo-ai/qodo-cover-action@v1 with: api-key: ${{ secrets.QODO_API_KEY }} coverage-threshold: 80 test-command: "npm test"

4.2 GitHub Copilot 实操

/tests 命令

在 VS Code 中: 1. 打开待测文件 2. 选中要测试的函数/类 3. 打开 Copilot Chat(Ctrl+Shift+I) 4. 输入:/tests 5. Copilot 分析选中代码,生成测试 6. 可追加上下文:/tests #file:utils.ts 使用 Vitest

Agent Mode 测试生成

在 Copilot Agent Mode 中: 1. 输入自然语言需求: "为 src/services/auth.ts 中的 AuthService 类生成完整的测试套件, 使用 Vitest,覆盖登录、注册、token 刷新、权限验证场景" 2. Agent 自动: - 分析 AuthService 的所有方法 - 识别依赖和接口 - 生成测试文件 - 运行测试并修复失败

4.3 Diffblue Cover 实操(Java)

1. 安装 Diffblue Cover IntelliJ 插件 2. 打开 Java 项目 3. 右键点击类/方法 → "Write Tests with Diffblue Cover" 4. Diffblue 使用强化学习(非 LLM)分析字节码 5. 自动生成 JUnit/TestNG 测试,包含: - 方法行为验证 - 边界条件测试 - 异常路径测试 6. 生成的测试是确定性的——相同输入总是产生相同测试 CLI 批量生成: $ dcover create --class com.example.MyService $ dcover create --project # 整个项目

4.4 Claude Code / Cursor 对话式测试生成

在 Claude Code 中: $ claude "读取 src/sync_engine.rs 的代码,为所有公开方法生成 proptest 属性测试。要求: 1. 每个属性对应一个业务规则 2. 生成器约束到合理的输入范围 3. 不使用 mock 4. 将测试写入 tests/sync_engine_props.rs" Claude Code 会: 1. 读取源文件,分析函数签名和类型 2. 推断业务规则和不变量 3. 设计智能生成器 4. 生成属性测试代码 5. 运行 cargo test 验证 6. 如果失败,自动修复

5. 2026 测试金字塔与 AI 生成策略

5.1 AI 增强的测试金字塔

┌───────────┐ │ E2E │ ← Agentic Testing(Bug0/TestSprite) │ (5-10个) │ AI 自主探索关键用户流程 ┌┴───────────┴┐ │ 集成测试 │ ← AI 生成 + 人工审查 │ (适量) │ Qodo/Copilot 生成 API 测试 ┌┴─────────────┴┐ │ 单元测试 │ ← AI 大量生成 + PBT 补充 │ (大量) │ Qodo/Diffblue/Copilot 自动生成 ┌┴───────────────┴┐ │ 属性测试 (PBT) │ ← Spec-Driven 自动生成 │ (核心逻辑) │ Kiro / 手动 Prompt ┌┴─────────────────┴┐ │ 静态分析 │ ← AI 驱动 lint + 安全扫描 │ (自动) │ CI 流水线自动运行 └───────────────────┘

5.2 各层级的 AI 生成策略

测试层级AI 生成方式人工参与度推荐工具
静态分析全自动仅配置规则ESLint + AI 规则、Clippy、SonarQube
属性测试Spec-Driven 自动生成定义属性、审查反例Kiro PBT、手动 Prompt
单元测试AI 批量生成审查 + 补充边缘场景Qodo、Diffblue、Copilot
集成测试AI 生成初稿审查 + 调整环境配置Copilot、Claude Code
E2E 测试Agentic 自主生成定义关键流程Bug0、TestSprite

实战案例:电商订单系统的 AI 测试生成全流程

场景描述

一个电商订单系统,核心功能包括:创建订单、计算价格(含折扣和税费)、库存扣减、订单状态流转。团队使用 Kiro + Qodo 组合进行测试生成。

步骤 1:从需求提取正确性属性

需求文档中的验收标准:

1. 订单总价 = Σ(商品单价 × 数量) × (1 - 折扣率) × (1 + 税率) 2. 库存扣减后,库存数量 = 原库存 - 订单数量,且库存不能为负 3. 订单状态只能按 created → paid → shipped → delivered 流转 4. 取消订单必须恢复库存

在 design.md 中定义属性:

Property 1: 价格计算正确性 - 对于任意正数的单价、数量、折扣率(0-1)、税率(0-0.5), 计算结果必须等于数学公式的精确值(允许浮点误差 0.01) Property 2: 库存守恒 - 对于任意订单操作序列(创建、取消), 最终库存 + 所有未取消订单的商品数量 = 初始库存 Property 3: 状态机合法性 - 对于任意状态转换序列,不存在非法转换 (如 created → delivered 跳过中间状态)

步骤 2:Kiro 生成 PBT

Kiro 自动生成的 TypeScript 属性测试(使用 fast-check):

import fc from 'fast-check'; import { calculateOrderTotal, OrderItem } from '../src/order'; describe('Order Properties', () => { // Property 1: 价格计算正确性 // Validates: Requirements 1 test('order total matches mathematical formula', () => { fc.assert( fc.property( fc.array( fc.record({ price: fc.double({ min: 0.01, max: 10000, noNaN: true }), quantity: fc.integer({ min: 1, max: 100 }) }), { minLength: 1, maxLength: 20 } ), fc.double({ min: 0, max: 1, noNaN: true }), // 折扣率 fc.double({ min: 0, max: 0.5, noNaN: true }), // 税率 (items, discount, taxRate) => { const result = calculateOrderTotal(items, discount, taxRate); const expected = items.reduce( (sum, item) => sum + item.price * item.quantity, 0 ) * (1 - discount) * (1 + taxRate); expect(Math.abs(result - expected)).toBeLessThan(0.01); } ) ); }); });

步骤 3:Qodo 补充单元测试

Qodo 分析代码后自动生成的边缘场景测试:

describe('calculateOrderTotal - Edge Cases', () => { test('空订单返回 0', () => { expect(calculateOrderTotal([], 0, 0.1)).toBe(0); }); test('100% 折扣返回 0', () => { const items = [{ price: 99.99, quantity: 5 }]; expect(calculateOrderTotal(items, 1.0, 0.1)).toBe(0); }); test('单个商品无折扣无税', () => { const items = [{ price: 10, quantity: 1 }]; expect(calculateOrderTotal(items, 0, 0)).toBe(10); }); test('大量商品不溢出', () => { const items = [{ price: 9999.99, quantity: 100 }]; const result = calculateOrderTotal(items, 0, 0); expect(result).toBeFinite(); expect(result).toBeGreaterThan(0); }); });

案例分析

这个案例展示了 AI 测试生成的分层策略:

  • PBT(Kiro):验证核心业务规则在所有输入下成立,发现人类难以想到的边缘场景
  • 单元测试(Qodo):覆盖具体的边缘值和特殊场景,作为回归测试的基线
  • 两者互补:PBT 保证”属性普遍成立”,单元测试保证”特定场景正确”

避坑指南

❌ 常见错误

  1. 完全信任 AI 生成的测试,不做审查

    • 问题:AI 生成的测试可能只覆盖”快乐路径”,遗漏关键边缘场景;断言可能过于宽松(如只检查”不抛异常”而不验证返回值)
    • 正确做法:AI 生成初稿后,人工审查断言质量、覆盖盲区,补充高风险场景
  2. 用 mock 让 AI 生成的测试通过

    • 问题:过度 mock 导致测试与真实行为脱节——测试全绿但生产环境出 bug
    • 正确做法:尽量测试真实逻辑,只在必要时 mock 外部依赖(网络、数据库、第三方 API)
  3. 忽略 PBT 发现的反例

    • 问题:PBT 发现的反例(counter-example)往往揭示真实 bug 或 spec 盲区
    • 正确做法:每个反例必须分类处理——代码 bug(修代码)、测试 bug(修测试)、spec 问题(与团队讨论)
  4. 对所有代码使用同一种 AI 测试工具

    • 问题:不同工具擅长不同场景——Diffblue 只支持 Java,Qodo 擅长上下文感知,Kiro 擅长 Spec-Driven
    • 正确做法:根据语言、项目类型、团队需求选择合适的工具组合
  5. 生成测试后不运行就提交

    • 问题:AI 生成的测试可能有语法错误、导入缺失、或依赖不存在的 API
    • 正确做法:生成后立即运行,确保所有测试通过,再提交到代码库
  6. 把 AI 测试生成当作”一次性”任务

    • 问题:代码演进后,AI 生成的测试可能过时或失效
    • 正确做法:将 AI 测试生成集成到 CI/CD 流程中,每次 PR 自动检查测试覆盖率

✅ 最佳实践

  1. 分层生成:PBT 验证核心属性,单元测试覆盖边缘场景,集成测试验证组件交互
  2. Spec-First:先定义需求和正确性属性,再生成测试,确保测试验证”应该做什么”而非”做了什么”
  3. 审查优先:AI 生成的测试是”初稿”,人工审查是”终稿”——重点审查断言质量和覆盖盲区
  4. 持续生成:将 AI 测试生成集成到开发工作流中(PR 触发、代码变更触发),而非一次性批量生成
  5. 反例驱动:PBT 发现的反例是最有价值的测试信号——建立反例分类和处理流程
  6. 工具组合:根据项目需求组合使用多个工具(如 Kiro PBT + Qodo 单元测试 + Bug0 E2E)

相关资源与延伸阅读

  1. Qodo 官方文档  — Qodo 测试生成的完整使用指南,包含 IDE 插件和 CI/CD 集成教程
  2. Diffblue Cover 文档  — Java AI 测试生成的官方文档,包含 IntelliJ 插件和 CLI 使用指南
  3. Kiro Spec-Driven 测试文档  — Kiro 正确性验证与 Property-Based Testing 的官方指南
  4. GitHub Copilot 测试生成教程  — GitHub 官方的 Copilot 测试生成最佳实践
  5. fast-check GitHub 仓库  — TypeScript/JavaScript Property-Based Testing 框架,Kiro PBT 的底层引擎之一
  6. TestSprite 官网  — 自主 AI 测试 Agent,支持 MCP 集成和云沙箱执行
  7. Zencoder Unit Test Agent  — AI 单元测试生成工具,遵循项目已有测试模式
  8. TestGenAI  — 从业务需求自动生成测试用例的在线工具
  9. Endor Labs: Test-First Prompting  — 使用 TDD 模式提升 AI 生成代码安全性的方法论
  10. proptest GitHub 仓库  — Rust Property-Based Testing 框架,灵感来自 Hypothesis

参考来源

Content was rephrased for compliance with licensing restrictions.


📖 返回 总览与导航 | 上一节:Agentic E2E 测试 | 下一节:PBT 深度指南

Last updated on