Python 代码覆盖率和多处理

Python Code Coverage and Multiprocessing

我使用 coveralls in combination with coverage.py 来跟踪 python 我的测试脚本的代码覆盖率。我使用以下命令:

coverage run --parallel-mode --source=mysource --omit=*/stuff/idont/need.py ./mysource/tests/run_all_tests.py
coverage combine
coveralls --verbose

multiprocessing 外,这工作得很好。不跟踪工作池或子进程执行的代码。

是否也可以跟踪多处理代码?我缺少任何特定选项吗?也许在每次产生新进程时向多处理库添加包装器以开始覆盖?

编辑:

我(和 jonrsharpe,还有 :-) 找到了 monkey-patch for multiprocessing

然而,这对我不起作用,我的 Tracis-CI 构建几乎在开始后就被杀死了。我在我的本地机器上检查了这个问题,显然将补丁添加到 multiprocessing 破坏了我的记忆。通过此修复,占用内存远少于 1GB 的测试需要超过 16GB。

EDIT2:

monkey-patch 在经过小的修改后确实有效:删除 config_file 解析 (config_file=os.environ['COVERAGE_PROCESS_START']) 成功了。这解决了臃肿的内存问题。因此,相应的行简单地变成:

cov = coverage(data_suffix=True)

Coverage 4.0 包含一个命令行选项 --concurrency=multiprocessing 来处理这个问题。之后必须使用 coverage combine。例如,如果您的测试在 regression_tests.py 中,那么您只需在命令行中执行此操作:

coverage run --concurrency=multiprocessing regression_tests.py
coverage combine

我已经花了一些时间来确保覆盖范围适用于 multiprocessing.Pool,但它从来没有奏效。

我终于做了一个修复程序,让它工作 - 如果我做错了什么,如果有人指导我,我会很高兴。

https://gist.github.com/andreycizov/ee59806a3ac6955c127e511c5e84d2b6