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
我的自定义跳过逻辑.coveragerc:
[report]
exclude_lines =
pragma: no cover
@abstract
Run Code Online (Sandbox Code Playgroud)
这样,所有abstractmethods和abstractproperties都被标记为跳过.