很多团队把C/C++test跑起来以后,最先遇到的不是没有覆盖率,而是结果明明出来了,导出的报告不够细,或者字段一多就不知道该先看哪一列。这个问题本质上分成两步,一步是把覆盖率报告按对的方式导出来,另一步是把LC、SC、DC、MCDC这类字段真正看明白。Parasoft官方文档里其实把入口拆得很清楚,测试配置决定要不要生成详细覆盖率,报告页决定以什么形式导出,覆盖率文档再解释每一种指标到底代表什么。
一、C/C++test覆盖率报告怎么导出
覆盖率报告导出这件事,最容易出错的地方不是点不到按钮,而是先后顺序弄反了。正确思路是先在测试配置里把覆盖率细节打开,再去生成正式报告,这样导出来的内容才不会只有一个总百分比。
1、先在测试配置里把详细覆盖率打开
进入【Parasoft】→【Test Configurations】后先选中要跑的测试配置,再打开【Execution】→【Runtime】。这里需要先勾选生成详细测试执行报告,然后再打开【Generate detailed coverage report for】并指定你要看的覆盖率类型,不先做这一步,后面导出的主报告通常只有覆盖率汇总,不会带源码级细节。
2、再到报告设置里把导出格式定好
覆盖率细节开关设好以后,再进入【Parasoft】→【Preferences】→【Reports】设置导出格式。官方文档说明,C/C++test可以生成HTML、PDF和自定义格式的报告,常规查看更适合先用HTML,因为后续点开详细覆盖率链接和源码标注会更直接。
3、测试跑完以后从测试进度页正式导出
执行完成后,在【Test Progress】工具栏里点击【Generate Report】。弹出的【Report&Publish】窗口里可以设置【Report location】、是否自动在浏览器打开,以及是否真正生成报告,确认后点【OK】就会把报告输出到指定目录。
4、想要带源码标注的覆盖率报告时要提前选对指标
如果你希望报告里不只是一个覆盖率百分比,而是能继续点进去看哪一行覆盖、哪一行没覆盖,就要在前面的详细覆盖率选项里先选具体指标。官方给出的可选缩写包括LC、SC、BCC、DC、SCC、MCDC,分别对应行覆盖、语句覆盖、块覆盖、判定覆盖、简单条件覆盖和MC/DC,只有提前选了,HTML报告里才会挂出对应的详细链接。
5、命令行场景可以直接把报告落到固定目录
如果项目是在流水线里跑,不走界面导出,官方支持在命令行执行时直接加上-report参数生成报告。报告格式可以通过localsettings里的report.format控制,常见就是HTML、PDF或自定义格式,这样做更适合nightly或回归任务统一出包。
二、C/C++test报告字段含义怎么看
很多人第一次看C/C++test覆盖率报告,会把所有字段都当成一种覆盖率在看,结果越看越乱。实际上,这些字段对应的是不同的覆盖单位,有的是按行算,有的是按分支算,有的是按条件独立性算,不能混着理解。
1、先把LC、SC、BCC这三类基础字段分开
LC是行覆盖,表示可执行源码行有没有至少执行过一次。SC是语句覆盖,看的是可执行语句有没有被控制流至少到达过一次。BCC是块覆盖,它和行覆盖很像,但统计单位不是代码行,而是basic block,也就是没有控制流分叉的一段线性代码。
2、再看DC、SCC、MCDC这三类分支和条件字段
DC是判定覆盖,也就是分支覆盖,看的是每个分支点的所有可能结果是否都至少发生过一次,官方把if else、for、while、do while和switch都算进分支点。SCC是简单条件覆盖,看每个条件有没有分别出现过true和false两种结果。MCDC更严格,它不只要求条件取到真和假,还要求每个条件都能独立影响最终判定结果,所以它通常比普通分支覆盖更难做满。
3、Function Coverage和Call Coverage不是一回事
Function Coverage看的是函数有没有至少被到达过一次,只要函数进过一次,就算这个函数被覆盖。Call Coverage看的是已定义的函数或方法调用有没有在运行时真正执行过,它统计的是调用点而不是函数声明本身,而且构造函数调用、隐式析构、以及C++运算符调用都不计入这一项,所以这两个字段很容易一起高,也很容易出现一高一低。
4、Path Coverage不要和分支覆盖混看
Path Coverage关注的是从函数入口到出口的不同执行路径有没有走到,而不是单个分支有没有翻到两边。官方说明里特别提到,循环会带来无限多路径,所以工具只取有限的循环可能性,例如零次和至少一次,这也是为什么路径覆盖通常比行覆盖和分支覆盖更难接近满值。
5、看到N/A时先别急着当成异常
N/A不一定代表工具坏了,很多时候只是这个文件上压根没有对应元素。官方举的例子很明确,如果一个文件里没有decision,也就是没有可统计的分支点,那么DC这一项就会显示N/A,而不是0。这个区别很重要,因为0说明有分支但没覆盖,N/A则说明这类元素本身不存在。
三、C/C++test覆盖率报告该先看什么
报告字段都认识了以后,真正决定效率的,其实是阅读顺序。覆盖率报告不是每一列都同样重要,项目目标不同,优先看的字段也会不同,抓错重点就很容易把时间花在解释数字上。
1、先看当前项目要求的主指标
如果项目只是做一般单元测试完善,通常先看LC、SC、Function Coverage会更直接。要是项目本身带功能安全或高可靠目标,那就不能只盯行覆盖,DC、SCC甚至MCDC才是更有代表性的字段,因为它们更能反映逻辑分支有没有真正被测试到。
2、再看汇总是卡在项目级、文件级还是函数级
官方说明里提到,Coverage视图会按项目、文件和函数层级展示统计结果。实际看报告时也建议沿着这个顺序往下钻,先找整体最低的模块,再落到具体文件,最后再看函数,不然很容易在一堆局部未覆盖里来回打转,却一直没抓到真正拖后腿的文件。
3、看到详细报告后优先看颜色和未覆盖区域
在源码标注视图里,官方用绿色表示已覆盖,粉色表示未覆盖。简单条件覆盖里还会出现黄色,表示条件只出现过一边结果,还没同时出现true和false。真正排查时,先找粉色集中区和黄色条件区,往往比先盯总百分比更容易补出有效用例。
4、覆盖率没有显示时先检查是不是指标没对上
官方在Coverage视图说明里提醒过,如果执行后没看到覆盖率,先检查两件事,一是覆盖率采集本身有没有打开,二是当前显示的覆盖率类型是不是和执行时配置的一致。这个细节在日常使用里很常见,尤其是只打开了LC,却跑去看DC时,界面就会给人一种结果没出来的错觉。
5、需要补用例时可以反查到具体测试
如果报告已经告诉你哪里没覆盖,下一步不是盲补,而是先看哪些测试已经覆盖到相关元素。官方支持从覆盖元素反查关联测试用例,也支持按选中的测试用例查看覆盖统计,这样你能更快判断是要补新用例,还是把现有用例数据换掉。
总结
C/C++test覆盖率报告怎么导出,C/C++test报告字段含义怎么看,这两个问题放在一起看会更顺。前者解决的是报告怎么出得完整,后者解决的是数字怎么读得准确。实操时先在测试配置里打开详细覆盖率,再从【Generate Report】导出HTML或PDF报告,随后按LC、SC、DC、SCC、MCDC这些字段去分层阅读,基本就能把报告从“有结果”推进到“能定位问题”。