1. 从“测试-修复”到“测试增强-代码完善”双轨收敛
传统AI调试循环是单向的:运行测试→发现失败→修复代码→重新测试。这种模式忽略了测试本身也可能不完善。本文提出双轨收敛方法:AI在修复代码的同时,主动分析测试覆盖的盲区,增加新的测试项目或改进测试方法,使下一轮测试能更充分地验证需求。如此往复,代码实现与测试套件同步向需求描述收敛。
这一方法建立在前期“五层进化”工程体系之上,利用结构化正/负日志、统一项目上下文、CLI自动化闭环和Agent调度,实现完全无人值守的自主迭代。
轨1:代码修复
根据失败日志(尤其是负日志),定位根因,生成git diff修复提案,应用后回归验证。
轨2:测试增强
分析已覆盖与未覆盖的需求点,补充新测试用例或优化断言,提升测试的“需求敏感度”。
收敛判据
当连续两轮测试均无失败,且需求覆盖率保持100%且无新的负日志出现,视为收敛。
Agent驱动
一个自治Agent统筹所有步骤:读取日志、生成修复、提出新测试、调度CLI执行、循环直至收敛。
2. 工程基础:让Agent拥有“眼睛”和“双手”
迭代收敛离不开前期搭建的嵌入式AI工程模板。以下关键组件为Agent提供了完备的感知与执行能力:
| 组件 | 作用 | Agent使用方式 |
|---|---|---|
| 结构化正/负日志 | 记录“发生了什么”和“应该发生却未发生”的事件 | Agent解析日志,提取失败证据和需求覆盖信息 |
| 统一项目上下文 | 标准目录结构 + agents.md 让AI理解项目全貌 | Agent自动加载上下文,生成准确修复和测试建议 |
| CLI调试助手 | 同时监听RS485总线、控制板串口、上位机日志 | Agent调用助手收集每一次测试的完整日志 |
| VSCode Tasks | 一键编译、烧录、启动监控、运行测试 | Agent通过make full-loop触发整个序列 |
| 需求检查点文件 | 将需求转化为可验证的日志模式列表 | Agent比对检查点,计算覆盖率并发现漏洞 |
3. Agent迭代引擎:双轨并行的收敛机制
我们设计了一个ConvergenceAgent,它维护两个工作队列:修复队列(针对当前失败的代码修改)和增强队列(针对未覆盖需求的测试补充)。每一轮迭代,Agent执行以下流程:
执行当前测试套件
Agent调用CLI工具链:烧录固件 → 启动调试助手 → 运行所有测试脚本 → 收集结构化日志。
分析日志,区分“代码缺陷”与“测试盲区”
正/负日志明确指示失败原因:若负日志显示期望事件未发生,可能是代码逻辑错误或时序问题;若某些需求检查点未触发任何相关日志,则是测试覆盖不足。
生成代码修复提案(轨1)
对于代码缺陷,Agent利用高性能AI模型分析日志,输出git diff格式的修复。修复后直接应用并重新编译。
生成测试增强提案(轨2)
对于未覆盖的需求点,Agent指示低成本AI批量生成补充测试用例(如增加边界参数、故意引入异常、调整时序)。这些新用例加入测试套件。
回归验证
使用增强后的测试套件再次运行全流程。若仍有失败,重复步骤2~4。若全部通过且需求覆盖充分,则终止迭代。
该循环的关键在于步骤2的智能分析:Agent必须准确判断一个失败是代码Bug还是测试用例设计不当。这依赖于日志的结构化程度以及需求检查点的定义质量。
# ConvergenceAgent 核心伪代码
def converge(project, requirements):
for iteration in range(MAX_ITER):
logs = run_all_tests(project)
failures = analyze_failures(logs, requirements)
if not failures:
break # 收敛
code_fix_diff, new_test_cases = None, []
for failure in failures:
if is_code_defect(failure):
code_fix_diff = ai_generate_fix(failure, logs)
if is_coverage_gap(failure):
new_test_cases = ai_suggest_tests(failure, requirements)
if code_fix_diff:
apply_code_change(project, code_fix_diff)
if new_test_cases:
augment_test_suite(project, new_test_cases)
# 新测试可能暴露旧代码的问题,继续循环
4. 三重迭代循环:修复、测试、方法的递归优化
为使收敛更高效,Agent内部实现了三个层次的迭代,层层递进:
循环A:快速修复循环(秒级)
针对明确的代码语法错误或明显逻辑失误,AI直接输出diff并应用,无需等待完整测试套件结束。利用编译错误作为反馈,类似“编译-修改-再编译”的快速闭环。
循环B:功能验证循环(分钟级)
常规测试执行后,AI分析失败日志,修复功能缺陷,并根据本次失败的经验,调整测试断言或增加相关场景的测试。例如,发现通讯超时未被正确处理,除了修复超时逻辑,还新增一个“超时后立即再次轮询”的测试用例。
循环C:测试方法论优化循环(项目级)
当多轮迭代仍然无法满足某个需求点时,Agent可能意识到现有的测试手段有局限(如调试助手监听精度不够,需要引入逻辑分析仪)。它会提出测试方法层面的改进建议,如升级监听工具的采样率、增加硬件触发条件等,并将此作为新的需求检查点纳入系统。
循环C实例
项目中偶发RS485帧丢失,软件日志无法捕获。Agent分析后建议:“调试助手增加硬件GPIO触发信号,同步捕捉总线电气波形”。它自动生成一个新的测试脚本,调用示波器API,并将该建议写入agents.md供后续参考。
5. 无缝嵌入你的RS485传感器项目
以下步骤将收敛Agent部署到之前的嵌入式AI编程模板中:
定义需求检查点
在 docs/requirements_checkpoints.json 中描述每个功能点期望的日志模式。
放置Agent脚本
将 convergence_agent.py 放入项目 tools/ 目录,配置串口、波特率等参数。
启动收敛任务
执行 python tools/convergence_agent.py --target-coverage 1.0 ,Agent接管后续流程。
查看收敛报告
迭代结束后,Agent输出代码改动历史、新增测试列表以及最终的需求覆盖矩阵。
python tools/convergence_agent.py --rs485 COM3 --mcu COM4 --iterations 20
6. 收敛过程演示:一个RS485通讯Bug的闭环
初始状态:协议要求从机在50ms内回复轮询,否则主机应记录超时并重试。现有测试仅有正常轮询,覆盖不足。代码存在一个Bug:超时计数器在重试时未重置,导致第二次超时后误报永久故障。
第1轮迭代
测试脚本正常运行,无失败。但Agent分析需求检查点发现“通讯超时恢复”需求未被任何日志覆盖。轨2触发:Agent自动生成一个“故意延迟回复60ms”的测试用例。
第2轮迭代
新测试用例触发了NEGATIVE: POLL_TIMEOUT,但后续重试仍持续超时(因计数器Bug)。轨1触发:AI分析日志,识别到计数器未重置,生成修复diff。
第3轮迭代
代码修复后,重新运行增强版测试。日志显示:首次超时后重试成功,并出现POSITIVE: RETRY_SUCCESS。需求检查点全部满足,收敛终止。
7. 总结:让AI成为持续打磨项目的工匠
通过将“代码修复”与“测试增强”捆绑为双轨迭代,并辅以结构化日志和CLI自动化,我们构建了一个自治的收敛引擎。它不再等待人类下达精确的测试指令,而是自主发现短板、完善验证手段,迫使代码实现向需求无限逼近。
代码侧
每次失败都转化为精确的修复提案,并立即验证。
测试侧
每次覆盖缺失都催生新的测试场景,像“免疫系统”一样完善。
最终,项目达到一个稳定状态:代码实现通过所有测试,而测试又完整反映了需求描述——这正是收敛的本质。