– 代理会话日,2月19日

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

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

本指南演示如何通过使用自定义代理、交接和自定义指令在 VS Code 中设置 AI 辅助的测试驱动开发工作流。

TDD 概述

测试驱动开发的核心原则是在实现之前编写测试。测试定义了您想要构建的功能的期望结果。首先编写测试,可以明确需求并识别边界情况,以确保代码按预期运行。

TDD 遵循一个三阶段循环,称为 红-绿-重构,并针对每个小功能增量重复进行。

这三个阶段是

  • 红色阶段:为要开发的功能编写一个失败的测试。

  • 绿色阶段:编写使测试通过所需的最小应用程序代码。专注于使其工作,而不是使其完美。

  • 重构阶段:在保持所有测试通过的同时,提高代码质量。清理重复项,改进命名,并增强结构。

实施概述

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

通过自定义代理交接,您可以在 AI 完成其任务后从一个阶段过渡到下一个阶段。这些自定义代理以循环方式连接,反映了 TDD 工作流

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

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

下图显示了自定义代理如何协同工作以实现 TDD 工作流,交接则实现了阶段之间的平滑过渡。

Diagram that shows the TDD implementation diagram for VS Code with testing instructions, and custom agents for the red, green, and refactor phases.

提示

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

步骤 1:设置测试指南

如果您已经建立了测试约定和实践,请创建一个自定义指令文件 (testing.instructions.md) 以帮助 AI 生成符合项目标准的测试。

为什么这有帮助:如果没有明确的测试约定,AI 可能会生成与项目风格不匹配、使用不一致的模式或遗漏重要测试场景的测试。

要设置测试指南

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

    • 选择 .github/instructions 以在您的工作区中创建指令文件。
    • 输入 "testing" 作为指令文件的名称。
    注意

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

  2. 更新指令 applyTo 元数据,以自动将其应用于测试文件。同时设置 description 元数据,以指示这些指令提供测试上下文。

    以下示例更新了 applyTo 字段,以针对 tests/ 目录中的所有文件

    ---
    description: 'Use these guidelines when generating or updating tests.'
    applyTo: tests/**
    ---
    
  3. 将项目的测试指南添加到指令文件的正文中。

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

    ---
    description: 'Use these guidelines when generating or updating tests.'
    applyTo: tests/**
    ---
    # [Project Name] Testing Guidelines
    
    ## Test conventions
    * Write clear, focused tests that verify one behavior at a time
    * Use descriptive test names that explain what is being tested and the expected outcome
    * Follow Arrange-Act-Assert (AAA) pattern: set up test data, execute the code under test, verify results
    * Keep tests independent - each test should run in isolation without depending on other tests
    * Start with the simplest test case, then add edge cases and error conditions
    * Tests should fail for the right reason - verify they catch the bugs they're meant to catch
    * Mock external dependencies to keep tests fast and reliable
    
    提示

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

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

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

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

要创建 .github/agents/TDD-red.agent.md 红色阶段 自定义代理

  1. 在命令面板中运行 Chat: New Custom Agent 命令。

    • 选择 .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
    ---
    You are a test-writer: when given a function name, spec, or requirements, output a complete test file (or test function) that asserts the expected behavior, which must fail when run against the current codebase. Use the project’s style/conventions. Do not write implementation, only tests.
    

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

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

要创建 .github/agents/TDD-green.agent.md 绿色阶段 自定义代理

  1. 在命令面板中运行 Chat: New Custom Agent 命令。

    • 选择 .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.
    
    After implementing changes, run the tests to verify they pass.
    

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

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

要创建 .github/agents/TDD-refactor.agent.md 重构阶段 自定义聊天代理

  1. 在命令面板中运行 Chat: New Custom Agent 命令。

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

    以下 TDD-refactor.agent.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
    ---
    You are refactor-assistant. Given code that passes all tests, examine it and suggest or apply refactoring to improve readability/structure/DRYness, without changing behavior. No new functionality, no breaking changes.
    
    After refactoring, run the tests to ensure all tests still pass and behavior is preserved.
    

使用 TDD 工作流实现功能

现在设置了 TDD 自定义代理,您可以使用它们使用 TDD 工作流在项目中实现功能。

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

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

    例如

    Write tests for user registration with email validation and password requirements.
    
  3. 查看生成的测试,并使用交接操作通过 TDD 循环进行过渡

    • 在编写完测试后,选择 TDD Green 以实现使测试通过的最小代码
    • 绿色代理在实现后自动运行测试
    • 在测试通过后,选择 TDD Refactor 以提高代码质量
    • 重构代理在重构后自动运行测试,以确保它们仍然通过
    • 选择 TDD Red 以使用其他功能开始下一个循环

故障排除和最佳实践

使用 AI 进行 TDD 的常见陷阱

在没有交接的情况下运行 TDD:使用单个代理完成整个 TDD 循环会使人类脱离循环。交接提供了控制点,您可以在其中评估每个步骤,验证 AI 的工作,并在移动到下一个阶段之前引导代理。

缺少功能的测试覆盖率:TDD 代理专注于使现有测试通过,并且不会实现没有相应测试的功能。确保您的规范中的每个需求都有测试覆盖率,然后期望实现包含它。

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

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

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

测试覆盖率不完整:AI 可能会遗漏边界情况或错误条件。批判性地审查生成的测试,并要求添加涵盖边界条件、错误场景和边缘情况的附加测试。

使用 AI 进行 TDD 的最佳实践

为任务选择合适的模型:不同的语言模型具有不同的优势。考虑在复杂的测试生成和边缘情况识别中使用推理模型。使用 Chat 视图中的模型选择器在 TDD 工作流期间切换模型,或在自定义代理属性中定义 model

验证测试质量:在 AI 生成测试后,请查看它以确保它因正确的原因而失败。在实现之前运行测试,以验证它是否捕获了缺失的功能。

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

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

将测试覆盖率用作指南:高覆盖率不能保证质量,但低覆盖率表明存在未测试的行为。要求 AI 建议针对未覆盖代码路径的测试。

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

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

了解有关 VS Code 中测试和 AI 定制的更多信息

© . This site is unofficial and not affiliated with Microsoft.