coverage report 只有 61%,主流程明明都跑过。翻明细发现 worker 进程里执行的解析代码一行都没被统计。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,coverage 默认只跟踪当前进程,multiprocessing 起的子进程各自退出,数据没有回传合并。主进程拿到的只是自己那部分。

「子进程覆盖率丢失」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。报错里带路径的,先去看那个路径在不在、权限对不对。

coverage run --concurrency=multiprocessing -m pytest
coverage combine
coverage report

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,打开 concurrency=multiprocessing 配置;子进程启动时调用 coverage.process_startup;跑完执行 combine 合并 .coverage 分片文件;确认并行度大于 1 时只有一个合并结果。

最后用这个标准收尾,合并后覆盖率回到 88% 左右 worker 里那段解析代码出现在报告里。

作者 9823189