我通过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通过执行以下两个操作"修复"了此问题:
- 将覆盖范围包从
coverage.py
切换到pytest-cov
- 如通过他们的文档所述,在
process
之上添加此代码
代码:
try:
from pytest_cov.embed import cleanup_on_sigterm
except ImportError:
pass
else:
cleanup_on_sigterm()
然后我简单地运行pytest --cov=my_proj my_proj/