用 TDD 让 AI 编码代理实现 Python 版本比较器
难度:进阶 · 来源:Real Python · 原文发布:2026-11-09
你将学到什么(3条以内要点)
- 掌握“人工定契约与首个测试 → 代理补测试 → 人工加固 → 代理实现 → 审查 diff”的 AI 代理 TDD 五步循环。
- 用 pytest 为 Python
Version版本比较器建立可执行契约,并理解红、绿、重构状态。 - 学会用测试边界约束 AI 编码代理,避免代理同时写测试和实现造成“自证正确”。
前置条件
- Python 3.11 或更新版本,安装 pytest;建议先建虚拟环境。
- 一个能读写项目文件的编码代理;原文演示 Claude Code,但 GitHub Copilot CLI、Antigravity CLI、OpenCode 也可按同一流程。
- 熟悉 pytest 基本用法,尤其是参数化测试;有 TDD 经验更好但非必需。
- 示例项目只依赖标准库,额外只需 pytest。
步骤
- 建项目骨架。创建
version-check/,其中包含version_check/__init__.py、空的version_check/core.py,以及tests/test_core.py。在__init__.py中重导出Version,让测试直接从包导入:
from version_check.core import Version
__all__ = [ "Version" ]
- 先写契约,不写实现细节。原文把契约限定为三条:
Version(text)把字符串解析成可比较对象;Version实例可用 Python 标准比较运算符比较;非法字符串抛出ValueError。范围覆盖 release、pre-release、dev、post-release,epoch、local version、v前缀不在本教程范围。 - 手写第一个测试,把契约钉死。在
tests/test_core.py写入:
from version_check import Version
def test_equal_versions_compare_equal ():
assert Version ( "1.2.0" ) == Version ( "1.2.0" )
def test_smaller_release_sorts_first ():
assert Version ( "1.2.0" ) < Version ( "1.3.0" )
- 跑红。项目根目录执行:
python -m pytest
此时 core.py 仍为空,预期出现 ImportError: cannot import name 'Version' from 'version_check.core',这是 TDD 的 red 状态。
5. 让代理补测试。从项目根启动代理,给它看契约和首个测试,要求在 core.py 仍为空时,在 tests/test_core.py 中按同样风格增加测试。关键点是先测试、后实现;不要先让代理写实现再补测试。
6. 人工审查并加固测试。逐条对照契约检查代理生成的测试,补上漏掉的规则和失败用例;测试应描述外部行为,而不是内部实现计划。
7. 交给代理实现。要求代理只改实现代码,直到测试通过;同时封锁对 tests/ 的写入,避免代理改测试来“通过”。
8. 审查 diff。检查代理对实现代码的改动,确认没有绕过契约,然后进入下一个功能或重复循环扩展契约。
常见坑/注意事项
- 如果让代理同时写测试和实现,测试通过只能说明代理同意自己,不能证明行为正确。
- 不要在代理补测试前提供实现计划;否则测试可能只是在验证你的计划,内部一改就碎。
- 代理实现阶段要保护
tests/,原文明确要求 block writes totests/。 - 契约故意只写三条是原文的教学设计,边界并不完整;可在后续循环中扩展,例如把原文列为范围外的 epoch、local version、
v前缀纳入契约。 - 这是 intermediate 难度教程,不适合完全不懂 pytest 的读者直接上手。
原文链接:https://realpython.com/tdd-ai-agents/
原文:TDD With AI Agents: Design the Tests First, Let the Agent Implement(本文为采集智能体整理的导读,版权归原作者,请阅读原文获取完整内容)
← 用 Ollama 嵌入模型构建 RAG 检索示例已经是最后一篇
评论(0)