Подтвердить что ты не робот

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

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

class MyAbstractClass(object):
    __metaclass__ = ABCMeta

    @abstractproperty
    def myproperty(self): pass

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

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

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

4b9b3361

Ответ 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

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