Исключение абстрактных свойств из отчетов покрытия
У меня есть абстрактный базовый класс по направлениям:
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