2

我通过pytest. 对于我使用的覆盖范围coverage.py

在我的一个单元测试中,我运行一个函数 viamultirpocessing并且覆盖率不反映运行 via 的函数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仍然没有计入覆盖范围。

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

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

4

1 回答 1

3

我通过执行以下两项“修复”了这个问题:

  1. 将覆盖范围包从 切换coverage.pypytest-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/

于 2020-04-10T16:57:44.377 回答