AI自主迭代 · 需求收敛
👉 关于作者

AI驱动的代码修复与测试增强联动
需求收敛闭环方法

基于结构化日志与CLI自动化,让AI在每一轮迭代中同步完善代码和测试,螺旋逼近需求目标

itg · 公众号: 火星火箭 · 嵌入式AI工程化系列

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比对检查点,计算覆盖率并发现漏洞
这些组件构成了Agent的感知-执行闭环,使得Agent可以像人类工程师一样观察硬件行为、修改代码、运行测试。

3. Agent迭代引擎:双轨并行的收敛机制

我们设计了一个ConvergenceAgent,它维护两个工作队列:修复队列(针对当前失败的代码修改)和增强队列(针对未覆盖需求的测试补充)。每一轮迭代,Agent执行以下流程:

1

执行当前测试套件

Agent调用CLI工具链:烧录固件 → 启动调试助手 → 运行所有测试脚本 → 收集结构化日志。

2

分析日志,区分“代码缺陷”与“测试盲区”

正/负日志明确指示失败原因:若负日志显示期望事件未发生,可能是代码逻辑错误或时序问题;若某些需求检查点未触发任何相关日志,则是测试覆盖不足。

3

生成代码修复提案(轨1)

对于代码缺陷,Agent利用高性能AI模型分析日志,输出git diff格式的修复。修复后直接应用并重新编译。

4

生成测试增强提案(轨2)

对于未覆盖的需求点,Agent指示低成本AI批量生成补充测试用例(如增加边界参数、故意引入异常、调整时序)。这些新用例加入测试套件。

5

回归验证

使用增强后的测试套件再次运行全流程。若仍有失败,重复步骤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编程模板中:

1

定义需求检查点

docs/requirements_checkpoints.json 中描述每个功能点期望的日志模式。

2

放置Agent脚本

convergence_agent.py 放入项目 tools/ 目录,配置串口、波特率等参数。

3

启动收敛任务

执行 python tools/convergence_agent.py --target-coverage 1.0 ,Agent接管后续流程。

4

查看收敛报告

迭代结束后,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。需求检查点全部满足,收敛终止。

📈 在此过程中,测试用例从1个增加到2个,代码Bug被自动修复,需求覆盖率从60%提升至100%,整个过程耗时约4分钟,无需人工介入。

7. 总结:让AI成为持续打磨项目的工匠

通过将“代码修复”与“测试增强”捆绑为双轨迭代,并辅以结构化日志和CLI自动化,我们构建了一个自治的收敛引擎。它不再等待人类下达精确的测试指令,而是自主发现短板、完善验证手段,迫使代码实现向需求无限逼近。

代码侧

每次失败都转化为精确的修复提案,并立即验证。

测试侧

每次覆盖缺失都催生新的测试场景,像“免疫系统”一样完善。

最终,项目达到一个稳定状态:代码实现通过所有测试,而测试又完整反映了需求描述——这正是收敛的本质。