Skip to main content

使用AI代码助手生成单元测试并实现代码覆盖率最大化

Comments

代码覆盖率衡量的是源代码中哪些部分已被测试用例执行过。使用的指标可以是已执行的函数、行或分支,也可以是更复杂的指标,如评估语句中的每个条件。根据代码覆盖率工具的不同,测试可以结合单元测试、功能测试甚至手动测试。高代码覆盖率是理想状态,因为这通常代表软件经过了良好的测试。然而,为实现高代码覆盖率而编写测试用例,可能既耗费时间又成本高昂。

本文通过示例演示了如何结合AI代码助手和代码覆盖率工具来生成单元测试,从而提高代码覆盖率。我们还为 AI 代码助手提供了方法,用于执行新生成的单元测试和分析代码覆盖率报告,以验证覆盖率指标是否得到提升。

本文示例在 Visual Studio Code 中将 Microsoft 的 GitHub Copilot 和 Coco(一款适用于 C/C++C#Tcl Qt QML 的代码覆盖率解决方案)相结合。 这种设置是通用的,可适配其他代码覆盖率工具和 AI 代码助手,如 Cursor 和 Claude Code。同样,虽然我们的示例生成的是CppUnit测试,但其他单元测试框架(如 GoogleTest 或 Catch2)也同样适用。

配置

我们以此处现有的 Coco 示例为基础。 这是一个简单计算器示例,使用了表达式解析器(parser),其中包含基线单元测试 。该示例详细说明了如何将 Coco 用于各种使用场景,从基本的代码覆盖到补丁分析等更高级的用法。从此处安装 Coco 和解析器(parser)示例源代码,更多信息可参阅开发文档 

刚接触代码覆盖率? 简而言之,你将使用 Coco 插桩构建,它就像一个计数器:记录执行的行数,并将这些行数与你的测试用例进行匹配。除此之外,应用程序的功能不会改变,您可以使用相同的插桩构建进行所有测试,包括手动测试和功能测试。就这么简单!

 

我们从 parser_v4 版本开始, 该版本包含 Copilot 和 Coco 的配置,能够编译和运行解析器(parser)示例及其附带的单元测试

下图展示了我们为改进单元测试搭建的配置:

Coco blog

组件及其说明如下(使用说明请参阅代码仓库 ):

  1. AI 代码助手的上下文说明,包括以下操作(上图所示的 "Coco setup"):
    1. 构建 Coco 插桩目标;
    2. 运行插桩构建的单元测试;
    3. 处理 Coco 代码覆盖率结果。
  2. 关联步骤1的提示词和改进单元测试的任务(对应 “Coco guidelines” 和 “Tasks”)。
  3. 根据步骤2生成单元测试,对于选定指标,验证代码覆盖率是否提升。在本例中,我们使用行覆盖率作为核心指标。

请注意,生成的单元测试和改进内容需要在流程结束时进行审核。

演示:生成单元测试

完成上述设置后,我们就可以开始使用了。下面是在 Visual Studio 中使用 Microsoft GitHub Copilot 配合 Gemini 2.5 Pro(Agent模式),对解析器示例进行操作的录屏:

 

从演示中可知

  • 最初,行覆盖率约为 65%(见录屏结尾)。

  • 分析最初的覆盖率可知,指令没有聚焦到数学函数上,这些函数没有经过任何测试,如对此进行改进,将可能显著提高项目的整体代码覆盖率。

  • 针对数学函数生成测试用例并运行后,项目的代码行覆盖率提高到了 78%。

本次演示中所用的提示词、Coco 配置指南,以及生成的单元测试优化方案,均可在代码仓库中获取。

结论与后续步骤

在这篇博客中,我们通过结合代码覆盖率工具和 AI 代码助手,了解哪些代码可以进行新的单元测试,以实现更高的覆盖率。使用代码覆盖率工具可以验证生成的测试是否有意义,所选的覆盖率指标是否得到了有效提升。

如果您从事的是安全认证领域的工作,并希望实现全面的测试覆盖率,这样的配置将特别有价值。例如,在汽车或航空航天领域,modified condition/decision coverage (MC/DC) 指标甚至要求100%的覆盖率。一种方法是将其与 Coco 的内置功能结合使用,利用遗传算法生成测试数据,以满足严苛的覆盖率要求。

还可以将其他指标与代码覆盖率结合起来,确定需要新增单元测试的区域。在此文章中,一位解决方案工程师使用了 "CRAP 评分"(结合McCabe复杂度指标与代码覆盖率的综合评分)来识别风险较高的区域,在此增加测试将获得更大收益。

我们没有利用模型上下文协议(MCP),而是直接通过 CLI 调用 Coco 工具。MCP 服务器则可以用于详细了解覆盖率报告,并为更大的代码库处理更长的报告,而不是依赖模型直接解析文本格式的 CSV 报告。该方案同样适用于持续集成(CI)场景。

想要了解更多信息?

有关 Coco 的更多信息, 请参阅我们的产品页面产品文档 。对于 Qt 开发人员,请参阅QML 示例Qt 说明

本文很好地概述了生成单元测试的方法,并提供了使用 Microsoft GitHub Copilot 的示例,还简要提到了单元测试生成中代码覆盖工具的使用。

如需联系作者 Otso Virtanen,请通过邮箱:@qt.io 进行联系——Otso Qt Group 质量保证事业部生成式 AI/AI 计划的产品负责人。 

Comments

Subscribe to our blog

Try Qt 6.11 Now!

Download the latest release here: www.qt.io/download

Qt 6.11 is now available, with new features and improvements for application developers and device creators.

We're Hiring

Check out all our open positions here and follow us on Instagram to see what it's like to be #QtPeople.