PyDevD 阻止 pytest 正确生成覆盖

时间:2021-02-26 08:08:55

标签: python pytest pydev pytest-cov

我正在处理无法按预期工作的代覆盖问题。最后我发现它以某种方式连接到 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 会阻止成功生成报告的覆盖范围。

测试

  • 使用 python 3.8 和 3.9
  • 使用 pydevd 2.2.0 和 2.3.0
  • pytest 6.2.2
  • pytest-cov 2.11.1

1 个答案:

答案 0 :(得分:2)

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

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

修复它

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

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

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