内德·巴切尔德:针对来电者的专属报道 笔记

内德·巴切尔德:针对来电者的专属报道

作者希望按调用方粒度测量某个函数的代码覆盖率。这一需求源于对其 BASIC 解释器 Acidica 中错误检查代码的重构。最初,每个内置函数都拥有独立的参数验证机制,从而能够针对特定的错误条件进行精确覆盖;重构后,验证逻辑被移至共享的辅助函数中,导致这种细粒度的覆盖信息丢失。提出的解决方案是利用一个装饰器,借助 coverage.py 的动态上下文功能。该装饰器在执行被装饰函数之前,会创建一个以调用站点(文件名和行号)命名的新覆盖上下文;函数执行完毕后,则恢复原有的上下文。一个使用 coverage.Coverage.current()cov.switch_context() 实现的原理验证装饰器展示了该功能。这需要 coverage.py 进行一项微小的、尚未发布的修改以支持嵌套上下文。作者发现,其 HTML 覆盖率报告现在为 expects 函数的每个调用方显示了独立的上下文,从而揭示了各调用方分别执行了哪些分支。未来的改进包括后处理这些上下文,以识别特定调用方缺失的覆盖情况,并启用层级或多重上下文机制,以便同时追踪调用方和执行细节。作者还计划通过覆盖率配置文件集成此功能,而非通过装饰器修改源代码。潜在的应用场景包括使用函数参数(如 func_name)作为上下文标识符。
CdXz5zHNQW_IFrCzZRuFh.png