Исключение абстрактных свойств из отчетов покрытия

У меня есть абстрактный базовый класс по направлениям:

class MyAbstractClass(object):
    __metaclass__ = ABCMeta

    @abstractproperty
    def myproperty(self): pass

Но когда я запускаю тестирование носа (какое покрытие) в моем проекте, он жалуется, что строка свойства def не проверена. На самом деле его нельзя протестировать (AFAIK), так как создание экземпляра абстрактного класса приведет к возникновению исключения..

Есть ли какие-либо обходные пути к этому, или я просто должен принять < 100% тестовое покрытие?

Конечно, я мог бы удалить ABCMeta использование и просто поднять базовый класс NotImpementedErrorНо я предпочитаю первый метод.

4 ответа

Решение

Невозможно исключить абстрактные свойства в точности так, как они есть у вас, но если вы сделаете небольшое изменение, вы можете это сделать. Пусть ваше абстрактное свойство вызовет ошибку:

@abstractproperty
def myproperty(self): 
    raise NotImplementedError

Затем вы можете дать указание cover.py игнорировать строки, которые вызывают NotImplementedError. Создайте файл.coveragerc и вставьте в него:

[report]
exclude_lines =
    # Have to re-enable the standard pragma
    pragma: no cover

    # Don't complain if tests don't hit defensive assertion code:
    raise NotImplementedError

Дополнительные сведения о типах линий, которые вы можете игнорировать, см. По адресу: http://nedbatchelder.com/code/coverage/config.html

Для меня лучшим решением было то, что @Wesley упомянул в своем комментарии к принятому ответу, в частности, заменив 'pass' строкой документации для абстрактного свойства, например:

class MyAbstractClass(object):
    __metaclass__ = ABCMeta

    @abstractproperty
    def myproperty(self):
       """ this property is too abstract to understand. """

У меня есть пользовательская логика пропуска в моем .coveragerc:

[report]
exclude_lines =
    pragma: no cover
    @abstract

Таким образом, все абстрактные методы и абстрактные свойства помечаются как пропущенные.

Прямо из документов . Добавьте в свойpyproject.tomlследующий раздел:

      [tool.coverage.report]
exclude_also = [
    "raise AssertionError",
    "raise NotImplementedError",
    "@(abc\\.)?abstractmethod",
    ]

или чтобы.coveragerc

      [report]
exclude_also =
    raise AssertionError
    raise NotImplementedError
    @(abc\.)?abstractmethod
Другие вопросы по тегам