Исключение абстрактных свойств из отчетов покрытия - PullRequest
22 голосов
/ 09 февраля 2012

У меня есть абстрактный базовый класс, который выглядит следующим образом:

class MyAbstractClass(object):
    __metaclass__ = ABCMeta

    @abstractproperty
    def myproperty(self): pass

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

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

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

Ответы [ 3 ]

29 голосов
/ 09 октября 2013

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

class MyAbstractClass(object):
    __metaclass__ = ABCMeta

    @abstractproperty
    def myproperty(self):
       """ this property is too abstract to understand. """
28 голосов
/ 09 февраля 2012

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

@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

8 голосов
/ 22 декабря 2016

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

[report]
exclude_lines =
    pragma: no cover
    @abstract

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

...