第 9 章

测试与质量

掌握如何利用 AI 提升测试效率和质量,学习 AI 辅助测试用例生成、测试代码编写、测试优化等最佳实践。

使用 Sequential Thinking 学习 AI 驱动的测试

AI 在测试中的应用涉及多个层面,使用结构化思考方法可以帮助你系统掌握:

1
测试类型概览
单元测试、集成测试、E2E 测试快速了解
2
AI 辅助测试用例生成
单元测试、集成测试、E2E 测试用例生成
3
AI 辅助测试代码编写
测试框架使用、Mock 数据生成、测试数据准备
4
AI 辅助测试优化
性能优化、覆盖率分析、测试重构
5
AI 驱动的测试自动化
CI/CD 集成、测试报告生成、缺陷预测

测试类型概览

快速了解测试类型,为 AI 实践提供背景知识。

单元测试

测试单个函数或组件,快速反馈,覆盖率高。

集成测试

测试多个模块协作,验证接口和数据流。

E2E 测试

端到端测试,模拟真实用户操作。

性能测试

测试系统性能和负载能力。

AI 在测试中的最佳实践

利用 AI 提升测试效率和质量,从测试用例生成到测试自动化的全流程 AI 辅助实践。

AI 辅助测试用例生成

使用 AI 生成单元测试用例

向 AI 描述函数功能,让它生成完整的测试用例:

Prompt 模板:

我需要为以下函数生成单元测试用例:

// utils/calculateTotal.ts
export function calculateTotal(items: Item[]): number {
  if (!items || items.length === 0) return 0
  return items.reduce((sum, item) => {
    if (item.price && item.quantity) {
      return sum + item.price * item.quantity
    }
    return sum
  }, 0)
}

interface Item {
  price?: number
  quantity?: number
}

请使用 Jest/Vitest 生成测试用例,包含:
- 正常情况测试
- 边界情况测试(空数组、null、undefined)
- 异常情况测试(缺少 price 或 quantity)
- 使用 describe 和 it 组织测试
- 使用清晰的测试描述

AI 生成的测试用例示例

// utils/calculateTotal.test.ts
import { describe, it, expect } from 'vitest'
import { calculateTotal } from './calculateTotal'

describe('calculateTotal', () => {
  it('should return 0 for empty array', () => {
    expect(calculateTotal([])).toBe(0)
  })

  it('should return 0 for null or undefined', () => {
    expect(calculateTotal(null as any)).toBe(0)
    expect(calculateTotal(undefined as any)).toBe(0)
  })

  it('should calculate total for valid items', () => {
    const items = [
      { price: 10, quantity: 2 },
      { price: 5, quantity: 3 }
    ]
    expect(calculateTotal(items)).toBe(35) // 10*2 + 5*3 = 35
  })

  it('should ignore items without price', () => {
    const items = [
      { price: 10, quantity: 2 },
      { quantity: 3 }
    ]
    expect(calculateTotal(items)).toBe(20)
  })

  it('should ignore items without quantity', () => {
    const items = [
      { price: 10, quantity: 2 },
      { price: 5 }
    ]
    expect(calculateTotal(items)).toBe(20)
  })

  it('should handle zero price or quantity', () => {
    const items = [
      { price: 0, quantity: 2 },
      { price: 10, quantity: 0 }
    ]
    expect(calculateTotal(items)).toBe(0)
  })
})

AI 生成集成测试场景

Prompt:

我需要为用户注册 API 生成集成测试场景:

API: POST /api/users/register
请求体: { email, password, name }
响应: { id, email, name, createdAt }

请生成测试用例,包含:
- 成功注册场景
- 邮箱已存在场景
- 密码强度不足场景
- 缺少必填字段场景
- 使用测试数据库
- 清理测试数据

AI 生成 E2E 测试流程

Prompt:

我需要为购物车流程生成 E2E 测试:

用户流程:
1. 访问首页
2. 搜索商品
3. 添加商品到购物车
4. 查看购物车
5. 结算
6. 填写订单信息
7. 提交订单

请使用 Playwright 生成完整的 E2E 测试代码,包含:
- 页面导航
- 元素定位
- 用户交互
- 断言验证
- 错误处理

TDD 实践基础

保留核心概念,重点展示 AI 如何辅助 TDD。使用 AI 可以快速生成测试用例、实现代码和重构建议。

红(Red)

编写失败的测试,定义期望行为

绿(Green)

编写最小实现,让测试通过

重构(Refactor)

优化代码,保持测试通过

AI 辅助 TDD

AI 可以在 TDD 的每个阶段提供帮助:生成测试用例、快速实现、重构建议。参考上面的"AI 辅助 TDD 实践"章节查看详细示例和 Prompt 模板。

测试工具基础

保留核心工具介绍,重点展示 AI 如何辅助工具选择。

Jest

JavaScript 测试框架,内置断言和 Mock

Vitest

快速测试框架,Vite 原生支持,TypeScript 友好

Playwright

E2E 测试框架,多浏览器支持

AI 辅助工具选型

使用 AI 根据项目需求选择合适的测试工具。向 AI 描述项目特点(Next.js、TypeScript、需要 E2E 测试等),它会推荐合适的工具组合和配置方案。

质量保证基础

保留核心概念,重点展示 AI 如何辅助质量保证。

测试策略

  • 测试金字塔:大量单元测试 + 适量集成测试 + 少量 E2E 测试
  • 关键路径优先:优先测试核心业务逻辑
  • 边界测试:测试边界条件和异常情况

代码覆盖率

  • 行覆盖率:执行的代码行数比例
  • 分支覆盖率:执行的代码分支比例
  • 目标:关键代码 80%+,整体 60%+

AI 辅助质量保证

AI 可以分析测试策略、生成质量报告、识别未覆盖的代码路径。参考上面的"AI 辅助覆盖率分析"和"AI 驱动的测试自动化"章节查看详细示例和 Prompt 模板。

实战示例

通过实际代码示例,学习如何使用 AI 提升测试效率和质量。

AI 生成测试用例

完整的测试用例生成示例(Prompt + 结果):

// 1. 向 AI 提供需求
Prompt: "为 calculateTotal 函数生成单元测试,包含正常情况、边界情况、异常情况..."

// 2. AI 生成的测试用例
describe('calculateTotal', () => {
  it('should return 0 for empty array', () => {
    expect(calculateTotal([])).toBe(0)
  })
  
  it('should calculate total for valid items', () => {
    const items = [
      { price: 10, quantity: 2 },
      { price: 5, quantity: 3 }
    ]
    expect(calculateTotal(items)).toBe(35)
  })
  
  // ... 更多测试用例
})

AI 优化测试代码

测试代码优化示例(优化前后对比):

优化前(45 秒)
// 每个测试都调用真实 API
describe('UserService', () => {
  it('should fetch user', async () => {
    const user = await fetchUser('1') // 真实 API 调用
    expect(user.id).toBe('1')
  })
  
  it('should update user', async () => {
    const user = await fetchUser('1') // 重复调用
    await updateUser('1', { name: 'New' })
    expect(user.name).toBe('New')
  })
})
AI 优化后(5 秒)
// AI 建议:使用 Mock 替代真实 API
vi.mock('./api', () => ({
  fetchUser: vi.fn().mockResolvedValue({ id: '1', name: 'Test' }),
  updateUser: vi.fn().mockResolvedValue({ id: '1', name: 'New' })
}))

describe('UserService', () => {
  it('should fetch user', async () => {
    const user = await fetchUser('1')
    expect(user.id).toBe('1')
  })
  
  it('should update user', async () => {
    await updateUser('1', { name: 'New' })
    expect(updateUser).toHaveBeenCalledWith('1', { name: 'New' })
  })
})

AI 分析覆盖率

覆盖率分析和补充建议示例:

// AI 分析覆盖率报告
覆盖率:65%

未覆盖的代码:
- utils/validation.ts:45%
  - validateEmail 的错误处理分支未测试
  - validatePassword 的边界情况未测试

AI 建议补充的测试用例:
it('should return false for invalid email', () => {
  expect(validateEmail('invalid')).toBe(false)
  expect(validateEmail('invalid@')).toBe(false)
  expect(validateEmail('@domain.com')).toBe(false)
})

学习成果

完成本章后,你将:

  • 1了解测试类型概览(单元测试、集成测试、E2E 测试、性能测试)及其适用场景
  • 2掌握使用 AI 生成测试用例的方法(单元测试、集成测试、E2E 测试用例生成)
  • 3能够使用 AI 辅助测试代码编写(测试框架语法、Mock 数据生成、测试数据准备)
  • 4能够使用 AI 分析和优化测试性能(性能瓶颈分析、测试执行速度优化、测试重构)
  • 5掌握 AI 辅助覆盖率分析的方法(覆盖率报告分析、未覆盖代码路径识别、补充测试用例建议)
  • 6能够使用 AI 驱动的测试自动化(CI/CD 配置生成、测试报告分析、测试失败原因预测)
  • 7掌握 AI 辅助 TDD 实践(测试用例生成、最小实现代码生成、重构建议)