PyDevD мешает pytest правильно генерировать покрытие

Я имею дело с проблемой покрытия генерации, которая не работает должным образом. Наконец я обнаружил, что он каким-то образом связан с пакетом 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 препятствует успешному созданию отчета.

Проверено:

  • с питоном 3.8 и 3.9
  • с pydevd 2.2.0 и 2.3.0
  • тест 6.2.2
  • pytest-ков 2.11.1

person Nerxis    schedule 26.02.2021    source источник


Ответы (1)


Это действительно была ошибка в pydevd.

Я исправил это в https://github.com/fabioz/PyDev.Debugger/commit/be32cd821f2574566385deeec23081365bf16722

Тем временем вы можете применить то же исправление к своей локальной версии.

Чтобы узнать файл для исправления, вы можете сделать:

import pydevd
from _pydevd_bundle import pydevd_constants
print(pydevd_constants.__file__)
person Fabio Zadrozny    schedule 27.02.2021
comment
Спасибо за быстрое решение! Это будет частью следующего релиза, верно? Если да, то есть ли у вас какие-либо ожидания, когда он может быть выпущен? Поскольку последний случай произошел всего несколько дней назад, думаю, в этом месяце его не будет.. - person Nerxis; 01.03.2021
comment
На самом деле, я планирую релиз в ближайшее время, так как хочу снова изменить блоки комментариев на PyDev, так что это должно быть скоро (возможно, 1-2 недели). - person Fabio Zadrozny; 02.03.2021
comment
Привет, у тебя есть какие-нибудь новости относительно релиза? Ошибка была исправлена ​​27 февраля, но последняя версия PyPI, 2.3.0, была выпущена 21 февраля. Спасибо. - person TheAl_T; 06.04.2021
comment
Он уже выпущен, используйте версию 2.4.1, так как в 2.4.0 был какой-то баг - person Nerxis; 13.04.2021