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
我使用 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