一个组件的正常处理和超时处理都可能调用同一个清理函数。只跑正常用例,清理函数已经执行过,但超时分支里的那次调用还没测到。TESSY的函数覆盖率(FC)按函数统计,调用对覆盖率(CPC)则细到源码里的调用位置。排查覆盖缺口时,后者能帮你找到漏掉的是哪一处调用,即使两处调用来自同一个函数。
一、TESSY调用对覆盖率怎么看
先确认测试运行时启用了CPC,再到结果里展开具体位置。覆盖率查看器显示的是已执行测试的测量结果,刚改完插桩选项,还得重新运行才有对应数据。
1、运行测试时启用CPC
①在【Overview】中选中要检查的测试对象,打开【Execute Test】。
②在【Instrumentation】中核对插桩范围。若要手动选择本轮的覆盖率指标,取消勾选【Use preselected coverage】,再启用【Call Pair Coverage(CPC)】。
③单击【Execute】运行测试。完成后切换到【Coverage Viewer】,选中与本轮执行对应的结果。
2、展开到源码行和列
调用对覆盖率视图里的百分比可以逐层展开。同一个被调函数下面,有时会出现多个源文件,也可能在同一个调用者下面列出多个位置。
①打开【Call Pair Coverage】视图,在【Location】列展开被调函数、源文件和调用者,找到带行号及列号的条目。
②查看对应条目的【Reached】。位置行显示数字时,按该次结果中的到达次数读取;显示短横线时,说明该位置在所选结果中未到达。
③如果同一个调用者下面有多处命中,分别用【Location】中的行号和列号对照源码。记录缺口时,把调用者和调用位置一起记下。
二、TESSY调用对覆盖率与函数覆盖率有何区别
FC看统计范围内的被调函数有没有执行过,CPC看纳入统计的各个调用位置有没有到达。对组件测试来说,一个函数只执行过一次,就可能出现FC已覆盖、CPC仍有缺口的结果。
1、用同一个被调函数对照两项结果
①在组件测试中挑一段有两处直接调用的代码,例如【handleEvent()】分别在正常分支和超时分支调用【cleanup()】。
②在【Execute Test】中为该组件测试启用【Function Coverage(FC)】和【Call Pair Coverage(CPC)】,只运行能走到正常分支的用例。
③查看【Function Coverage(FC)】的函数结果,再到【Call Pair Coverage】展开【cleanup()】的两个调用位置。
假设cleanup()是纳入FC统计的函数,正常用例执行后,它就已经算作被覆盖。如果CPC中也只列出示例里的两处调用,那么该函数名下的CPC是50%。即便正常位置因循环到达十次,超时位置没走到,这个比例也不会增加。
2、区分组件函数覆盖和单元入口覆盖
TESSY将组件测试中的函数覆盖率记为FC。单元测试中,模块各测试对象是否至少执行过一次,对应的是入口点覆盖率EPC。汇总报告时容易把这两项都口头叫作“函数覆盖”,审阅时应保留原指标名。
①核对【Overview】中选中的对象属于单元测试还是组件测试,再查看【Instrumentation】中可选的覆盖率指标。
②在测试记录中保留【Function Coverage(FC)】或【Entry Point Coverage(EPC)】的原始名称,同时注明统计对应的模块或组件。
3、看清CPC的统计边界
①遇到回调时,先在【源文件】中确认它是直接调用,还是通过函数指针调用。
②若属于函数指针调用,将该回调从【Call Pair Coverage】的核对清单中分开,保留能确认回调执行及输出的测试记录。
③测试C++时,遇到构造函数、运算符或重载方法,按【Call Pair Coverage】列出的项目核对,别用源码里肉眼数出的调用数量直接计算比例。
TESSY的CPC不统计经函数指针发起的调用。其覆盖率说明还列出C++的统计限制:忽略构造函数调用和运算符,重载方法调用按同名归集显示,不按签名分别列出。报告里没有某个条目,和条目已列出但未到达,是两种不同的情况。
三、TESSY调用对覆盖率有缺口时怎么补测
补测时,行列号比汇总百分比更有用。比如同一函数下只有超时位置未到达,就围绕超时路径设计场景,顺带确认清理动作是否产生了预期结果。
1、沿未到达的位置反查触发条件
①在【Call Pair Coverage】中找到【Reached】显示短横线的位置,按【Location】标出的文件、行号和列号查看源码。
②从该调用位置向前检查【条件分支】和提前返回语句。记录进入这条路径需要的输入、初始状态及外部返回值。
③在对应【测试用例】中设置这些条件。测试设计允许用桩模拟外部返回时,只调整该场景依赖的【桩函数】返回值。
④运行新增用例,在本轮【Coverage Viewer】结果中核对该位置是否到达,同时检查用例是否通过。
2、区分覆盖率证据和行为验证
①在【Call Pair Coverage】中记录补测命中的位置,连同对应的【测试用例】编号写入复核记录。
②在该用例的【预期结果】中加入可观测的行为,例如超时标志是否复位、资源是否释放。若测试只执行了替代实现,记录本轮验证的是调用路径还是实际清理行为。
位置已经到达,仍可能传错参数,或者清理后留下一项状态没恢复。把覆盖率和用例结果并排看,才能分清这次补测解决的是路径遗漏,还是也验证了这条路径上的行为。
总结
看到FC满覆盖时,可以再问一句:同一个函数从哪些地方被调用过?这在清理、错误处理和状态复位一类代码里尤其有用,因为同一段处理逻辑常被多个分支共用。覆盖率报告中留下一条具体的调用位置和对应场景,比只抄一个百分比更方便复查。以后代码调整了行号,也能凭场景说明找回当时要验证的那条路径。