测试用例生成中的上下文问题
生成测试是 AI coding agent 最常见的实际应用场景之一。然而,如果没有运行时代码覆盖数据,AI coding agent 在推断测试缺口时只能静态分析源文件和测试文件,以推测哪些代码可能已被覆盖。这种方法并不可靠:agent 无法区分一个通过多层间接调用的函数和一个从未执行过的函数,也无法可靠地检测死代码。
代码覆盖率解决方案(如 Coco)可将真实测试运行中精确到每个插桩点的执行数据作为上下文 提供给 agent。后续调用 Coco 可以构建反馈循环,推动测试代码生成工作流在搜索空间中朝着覆盖目标持续迭代。
在本系列博客的第一篇 第 1 部分 中,我们借助 Coco CLI 工具实现了上述工作流,用于生成单元测试并最大化代码覆盖率。现在,我们正式发布 Coco MCP Server Preview,开发者、测试工程师、管理者以及 CI/CD 流水线均可在生成式 AI 驱动的工作流中加以使用。
Coco MCP Server 介绍
Coco MCP Server是一个 模型上下文协议(MCP)服务器,它将 Coco 命令行界面(CLI)工具封装在一个结构化接口中。Agent无需直接调用 cmreport 和 cmcsexeimport 并解析返回输出,而是调用 MCP 服务器中专门构建的工具,获取结构化数据并高效处理,同时不会污染上下文窗口。
MCP 是连接 AI coding agent 与外部工具和数据源的事实行业标准。所有主流 AI coding agent 均支持该协议并充当 MCP 主机,包括 VS Code 中的 GitHub Copilot 和 Claude Code——因此 Coco MCP 服务器可跨所有 MCP 主机使用,无需对工作流提示词做任何修改。下图展示了具体配置:

Coco MCP 服务器的优势包括:
- Token 敏感性 通过去除覆盖率摘要中的冗余字段,以及对覆盖报告各节采用流式传输而非全量加载,降低所需的 token 数量并限制上下文规模。Coco MCP 服务器还通过渐进式披露的方式暴露覆盖率数据,使 AI coding agent 最初仅接收最少的有用信息,随后在需要时获取更精准、更详细的内容。
- CLI 工具易用性 Coco CLI 参数标志较为繁琐,相关复杂性已封装在 MCP 工具调用中。
- 内置工作流 Coco MCP Server 内置了使用代码覆盖时必须定义的工作流。
我们认为上述功能对于大型项目尤为实用——对于小型项目,AI coding agent 直接使用 Coco CLI 工具仍然可以取得良好效果。
Coco MCP 服务器暴露的工具
如前所述,工具集经过结构化设计,使 agent 仅获取当前决策所需的数据量,从而保持响应简洁,并使 agent 的上下文窗口保持专注。
check_coverage_summary
一个轻量级健全性检查,调用 cmreport 并返回单个布尔值。若为 false,表示数据库中没有执行结果,后续的报告调用将返回空数据。此时,agent 应先调用 import_execution_report 。
import_execution_report
通过 cmcsexeimport 将 .csexe 执行报告合并到 .csmes 数据库中。此调用完成后,后续所有工具均可获取覆盖率数据。
get_coverage_overview
返回全局覆盖率百分比、每文件明细以及可选的每函数明细——足以使 agent 识别哪些文件和函数值得深入调查。Agent 以此进行优先级排序,无需逐一查看每个文件的详情。
示例输出(判定覆盖率,parser 示例):
|
文件
|
覆盖率
|
判定点
|
复杂度
|
|
parser.cpp
|
47.6%
|
137/288
|
121
|
|
error.cpp
|
25.0%
|
9/36
|
19
|
|
variablelist.cpp
|
47.1%
|
8/17
|
11
|
|
functions.cpp
|
0.0%
|
0/17
|
7
|
|
parser.h
|
100%
|
9/9
|
7
|
|
error.h
|
100%
|
4/4
|
4
|
|
Global
|
45.0%
|
167/371
|
—
|
get_file_coverage_detail
返回按覆盖状态分组的精确 file:line 位置(unexecuted、dead-code、executed)。Agent 以此精确定位编写新测试时需要针对的具体行,无需读取整个源文件并推断可能缺少的内容。
status_filter 将响应范围缩小到 agent 需要处理的状态 (通常为 ["unexecuted"])。对于大型代码库,已执行的行数量庞大,否则将主导响应内容,而其中并无可操作的信息。
当 include_tests=True 时,响应还会将每个插桩点映射到执行它的测试名称列表。这在 agent 修改特定代码段前需要了解现有测试覆盖情况,或在针对性更改后决定运行哪些测试时非常有用。
analyze_patch_coverage / analyze_patch_coverage_from_diff
该工具暴露了 Coco 的补丁分析功能:给定统一差异(unified diff),它返回覆盖已修改行的现有测试集合及其当前通过/失败状态。Agent 以此判断代码变更后哪些测试面临风险——实现精准的针对性重新执行,而非运行完整测试套件。该工具接受补丁文件路径或内联差异字符串,因此 agent 可直接从 git diff 的输出中调用,无需写入中间文件。
工作流示例
以下是 AI coding agent 在 Coco parser 示例上使用 Coco MCP 服务器的示例会话。
提示词: "构建 parser 示例并分析其当前判定覆盖率"
|
步骤
|
Coco MCP 服务器
|
结果
|
|
构建插桩二进制文件
|
-
|
生成 unittests.exe + unittests.exe.csexe
|
|
健全性检查
|
check_coverage_summary
|
has_coverage_data: false — 尚未导入结果
|
|
合并测试结果
|
import_execution_report
|
.csexe 已合并至 .csmes
|
|
确认数据可用
|
check_coverage_summary
|
has_coverage_data: true
|
|
获取判定覆盖率
|
get_coverage_overview(decision,global + source-tree + function-tree)
|
全局 45.0%;functions.cpp 0%,error.cpp 25%,parser.cpp 47.6%
|
提示词: "提升 parser.cpp 的覆盖率"
|
步骤
|
MCP 工具
|
结果
|
|
读取源码和现有测试
|
-
|
读取 parser.cpp、unittests.cpp 以了解结构
|
|
获取精确未执行行
|
get_file_coverage_detail (status_filter: unexecuted, file: parser.cpp)
|
识别出 151 个未执行插桩点
|
|
编写针对性测试
|
-
|
针对位运算、比较、算术、数学和三角函数运算符添加了新测试用例
|
|
重新构建插桩二进制文件
|
-
|
生成更新后的 unittests.exe.csexe
|
|
合并更新结果
|
import_execution_report
|
新执行数据已合并
|
|
验证改善效果
|
get_coverage_overview(decision,global + source-tree)
|
parser.cpp 47.6% → 88.9%;全局 45.0% → 80.1%
|
后续计划
我们将持续向 MCP 服务器中添加并暴露更多 Coco 功能。近期候选项包括 变更风险反模式(Change Risk Anti-Patterns,CRAP)指标、对 Python 的支持、集成 agent 技能 以及 QML 的代码覆盖率支持。
了解更多信息
如需了解 Coco 的更多信息,请访问我们的 产品页面 和 产品文档。Qt 开发者可参阅 QML 示例 和 Qt 操作指南。
如有反馈或建议,请联系 James.Vance@qt.io。 James 是 Coco 项目的高级软件工程师。