从coverage报告中排除abstractproperties

Dem*_*cht 23 python code-coverage abc nosetests coverage.py

我有一个抽象的基类:

class MyAbstractClass(object):
    __metaclass__ = ABCMeta

    @abstractproperty
    def myproperty(self): pass
Run Code Online (Sandbox Code Playgroud)

但是当我在我的项目中运行nosetests(覆盖率)时,它会抱怨属性def line未经测试.它实际上无法测试(AFAIK),因为抽象类的实例化将导致异常被引发.

有没有解决方法,或者我只需要接受<100%的测试覆盖率?

当然,我可以删除ABCMeta用法并简单地提升基类NotImpementedError,但我更喜欢前一种方法.

kou*_*ouk 32

对我来说,最好的解决方案是@Wesley在对已接受的答案的评论中提到的,特别是用抽象属性的文档字符串替换'pass',例如:

class MyAbstractClass(object):
    __metaclass__ = ABCMeta

    @abstractproperty
    def myproperty(self):
       """ this property is too abstract to understand. """
Run Code Online (Sandbox Code Playgroud)


Ned*_*der 28

没有办法像你拥有的那样精确地排除抽象属性,但如果你做了一些改变,你就可以.让您的抽象属性引发错误:

@abstractproperty
def myproperty(self): 
    raise NotImplementedError
Run Code Online (Sandbox Code Playgroud)

然后,您可以指示coverage.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
Run Code Online (Sandbox Code Playgroud)

有关您可能希望始终忽略的行类型的更多想法,请参阅:http://nedbatchelder.com/code/coverage/config.html

  • 另一种选择是将docstring添加到抽象方法或属性中,而不是使用`pass`.这样做的另一个好处是可以获得有关抽象方法/属性如何表现的文档. (20认同)
  • wait:你可以在每个抽象属性上添加一个"#pragma:no cover"注释,但你不能将body从pass更改为"raise NotImplementedError"?对于他自己,我猜...很高兴你找到了你喜欢的解决方案. (4认同)

Pax*_*x0r 9

我的自定义跳过逻辑.coveragerc:

[report]
exclude_lines =
    pragma: no cover
    @abstract
Run Code Online (Sandbox Code Playgroud)

这样,所有abstractmethods和abstractproperties都被标记为跳过.