Python代码覆盖和多处理

时间:2015-02-03 11:12:18

标签: python multiprocessing code-coverage coverage.py coveralls

我将coverallscoverage.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版本几乎在开始后就被杀死了。我检查了我的本地机器上的问题,显然是将补丁添加到多处理程序中破坏了我的记忆。使用此修复程序,需要少于1GB内存的测试需要超过16GB。

EDIT2

猴子补丁经过一些小修改后才能正常工作:删除 config_file解析(config_file=os.environ['COVERAGE_PROCESS_START'])成功了。这解决了臃肿记忆的问题。因此,相应的行简单地变为:

cov = coverage(data_suffix=True)

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:0)

我已经花了一些时间来确保覆盖率与multiprocessing.Pool一起使用,但它从未奏效。

我终于做了一个让它起作用的修复工具 - 如果有人指导我,如果我做错了,我会很高兴。

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