通过pytest使用多点处理时,如何测量覆盖率



我通过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

在文档中,给出了如何操作的指导,以便覆盖范围正确地考虑多处理(此处(。所以我建立了一个.coveragerc,就像这样:

[run]
concurrency = multiprocessing
[report]
show_missing = true

并且sitecustomize.py看起来是这样的:

import coverage
coverage.process_startup()

尽管如此,通过multiprocessing运行的上述函数仍然没有在覆盖范围内得到考虑。

我做错了什么或错过了什么?

附言:这似乎是一个类似的问题,但它并没有再次解决我的问题:(

I通过执行以下两个操作"修复"了此问题:

  1. 将覆盖范围包从coverage.py切换到pytest-cov
  2. 如通过他们的文档所述,在process之上添加此代码

代码:

try:
from pytest_cov.embed import cleanup_on_sigterm
except ImportError:
pass
else:
cleanup_on_sigterm()

然后我简单地运行pytest --cov=my_proj my_proj/

最新更新