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

Posted

技术标签:

【中文标题】通过 pytest 使用多进程处理时如何测量覆盖率?【英文标题】:How to measure coverage when using multirpocessing via pytest? 【发布时间】:2020-07-23 09:54:44 【问题描述】:

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

在文档中提供有关如何操作的指导,以便覆盖正确地考虑多处理 (here)。所以我像这样设置了.coveragerc

[run]
concurrency = multiprocessing

[report]
show_missing = true

还有sitecustomize.py 看起来像这样:

import coverage
coverage.process_startup()

尽管如此,上面通过multiprocessing 运行的函数仍然没有被覆盖。

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

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

【问题讨论】:

【参考方案1】:

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

    将覆盖包从 coverage.py 切换到 pytest-cov。 在process 上方添加此代码,如通过他们的docs 所述。

代码:

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

然后我只需运行pytest --cov=my_proj my_proj/

【讨论】:

以上是关于通过 pytest 使用多进程处理时如何测量覆盖率?的主要内容,如果未能解决你的问题,请参考以下文章

Appium 并发多进程基于 Pytest框架

如何通过非 maven 项目的声纳的 junit 测试来测量代码覆盖率

读 perf 笔记 简写

pytest---分布式执行用例(pytest-xdist)

在 Python 中测量多线程代码的处理时间

pytest接口自动化测试框架 | 多进程运行用例