我通过 pytest
运行我的单元测试。对于覆盖范围,我使用 coverage.py
.
在我的一个单元测试中,我通过 multirpocessing
运行一个函数,覆盖范围并未反射(reflect)通过 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似乎是一个类似的问题,但它并没有再次解决我的问题:(
最佳答案
我通过执行以下两项操作“修复”了此问题:
- 从
coverage.py
切换承保套餐至pytest-cov
. - 按照 docs 的描述,将此代码添加到
process
之上.
代码:
try:
from pytest_cov.embed import cleanup_on_sigterm
except ImportError:
pass
else:
cleanup_on_sigterm()
然后我只需运行 pytest --cov=my_proj my_proj/
关于python - 通过 pytest 使用多处理时如何测量覆盖率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61143858/