PyDevD 阻止 pytest 正确生成覆盖率

PyDevD is preventing pytest to correctly generate coverage

我正在处理无法按预期工作的生成覆盖问题。最后我发现它以某种方式连接到 pydevd (PyDev 调试器)包。

要重现我的问题,您可以使用以下存储库:cov-project

只有两个文件。 my_package

中的一个
import pydevd  # Just for the purpose to show the problem

def sum(num1, num2):
    return num1 + num2

def mult(num1, num2):
    return num1 * num2

和测试文件test_math.py在测试中:

from my_package.math import sum, mult

def test_sum():
    assert sum(1, 2) == 3

def test_mult():
    assert mult(2, 3) == 6

当我从第一个文件中删除 import pydevd 和 运行 python -m pytest --cov=my_package tests 时,我得到以下输出:

Name                     Stmts   Miss  Cover
--------------------------------------------
my_package/__init__.py       0      0   100%
my_package/math.py           4      0   100%
--------------------------------------------
TOTAL                        4      0   100%

是的,符合预期的 100% 覆盖率。但是当我 运行 相同并继续导入 pydevd 时,我得到:

Name                     Stmts   Miss  Cover
--------------------------------------------
my_package/__init__.py       0      0   100%
my_package/math.py           5      4    20%
--------------------------------------------
TOTAL                        5      4    20%

测试完全相同,唯一的变化是这个额外的导入。当然,在这个设置中 pydevd 是未使用的,我可以简单地删除它。但是我在我的专有代码中使用它,所以我想展示如何重现我的错误的最简单方法,因为在使用 pydevd 时我无法生成适当的覆盖率报告。我可以将其更改为本地导入,因为我在测试中不使用它,然后它会起作用,但我试图了解这里发生了什么以及为什么 pydevd 会阻止覆盖成功生成报告。

测试:

这确实是 pydevd 中的一个错误。

我已经在 https://github.com/fabioz/PyDev.Debugger/commit/be32cd821f2574566385deeec23081365bf16722

中修复了它

您可以同时对您的本地版本应用相同的修复程序。

要找出修复文件,您可以执行以下操作:

import pydevd
from _pydevd_bundle import pydevd_constants
print(pydevd_constants.__file__)