从覆盖率报告中排除抽象属性
我有一个抽象基类,类似于:
class MyAbstractClass(object):
__metaclass__ = ABCMeta
@abstractproperty
def myproperty(self): pass
但是当我在我的项目上运行nosetests(还有覆盖率检查)时,它抱怨说属性定义的那一行没有被测试。实际上,它是无法被测试的(据我所知),因为实例化这个抽象类会导致抛出异常。
有没有什么解决办法,或者我就只能接受测试覆盖率低于100%呢?
当然,我可以去掉ABCMeta
的使用,直接让基类抛出NotImplementedError
,但我更喜欢前一种方法。
4 个回答
22
我在我的 .coveragerc
文件里设置了自定义的跳过逻辑:
[report]
exclude_lines =
pragma: no cover
@abstract
这样一来,所有的抽象方法和抽象属性都会被标记为跳过。
70
对我来说,最好的解决办法就是@Wesley在他对被接受答案的评论中提到的,具体来说,就是把'pass'替换成一个文档字符串,用来说明这个抽象属性,比如:
class MyAbstractClass(object):
__metaclass__ = ABCMeta
@abstractproperty
def myproperty(self):
""" this property is too abstract to understand. """
43
你不能完全排除抽象属性,但如果稍微改动一下,就可以做到。让你的抽象属性抛出一个错误:
@abstractproperty
def myproperty(self):
raise NotImplementedError
然后你可以告诉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
如果你想了解更多关于哪些行可以一直忽略的想法,可以查看这个链接: http://nedbatchelder.com/code/coverage/config.html