本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

在 VS Code 中设置测试驱动开发流程

测试驱动开发 (TDD) 是一种软件开发方法,您在实现功能之前先编写测试。这创建了一个紧密的反馈循环,提高了代码质量,早期捕获错误,并确保代码符合您的要求。Visual Studio Code 的 AI 功能可以通过引导您完成编写测试、实现代码、运行测试和优化代码的各个阶段来增强您的 TDD 工作流程。

本指南将向您展示如何通过使用自定义代理、传递和自定义指令在 VS Code 中设置 AI 助手的测试驱动开发工作流程。

TDD 概述

The core tenet of test-driven development is to write tests before implementation. The tests define the desired outcomes for the functionality you want to build. By writing tests first, you clarify requirements and identify edge cases to ensure that your code behaves as expected.

TDD follows a three-phase cycle known as red-green-refactor and repeats for each small increment of functionality.

The three phases are:

  • Red phase: Write a failing test for the functionality you want to develop.

  • Green phase: Write the minimal application code needed to make the test pass. Focus on making it work, not making it perfect.

  • Refactor phase: Improve the code quality while keeping all tests passing. Clean up duplication, improve naming, and enhance structure.

实施概述

您可以通过使用自定义代理在 VS Code 中实现 AI 辅助的 TDD 工作流。TDD 过程的每个阶段(红色、绿色、重构)都有特定的目标,并需要不同的 AI 行为。为每个阶段创建一个自定义代理,该代理定义了该阶段的具体角色和指南。

通过自定义代理移交,当AI完成其任务后,您可以从一个阶段过渡到下一个阶段。自定义代理以反映TDD工作流程的循环连接:

  • 红色阶段 → 交给 绿色阶段 在编写失败的测试之后
  • 绿色阶段 → 运行测试以验证实现,然后交给 重构阶段
  • 重构阶段 → 运行测试以确保它们仍然通过,然后将其移交给 红色阶段 开始下一个循环

如果您已经建立了测试规范,您可以使用自定义指令来设置测试上下文,以指导AI生成符合项目标准的测试。

以下图表显示了自定义代理如何协同工作以实现TDD工作流程,并通过移交实现各阶段之间的顺利过渡。

显示 VS Code 测试说明和用于红色、绿色、重构阶段的自定义代理的 TDD 实施图。

小贴士

您可以通过在开始循环之前添加规划阶段来进一步增强TDD工作流程。您可以使用内置的计划代理或创建自定义的计划代理,以帮助澄清需求并确定需要通过测试涵盖的边缘情况。

步骤 1:制定测试指南

如果您已经建立了测试规范和实践,请创建一个自定义说明文件测试.说明.md) 帮助 AI 生成符合您项目标准的测试。

为什么这有帮助:没有明确的测试规范,AI 生成的测试可能不符合你项目的要求,使用不一致的模式,或者遗漏重要的测试场景。

制定测试指南:

  1. 运行 Chat: 创建 Instructions 文件 命令在命令面板中以在你的工作区中创建一个新的 Instructions 文件。

    • 选择.github/说明在你的工作区创建指令文件。
    • 将“testing”作为指令文件的名称。
    注意

    通过使用*.Instructions.md文件而不是Copilot.指示.md文件,您可以选择仅将这些测试指南应用于项目中的测试文件,而不是将它们包含在所有 AI 交互中。

  2. 更新说明申请元数据以自动应用到测试文件。同时设置描述元数据以表明这些说明提供了测试上下文。

    以下示例更新申请字段以目标所有文件在测试/目录:

    ---
    描述'在生成或更新测试时,请遵循这些指南。'
    应用到测试/**
    ---
    
  3. 将您的项目的测试指南添加到说明文件的主体中。

    以下示例提供了一个测试约定的起点:

    ---
    description: 'Use these guidelines when generating or updating tests.'
    applyTo: tests/**
    ---
    # [Project Name] Testing Guidelines
    
    ## 测试约定
    * 编写清晰、专注的测试,每次验证一种行为
    * 使用描述性的测试名称,解释正在测试的内容和预期结果
    * 遵循Arrange-Act-Assert (AAA) 模式:设置测试数据,执行待测试的代码,验证结果
    * 保持测试独立 - 每个测试应独立运行,不依赖其他测试
    * 从最简单的测试用例开始,然后添加边界情况和错误条件
    * 测试应为正确的理由失败 - 验证它们能够捕获预期的错误
    * 模拟外部依赖项以保持测试快速可靠
    
    小贴士

    您可以创建一个可选的测试结构模板,该模板定义了不同测试类型的部分和模式(例如,测试模板.md). 在你的说明文件中引用这个模板,以便AI在生成测试时使用它。

步骤 2: 创建红色阶段自定义代理

创建一个“TDD-红色”自定义代理,专注于TDD的红色阶段。这个自定义代理只负责根据提供的需求编写失败的测试,不应实现任何应用程序代码。完成之后,这个代理会交给绿色阶段的自定义代理。

为什么这有帮助:没有专注模式,AI可能会将实现建议与测试创建混合在一起,并且会错过编写测试首先的TDD核心原则。

为了创建.github/agents/TDD-red.agent.md 红色阶段 定制代理:

  1. 运行 聊天:新自定义代理 命令在命令面板中。

    • 选择.github/agents在你的工作区创建自定义代理定义。
    • 输入“TDD-red”作为自定义代理的名称。
  2. 更新自定义代理定义,以描述红色阶段的指南和规则,并指定向绿色阶段自定义代理的移交。

    以下TDD-red.agent.md文件为红色阶段提供了一个起点。

    ---
    name: TDD Red
    description: TDD phase for writing FAILING tests
    infer: true
    tools: ['read', 'edit', 'search']
    handoffs:
      - label: TDD Green
        agent: TDD Green
        prompt: Implement minimal implementation
    ---
    你是测试编写者:当给定一个函数名称、规范或要求时,输出一个完整的测试文件(或测试函数),该文件断言预期的行为,当在当前代码库上运行时必须失败。使用项目的风格/约定。不要编写实现,只编写测试。
    

步骤 3: 创建绿色阶段自定义代理

创建一个“TDD-绿色”的自定义代理,专注于TDD的绿色阶段。这个自定义代理只负责编写使测试通过的最小实现代码,而不修改测试代码。实现后,这个代理运行测试以验证它们通过,然后交给重构阶段的自定义代理。

为了创建.github/agents/TDD-green.agent.md 绿色阶段 定制代理:

  1. 运行 聊天:新自定义代理 命令在命令面板中。

    • 选择.github/agents在你的工作区创建自定义代理定义。
    • 输入“TDD-green”作为自定义代理的名称。
  2. 更新自定义代理定义以描述绿色阶段的指南和规则,并指定向重构阶段自定义代理的移交。

    以下TDD-green.agent.md文件提供了一个起点:

    ---
    name: TDD Green
    description: TDD phase for writing MINIMAL implementation to pass tests
    infer: true
    tools: ['search', 'edit', 'execute']
    handoffs:
      - label: TDD Refactor
        agent: TDD Refactor
        prompt: Refactor the implementation
    ---
    
    You are a code-implementer. Given a failing test case and context (existing codebase or module), write the minimal code change needed so that the test passes - no extra features. Do not write tests, only implementation.
    
    在实施更改后,运行测试以验证它们通过。
    

步骤 4:创建重构阶段自定义代理

创建一个“TDD-refactor”自定义代理,专注于TDD的重构阶段,以提高代码质量,同时保持所有测试通过。该代理负责清理代码、消除重复、改进命名、并增强结构而不改变功能。在重构之后,该代理运行测试以确保它们仍然通过,然后将控制权交给红色阶段,以开始下一个TDD循环。

为了创建.github/agents/TDD-重构 agent.md 重构阶段 定制聊天代理:

  1. 运行 聊天:新自定义代理 命令在命令面板中。

    • 选择.github/agents在你的工作区创建自定义代理定义。
    • 输入“TDD-refactor”作为自定义代理的名称。
  2. 更新自定义代理定义,以描述重构阶段的指南和规则。

    以下TDD-重构.代理.md文件提供了一个起点:

    ---
    name: TDD Refactor
    description: Refactor code while maintaining passing tests
    tools: ['search', 'edit', 'read', 'execute']
    infer: true
    handoffs:
      - label: TDD Red
        agent: TDD Red
        prompt: Start next TDD cycle with new test
    ---
    你是重构助手。给定通过所有测试的代码,检查它并建议或应用重构以提高可读性/结构/避免重复,而不改变行为。不增加新功能,不进行重大更改。
    
    在重构后,运行测试以确保所有测试仍然通过并且行为保持不变。
    

使用TDD工作流程来实现功能

既然已经设置了TDD自定义代理,您就可以使用它们通过TDD工作流程在项目中实现功能。

  1. 打开聊天视图并从代理下拉菜单中选择TDD Red代理。

  2. 提供一个描述您要测试的功能或行为的提示。

    例如:

    编写用户注册的测试,包括电子邮件验证和密码要求。
    
  3. 审查生成的测试,并使用移交动作来完成TDD周期:

    • 在测试编写完成后,选择TDD Green来实现最小的代码以通过测试
    • 绿色代理在实施后自动运行测试
    • 测试通过后,选择TDD 重构以提高代码质量
    • 重构代理在重构后自动运行测试,以确保它们仍然通过。
    • 选择 TDD 红色 以启动带有附加功能的新周期

故障排除和最佳实践

使用人工智能的常见TDD陷阱

无需人工干预的TDD运行:使用单一代理完成整个TDD周期将人类从循环中移除。人工干预提供了控制点,您可以在此评估每一步,验证AI的工作,并在进入下一阶段之前引导代理向正确的方向发展。

功能的测试覆盖率缺失:TDD代理专注于使现有测试通过,不会实现没有对应测试的功能。在期望实现包含某个需求之前,请确保您的规范中的每个需求都有测试覆盖。

跳过红色阶段:AI 可能会建议在编写测试之前实现代码。

过度实现:AI可能会生成比当前测试所需更多的代码。批判性地审查实现并删除不必要的复杂性。

测试实现细节:测试应验证行为,而不是实现。如果重构需要更改测试,这可能表明测试与实现细节过于紧密地耦合。

不完整的测试覆盖:AI 可能会遗漏边缘情况或错误条件。仔细审查生成的测试,并要求涵盖边界条件、错误场景和边缘情况的额外测试。

使用人工智能进行TDD的最佳实践

为任务选择合适的模型:不同的语言模型有不同的优势。考虑使用推理模型进行复杂的测试生成和边缘案例识别。在聊天视图中使用模型选择器在TDD工作流程中切换模型或定义模型在你的自定义代理属性中。

验证测试质量:在AI生成测试后,审查测试以确保其因正确的原因而失败。在实施之前运行测试,以验证它能否检测到缺失的功能。

保持增量进展:通过TDD循环采取小步骤。编写一个测试,实现最小代码,重构,然后重复。小迭代可以防止大错误,并保持代码库的正常工作。

经常运行测试:在更改后立即执行测试。不要在测试前积累多个更改。频繁的测试运行可以提供快速反馈并及早发现问题是。

将测试覆盖用作指导:高覆盖度并不保证质量,但低覆盖度表明有未测试的行为。请AI建议对未覆盖的代码路径进行测试。

保持测试独立性:测试应以任何顺序运行而互不干扰。如果测试依赖于执行顺序或共享状态,请重构以使它们独立。

根据需要更新测试上下文:随着您的项目的发展,请更新指令文件中的测试指南,以反映新的约定、框架或实践。

了解更多关于在 VS Code 中进行测试和 AI 自定义的信息: