通过 pytest 使用多进程处理时如何测量覆盖率?
Posted
技术标签:
【中文标题】通过 pytest 使用多进程处理时如何测量覆盖率?【英文标题】:How to measure coverage when using multirpocessing via pytest? 【发布时间】:2020-07-23 09:54:44 【问题描述】:我通过pytest
运行我的单元测试。对于报道,我使用coverage.py
。
在我的一个单元测试中,我通过multirpocessing
运行一个函数,并且覆盖率没有反映通过multirpocessing
运行的函数,但断言有效。这就是我要解决的问题。
测试如下:
import time
import multiprocessing
def test_a_while_loop():
# Start through multiprocessing in order to have a timeout.
p = multiprocessing.Process(
target=foo
name="Foo",
)
try:
p.start()
# my timeout
time.sleep(10)
p.terminate()
finally:
# Cleanup.
p.join()
# Asserts below
...
要运行测试并查看覆盖率,我在 Ubuntu 中使用以下命令:
coverage run --concurrency=multiprocessing -m pytest my_project/
coverage combine
coverage report
在文档中提供有关如何操作的指导,以便覆盖正确地考虑多处理 (here)。所以我像这样设置了.coveragerc
:
[run]
concurrency = multiprocessing
[report]
show_missing = true
还有sitecustomize.py
看起来像这样:
import coverage
coverage.process_startup()
尽管如此,上面通过multiprocessing
运行的函数仍然没有被覆盖。
我做错了什么或错过了什么?
附: This 似乎是一个类似的问题,但它并没有再次解决我的问题:(
【问题讨论】:
【参考方案1】:我通过执行以下两个操作“修复”了这个问题:
-
将覆盖包从
coverage.py
切换到 pytest-cov
。
在process
上方添加此代码,如通过他们的docs 所述。
代码:
try:
from pytest_cov.embed import cleanup_on_sigterm
except ImportError:
pass
else:
cleanup_on_sigterm()
然后我只需运行pytest --cov=my_proj my_proj/
【讨论】:
以上是关于通过 pytest 使用多进程处理时如何测量覆盖率?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过非 maven 项目的声纳的 junit 测试来测量代码覆盖率