python - 通过 pytest 使用多处理时如何测量覆盖率?

标签 python unit-testing pytest coverage.py pytest-cov

我通过 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似乎是一个类似的问题,但它并没有再次解决我的问题:(

最佳答案

我通过执行以下两项操作“修复”了此问题:

  1. coverage.py 切换承保套餐至pytest-cov .
  2. 按照 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/

相关文章:

python - 将嵌套列表转换为 numpy 数组的有效方法

python - `sys.meta_path` 和 `sys.path_hooks` 导入器对象有什么区别?

javascript - Angular 2 fakeAsync 在使用 tick() 的函数中等待超时?

objective-c - 如何在 objective-c 中比较两个具有很多属性的对象

c# - 这是使用模拟对存储库进行单元测试的正确方法吗?

python - Pytest "No module named..."问题

python - 让 PyQt5 标签在发送 http 请求时动态更新

python - 杀死线程不起作用

python - 基于命令行参数参数化 pytest 函数

python - 是否有标准方法告诉 py.test 针对特定代码运行?