Coding Agent、补丁与测试反馈
正在读取学习记录…
Coding Agent 会读取代码、提出修改,再根据测试反馈调整。补丁就是对原代码的具体变更,例如把订单金额的加法改为乘法。你可以把它理解为修改表格中的一条公式:公式看起来顺眼还不够,必须代入已知数据检查结果。测试反馈则把业务要求变成可执行的判断。
订单单价 10 元、数量 3 件,合计应是 30 元。候选实现 price * count 满足这个要求,数量为 0 时还应返回 0。我们让独立子进程执行这两个断言,退出码 0 表示它们通过;非 0 表示候选需要修改。子进程是另一个由当前程序启动的 Python 运行实例,测试失败不会把父程序一起中断。
从输入到可核对结果
示例创建独立临时工作目录,先写入加法基线 shop.py,再替换为候选公式,并写入 check.py,再启动 Python 执行。临时目录会在本次运行结束时自动清理。补丁候选来自预先给定的两个表达式,业务断言也已提供。
白名单先限制可写入的表达式,write_text 保存实际文件,subprocess.run 获取退出码、标准输出与标准错误。timeout=5 限制等待时长,capture_output=True 把子进程输出带回父进程。它没有运行模型生成的代码;接入模型后,建议补丁仍要进入同一条验证链。Python 子进程文档解释了退出码、输出与超时;SWE-bench展示了按仓库问题与测试评估编码能力的思路。
| 输入候选 | 10元 × 3件 | 10元 × 0件 | 验证结论 |
|---|---|---|---|
| price * count | 30 | 0 | 两条通过 |
| price + count | 13 | 10 | 断言失败 |
| 未批准表达式 | 不启动子进程 | 不写入候选 | 拒绝 |
保存并运行这两个文件
在 PowerShell 创建练习目录:
New-Item -ItemType Directory -Force l9-coding
cd l9-codingmacOS 终端:
mkdir -p l9-coding
cd l9-coding把下面第一段完整代码保存为 patch_lab.py,第二段保存为 test_patch_lab.py,两份文件放在这个目录。
from pathlib import Path
import subprocess
import sys
import tempfile
EXPRESSION = "price * count"
def validate_patch(expression):
if expression not in {"price * count", "price + count"}:
raise ValueError("补丁表达式未批准")
# 使用系统配置的临时位置创建独立工作区,退出时清理文件。
with tempfile.TemporaryDirectory() as folder:
work = Path(folder)
target = work / "shop.py"
# 先落盘错误基线,再只替换指定的金额公式行,生成真实候选文件。
baseline = "def total(price, count):\n return price + count\n"
target.write_text(baseline, encoding="utf-8")
source = target.read_text(encoding="utf-8")
source = source.replace(" return price + count\n",
" return " + expression + "\n", 1)
target.write_text(source, encoding="utf-8")
# 测试是预先给定的业务要求:单价10元、3件共30元,0件为0。
checks = ("import sys\nfrom pathlib import Path\n"
"sys.path.insert(0, str(Path(__file__).parent))\n"
"from shop import total\n"
"assert total(10, 3) == 30\n"
"assert total(10, 0) == 0\n"
"print('两条业务断言通过')\n")
(work / "check.py").write_text(checks, encoding="utf-8")
result = subprocess.run([sys.executable, "-X", "utf8", "check.py"],
cwd=work, capture_output=True, text=True,
encoding="utf-8", timeout=5)
return result.returncode, result.stdout.strip(), result.stderr.strip()
if __name__ == "__main__":
code, feedback, errors = validate_patch(EXPRESSION)
print("候选补丁:return " + EXPRESSION)
print("测试退出码:" + str(code))
print("处理:" + ("允许进入人工审查" if code == 0 else "退回补丁"))
if feedback:
print(feedback)
if errors:
# stderr保留完整回溯;正文演示抽出失败的业务断言和错误类别。
failed = next((line.strip() for line in errors.splitlines() if "assert " in line), "")
if failed:
print("失败断言:" + failed)
print("错误:" + errors.splitlines()[-1])import unittest
import patch_lab as lab
class MechanismTests(unittest.TestCase):
# 正常、边界和失败输入都由这里提供,直接运行即可。
def test_normal(self):
self.assertEqual(lab.validate_patch("price * count"), (0, "两条业务断言通过", ""))
def test_boundary_zero_in_child(self):
code, feedback, errors = lab.validate_patch("price * count")
self.assertEqual(code, 0)
self.assertIn("两条", feedback)
def test_failure_patch(self):
code, output, errors = lab.validate_patch("price + count")
self.assertNotEqual(code, 0)
self.assertIn("assert total(10, 3) == 30", errors)
self.assertIn("AssertionError", errors)
with self.assertRaises(ValueError):
lab.validate_patch("__import__('os')")
if __name__ == "__main__":
unittest.main()打开 PowerShell,逐行输入下列命令。cd 是进入文件夹,dir 是列出文件;确认列表里有刚保存的两个 .py 文件,再运行 Python。
# 在刚才创建的练习目录检查文件,再运行程序。
ls
python -X utf8 patch_lab.py
python -X utf8 -m unittest -v test_patch_lab.py程序输出:
候选补丁:return price * count
测试退出码:0
处理:允许进入人工审查
两条业务断言通过测试末尾应显示 Ran 3 tests 与 OK。若找不到文件,检查当前目录与扩展名;若导入失败,确认测试和主程序在同一文件夹。测试描述的三组材料就在上方代码,不需要另外准备输入。
改一处,再看结果
正常路径显示测试退出码 0,并输出“两条业务断言通过”。“允许进入人工审查”是下一步状态:这两个业务例子得到正确结果后,还可以审查风格、类型、性能与其他调用方影响。
把 EXPRESSION = "price * count" 改成 EXPRESSION = "price + count",保存后再次运行。退出码变为 1,处理变成“退回补丁”,还会显示失败断言 assert total(10, 3) == 30 和 AssertionError。标准错误里保留完整回溯,主程序提取业务断言与错误类别展示。主程序本身仍正常结束,它把测试失败当作可处理反馈。恢复乘法表达式并重跑。这里的两个公式候选是同一业务问题的修复与回归对照。
实际仓库中的补丁还需要核对基线:如果源文件已经被别人修改,应重新读取文件再应用差异。超时意味着验证没有完成,不可当作通过。Python 子进程继承当前用户权限;执行外部或模型提供的代码时,需要受限沙箱、目录和网络权限,普通临时目录仅用于隔离文件。
改动后仍在刚才的 PowerShell 目录运行:
python -X utf8 patch_lab.py确认上述变化后,把参数恢复成原值,保存并再次执行这条命令。
把机制接回 Agent
编码循环可依次接上读取文件、产生差异、应用候选、运行测试、读回反馈。模型给出的补丁应包含目标文件与预期旧内容,执行器核对文件状态后再应用。测试失败时把退出码和具体失败用例送回决策层,保持原业务断言,避免通过删除测试让补丁看似合格。
课后练习展开习题收起习题
正在读取本地记录…
不调用模型,不执行代码。简答、代码和场景题仅保存答案并展示自查标准,不生成评分、徽章或认证。输入内容不会自动保存,请点击提交;不要填写个人信息或密钥。
选择题 · 先判断边界
关于“Coding Agent、补丁与测试反馈”,哪种做法更稳妥?
对应知识点:L9-coding
简答题 · 解释失败
写出一个失败输入并说明记录字段。
对应知识点:L9-coding
代码题 · 边界测试
补充正常、边界、失败三组输入和预期结果。
对应知识点:L9-coding
场景题 · 结果未知
证据不足时如何设计状态和人工接管?
对应知识点:L9-coding
描述会发送给本站维护者,用于修订文章,保存90天。请只填写文章问题,省略个人信息、密钥和内部资料。