C/C++ test中文网站 > 热门推荐 > C/C++test怎样生成并核对代码覆盖率报告 C/C++test覆盖率结果与实际执行路径不符如何核验
教程中心分类
C/C++test怎样生成并核对代码覆盖率报告 C/C++test覆盖率结果与实际执行路径不符如何核验
发布时间:2026/10/31 14:59:17

  跑完测试,打开报告,发现刚才执行过的位置仍标着未覆盖,确实容易让人怀疑采集出了问题。不过,测试执行、覆盖率显示和报告导出各有设置:少选一种指标、只显示某个用例,甚至读到旧的采集文件,都可能造成这种差异。下面以C/C++test Professional的Eclipse界面为例,从生成报告讲到争议代码的核验,避免只盯着一个百分比反复重跑。

  一、C/C++test怎样生成并核对代码覆盖率报告

 

  报告里的覆盖率来自执行期间的插桩采集。准备测试时,就要把需要统计的指标和源码范围确定下来。

 

  1、在执行配置中启用采集

 

  ①打开【Parasoft】→【Test Configurations...】,选中本次测试使用的配置。

 

  ②进入【Execution】→【General】,确认启用【Enable Test Execution】,检查【Instrumentation mode】是否包含覆盖率采集。

 

  ③需要单独选择指标时,编辑自定义插桩设置,在【C/C++Code Coverage metrics】中勾选所需类型。

 

  例如,验收要求涉及分支和MC/DC,就应在执行前启用对应采集。只收集行覆盖率,之后更换显示类型也无法得到完整的分支数据。

 

  2、设置详细覆盖率输出

 

  ①切换到【Execution】→【Runtime】,启用【Generate detailed coverage reports for selected coverage types】。

 

  ②点击【Edit...】,选择需要输出细节的覆盖率指标,保存配置并执行测试。

 

  详细报告适合检查具体缺项。它与插桩设置需要一致,否则可能出现汇总能看到、所需明细却没有的情况。

 

  3、核对后导出报告

 

  ①打开【Parasoft】→【Show View】→【Coverage】,在工具栏下拉菜单的【Type】中选择目标指标。

 

  ②展开项目、文件及函数,检查覆盖数量、总数量和源码标记。

 

  ③在【Test Progress】点击【Generate Report】,填写【Report location】,启用【Generate Reports】。

 

  ④取消【Delete on exit】,点击【OK】,打开生成报告中的【Coverage】查看结果。

 

  文件级覆盖率应与同一执行范围下的界面结果对应。若分母不同,先检查纳入统计的文件和指标,别直接把百分比差异当成采集错误。

 

  二、C/C++test覆盖率结果与实际执行路径不符如何核验

 

  建议挑一个有争议的函数检查。把它对应的用例、输入和实际调用对象确认清楚,再逐步扩大检查范围。

 

  1、排除用例筛选造成的差异

 

  ①打开【Parasoft】→【Show View】→【Test Case Explorer】,选中需要核验的用例。

 

  ②在【Coverage】点击【Synchronize with selection in Test Case Explorer】,查看该用例对应的覆盖情况。

 

  ③取消同步筛选,再比较整套测试结果。

 

  界面可能显示所选用例的覆盖率,而报告反映的是更大的执行范围。先统一范围,才能判断哪段代码确实没有执行。

  2、确认执行的是目标实现

 

  函数名称出现在日志里,不一定表示真实函数体已经运行。单元测试中,相关调用可能由桩函数接管。

 

  ①打开【Parasoft】→【Show View】→【Stubs】,检查目标调用的桩配置。

 

  ②回到【Test Configurations...】→【Execution】→【General】,检查【Quick execution mode】。

 

  ③近期改过桩、头文件或编译选项时,取消快速执行,重新准备并运行测试。

 

  宏定义也要与预期构建一致。被条件编译排除的代码,不能靠增加测试输入覆盖;源码文件仍然显示那段文字,并不代表它进入了测试程序。

 

  3、检查“执行过”对应哪种覆盖率

 

  ①在【Coverage】→【Type】中切换行、分支或MC/DC指标,定位尚未覆盖的元素。

 

  ②查看路径覆盖率时,双击函数,再使用【Highlight next element】和【Highlight previous element】逐条检查。

 

  某行条件表达式变绿,只能说明该行到达过。例如A与B采用短路与运算,A为假时,B可能根本没有求值。函数被调用一次,也不能证明其中各条分支都走过。

 

  C/C++test的路径统计对循环采用有限规则;信号或被调函数抛异常产生的特殊路径,也可能被记录为unexpected。它不能直接当作完整的运行轨迹使用。

 

  4、检查采集是否完整返回

 

  ①在【Test Progress】展开执行详情,查看结果读取、通信及测试终止信息。

 

  ②进入【Execution】→【General】,核对应用监测中的【Optimize coverage】设置。

 

  ③对于外部采集结果,检查【Load Application Coverage】配置中的【Coverage log files】,确认读取的是本次文件。

 

  部分优化采集模式会在程序结束时发送缓冲数据。目标复位、强制终止或传输中断可能使结果缺失,应先确认回传过程,再补跑测试。

 

  三、C/C++test如何复现并保留覆盖率差异

 

  定位到可疑位置后,可以做一次范围较小的复现。这样既方便比较,也能减少旧数据和其他用例的干扰。

 

  1、从覆盖位置反查用例

 

  ①在源码编辑器中选中目标覆盖元素,右键选择【Parasoft】→【C++test】→【Show test case(s)for covered element】。

 

  ②在【Test Case Explorer】查看被标出的关联用例,选择其中一个重新执行。

 

  ③返回【Coverage】,启用用例同步,核对目标位置。

 

  这一步能回答“到底哪个用例覆盖了它”。若关联用例与预想不同,再检查前置状态、桩返回值和用例之间的共享数据。

 

  2、核对外部日志与映射数据

 

  ①使用cpptestcc采集时,选择项目,进入【Parasoft】→【Test Configurations】→【Utilities】→【Load Application Coverage】。

 

  ②在【Execution】→【General】→【Execution details】检查【Coverage map files root location】及【Coverage log files】。

 

  ③重新加载后,通过【Generate Report】输出到独立目录。

 

  运行日志需要与构建时生成的代码结构数据配套。换了源码版本、重新插桩或移动工作目录后,应核对这两部分,避免旧映射与新日志混用。

  总结

 

  覆盖率最有用的地方,是把测试遗漏具体到代码位置,让团队知道还缺什么验证。它也有边界:路径覆盖不等于需求覆盖,执行到某行也不代表断言检查充分。日常维护中,将报告与代码提交、构建配置和测试输入一起留存,后面出现差异时就能找到比较依据,少一些凭记忆解释结果的情况。希望这篇文章能帮助大家把覆盖率问题查得更清楚,让报告真正服务于测试改进。如需了解相关软件与应用方案,欢迎沟通咨询。

176 5129 0128