Исключая абстрактные свойства отчетов об охвате
У меня есть абстрактный базовый класс по строкам:
class MyAbstractClass(object):
__metaclass__ = ABCMeta
@abstractproperty
def myproperty(self): pass
Но когда я запускаю nosetests (покрытие) в моем проекте, он жалуется, что строка def def свойства не тестирована. Фактически он не может быть протестирован (AFAIK), поскольку создание абстрактного класса приведет к возникновению исключения.
Есть ли какие-либо обходные пути для этого, или мне просто нужно принять < 100% охват тестирования?
Конечно, я мог бы удалить использование ABCMeta
и просто получить базовый класс raise NotImpementedError
, но я предпочитаю прежний метод.
Ответы
Ответ 1
Невозможно исключить абстрактные свойства точно так же, как у вас есть, но если вы сделаете небольшое изменение, вы можете. У вашего абстрактного свойства возникает ошибка:
@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
Ответ 2
Для меня лучшим решением было то, что @Wesley упомянул в своем комментарии к принятому ответу, в частности заменяя "pass" на docstring для абстрактного свойства, например:
class MyAbstractClass(object):
__metaclass__ = ABCMeta
@abstractproperty
def myproperty(self):
""" this property is too abstract to understand. """
Ответ 3
У меня есть пользовательская логика пропуска в моем .coveragerc
:
[report]
exclude_lines =
pragma: no cover
@abstract
Таким образом, все абстрактные методы и абстрактные свойства помечены как пропущенные.