用 Claude 3.5 Sonnet 快速重构旧项目代码并实现单元测试全覆盖
把一个维护了三年的旧 Python 项目丢给 Claude 3.5 Sonnet,最忌讳直接说「帮我重构」。这种指令只会让它在不改变逻辑的情况下把变量名改一遍,毫无意义。
我这次重构的策略是:上下文分层喂养 + 强制约束模式。
首先,我没用 Cursor 的 codebase 索引,因为旧项目里垃圾代码太多,索引干扰大。我采取的是手动建立 .cursorrules(或者在 Claude Project 的 Custom Instructions 里)定义一套重构标准,强制它必须遵守:
1. 所有的业务逻辑必须从 Controller 层剥离到 Service 层。
2. 严禁使用 any 类型,必须为所有函数定义严格的 Type Hints。
3. 每一个重构后的函数必须符合单一职责原则,长度不超过 20 行。
4. 必须使用 pytest 编写测试用例,且覆盖所有边界条件。具体操作流程是:先喂给它一个核心模块的 current_code.py 和对应的 existing_tests.py(如果有的话),然后下达指令:
分析该模块的依赖关系,先输出一份重构方案(包含类图变更),在我确认方案后再输出代码。这里有个关键坑:AI 很容易在重构时自作聪明地优化掉一些「看起来像 Bug 但实际上是业务特例」的代码。为了规避这个,我要求它在重构每个函数后,必须同步生成对应的测试用例,并直接运行。
在实现单元测试全覆盖时,我发现直接让它写测试,覆盖率最高只能到 60%,因为 AI 习惯写 Happy Path。我换了一种 Prompt 技巧,要求它「扮演一名试图摧毁这段代码的 QA 工程师」:
针对刚才重构的 get_user_profile 函数,请列出 5 种可能导致崩溃的极端输入场景,并为每种场景编写一个 pytest 失败用例,直到通过为止。这种方式强迫它去思考 None 值、空字符串、并发冲突等边缘情况。
效率提升最明显的地方在于,我利用 Claude 3.5 的 Artifacts 实时对比。左边是旧代码,右边是新代码,配合 pytest-cov 插件实时监控覆盖率。一旦发现某个分支没走到,直接截图覆盖率报告丢给它,它能瞬间定位到哪个 if/else 漏掉了。
最终结果是把一个 2000 行的混乱模块拆成了 5 个独立 Service 和 12 个测试文件,覆盖率从 20% 提升到了 94%,且没有引入新 Bug。
免费 AI 工具箱 · 全部完全免费
全部回复 (0)
还没有回复,来发第一条吧!
