Python Coverage无法统计被终止子进程的覆盖率问题排查
子进程被终止时coverage无法统计其覆盖率的问题
我在Linux环境下使用Python 3.7.1(因环境限制必须使用该旧版本)和coverage 7.2.7,尝试统计包含subprocess的代码覆盖率,但仅能获取主进程的覆盖率,子进程的覆盖率无法被统计。
主进程代码(main.py)
#!/usr/bin/env python3 import os import subprocess process = subprocess.Popen(["python3", "child.py"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) i = 0 for line in process.stdout: line = line.decode().rstrip() print(line) if i < 10: i += 1 else: break process.terminate() process.wait()
子进程代码(child.py)
#!/usr/bin/env python3 import sys import time import random while True: time.sleep(1) print(random.randint(0, 10), flush=True)
已完成的配置操作
我已按照coverage官方文档配置:
- 创建
.coveragerc配置文件,内容如下:
[run] branch = True parallel = True concurrency = thread, multiprocessing
(尝试过添加/移除concurrency配置,均无效果)
2. 设置环境变量COVERAGE_PROCESS_START指向该.coveragerc文件
3. 在site目录配置sitecustomize.py,内容如下:
import coverage coverage.process_startup()
已确认该文件在子进程启动时会被执行
运行现象
通过coverage run main.py运行主进程,再执行coverage combine和coverage report生成报告,但报告中仅显示主进程的覆盖率:
Name Stmts Miss Branch BrPart Cover ------------------------------------------- main.py 12 0 4 1 94% ------------------------------------------- TOTAL 12 0 4 1 94%
执行combine前仅能看到一个coverage.*文件,正常情况下应至少存在2个。
补充信息
若让子进程通过循环计数器提前正常结束,覆盖率统计即可正常工作。因此我判断coverage未处理子进程被终止的场景,尽管文档说明其应支持atexit()和SIGTERM,且已验证子进程会收到主进程terminate()发送的SIGTERM信号。
我已查阅相关问题仍未解决,请问问题出在哪里?
内容的提问来源于stack exchange,提问作者Steven Dickinson
相关产品推荐
相关产品推荐

