27

我将工作服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,也 :-) 找到了一个用于 multiprocessing 的猴子补丁

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

编辑2

Monkey-patch 在稍作修改后确实可以工作:删除config_file解析 ( config_file=os.environ['COVERAGE_PROCESS_START']) 就可以了。这解决了内存膨胀的问题。因此,相应的行简单地变为:

cov = coverage(data_suffix=True)
4

2 回答 2

26

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

coverage run --concurrency=multiprocessing regression_tests.py
coverage combine
于 2016-04-26T11:29:49.080 回答
1

我花了一些时间试图确保覆盖范围与 . 一起使用multiprocessing.Pool,但它从未奏效。

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

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

于 2016-12-28T16:04:31.507 回答