Cantata执行单元测试或集成测试后,可以继续查看代码被测试用例实际执行到什么程度。覆盖率结果并不只有一个百分比,还会按语句、判定、条件、MC/DC等不同指标分别统计。测试已经运行成功,但覆盖率里少了某些函数、某些源码文件没有数据,或者多个测试脚本的结果没有合在一起时,先分清是代码没有执行到、插桩范围缺失,还是当前查看的覆盖数据没有选全,处理起来会清楚很多。
一、Cantata怎么查看代码覆盖率
1、运行带覆盖率检查的测试脚本
Cantata的覆盖率数据来自插桩后的源码执行结果,测试脚本运行前要确认已经启用对应Coverage Rule Set。
①打开当前Cantata测试工程,在【Project Explorer】中找到准备执行的测试脚本。
②打开测试脚本配置,检查【Coverage Rule Set】是否已经启用。
③按照项目要求选择覆盖指标,例如【Entry Point】【Statement】【Decision】【Condition】或【MC/DC】。
④保存测试脚本并执行【Build】。
⑤构建完成后运行测试,让插桩后的测试程序真正执行被测代码。
⑥测试结束后检查是否已经生成对应的覆盖结果数据。
⑦再进入覆盖率结果视图查看当前测试脚本的统计结果。
Cantata是在源码临时副本上做覆盖率插桩,原来的生产源码不会因为覆盖率采集而被直接修改。不同Coverage Rule Set对应的检查指标也不同,所以查看结果前要先确认当前测试到底采集了哪一类数据。
2、在Coverage Results Explorer里查看结果
覆盖数据生成后,可以从结果树逐层找到没有执行到的代码。
①打开【Coverage Results Explorer】。
②在结果树中找到当前工程和对应测试运行记录。
③展开源码文件,查看当前文件的覆盖率统计。
④继续展开函数,检查具体函数的覆盖情况。
⑤根据项目要求切换【Statements】【Decisions】【Conditions】或【MC/DC】等指标。
⑥选中覆盖率偏低的函数,在【Coverage Viewer】中打开源码。
⑦查看源码中的颜色标识和覆盖项记录,找到没有执行到的语句、分支或条件结果。
⑧测试用例较多时,可以按【Test Case】或【Test Run】筛选,确认是哪一组测试贡献了当前覆盖结果。
Cantata还能把结果下钻到单行代码里的具体结构,因此看到某个函数覆盖率不足时,不用只盯着函数级百分比,可以继续查到是哪一个判定结果或条件组合没走到。
3、确认Data Manager当前加载了哪些数据
同一个工程跑过多批测试后,Coverage Viewer显示的内容还会受到当前数据选择影响。
①打开【Data Manager】视图。
②查看当前已经加载的测试结果和覆盖数据。
③确认准备分析的测试脚本和测试运行记录处于选中状态。
④多个测试运行需要一起查看时,把对应覆盖数据同时加入当前结果集。
⑤不需要参与本次分析的数据可以暂时取消选择。
⑥回到【Coverage Results Explorer】,检查汇总百分比有没有变化。
较新的Cantata版本把覆盖率显示选择交给Data Manager控制。如果只加载了一次测试运行,其他脚本已经生成的覆盖数据不会自动算进当前显示结果。
二、Cantata覆盖率结果不完整如何分析
1、某些源文件完全没有覆盖数据
整个文件都没有结果时,先查插桩范围,而不是马上补测试用例。
①打开当前测试脚本,检查【Software Under Test】是否包含目标源码。
②确认目标.c或.cpp文件参与了测试构建。
③检查【Coverage Rule Set】的应用范围。
④重新执行Build,查看【Console】中该文件是否经过Cantata覆盖率插桩处理。
⑤测试运行结束后检查对应.COV数据是否正常生成。
⑥重新载入覆盖结果,再到【Coverage Results Explorer】查看目标文件。
如果源码没有进入覆盖率插桩范围,即使函数在测试过程中被其他模块调用,也不会产生Cantata可以统计的结构覆盖数据。
2、有覆盖数据但部分分支一直是红色
这种情况说明插桩正常,只是现有测试没有走到对应路径。
①在【Coverage Results Explorer】选中覆盖率不足的函数。
②打开【Coverage Viewer】。
③切换到当前关注的【Decision】或【MC/DC】指标。
④找到没有执行的True、False分支或条件组合。
⑤回到对应测试脚本,打开测试用例。
⑥修改输入参数、全局变量或Stub返回值,让程序进入缺失路径。
⑦增加新的测试用例后重新Build并执行。
⑧再次查看该函数的覆盖变化。
如果某个分支依赖外部函数返回错误码,还要同步调整Stub。单纯增加相似输入,代码仍走原来的路径,覆盖率不会发生变化。
3、多个测试脚本的结果没有合并
一个模块可能分别由几个单元测试或集成测试执行,单看其中一次运行时,覆盖结果会显得偏低。
①检查每个测试脚本运行后生成的【.COV】文件。
②确认需要参与统计的测试运行都已经完成。
③进入【Data Manager】,选择这些覆盖数据。
④回到【Coverage Results Explorer】查看聚合后的结果。
⑤需要形成单独的组合结果时,按项目配置合并多个.COV数据。
⑥用于后续报告时,再检查组合后的覆盖指标和源码范围是否一致。
Cantata支持把不同测试运行产生的.COV数据放在一起分析。如果不同运行使用了不同源码版本或不同编译宏,不能只看一个汇总百分比,还要确认这些数据是否属于同一分析范围。
三、覆盖率仍有缺口怎么继续处理
1、检查无法执行和不准备执行的代码
覆盖缺口不一定都能靠补输入处理,有些代码在当前测试环境里本来就走不到。
①在【Coverage Viewer】定位未覆盖代码。
②检查这段代码是否受编译宏、平台条件或目标硬件控制。
③确认它在当前Build Variant里是否实际参与编译。
④属于其他编译变体时,切换对应构建配置重新采集覆盖数据。
⑤属于防御性分支时,确认现有测试环境能不能构造触发条件。
⑥无法构造的路径要保留分析记录,不要为了改变百分比直接删除代码或修改判定条件。
Cantata支持Build Variant Coverage,项目使用不同宏构建多个产品变体时,可以分别采集后再查看跨变体覆盖情况。
2、检查测试是否中途退出
覆盖文件不完整还可能和测试运行本身有关。
①打开【Test Results Explorer】检查本次测试状态。
②查看【Console】里是否存在程序异常退出、目标连接中断或测试没有执行完的记录。
③找出停止前执行到的测试用例。
④单独运行该用例,检查是否存在死循环、非法访问或外部依赖异常。
⑤修复测试环境后重新执行测试脚本。
⑥确认.COV文件正常写出,再重新加载覆盖结果。
测试程序没有跑完时,后半段代码不会产生对应执行记录,这和Coverage Viewer显示错误是两回事。
总结
Cantata覆盖率结果出现缺失时,要把插桩范围、测试执行路径、覆盖数据选择和不同构建变体分开看。整份源码没有数据,多半要查测试和插桩配置;只有部分语句或分支没有覆盖,则应回到测试条件本身继续补充。多个测试脚本共同覆盖同一模块时,也要确认结果是否已经放到同一分析范围中。把这些关系理顺后,覆盖率数据会更容易和实际测试情况对应起来。如需进一步了解Cantata代码覆盖率查看、覆盖缺口分析与测试结果合并方法,欢迎联系咨询。