我其实不太明白为什么要定义这个read
方法,然后使用单个指令pass
。如果你不需要它,就让它抛出NotImplementedError
异常。
class IReader(object):
@abstractmethod
def read(self):
raise NotImplementedError
如文档中所指定的,抽象方法可以有一个由子类使用super()
的实现。但在你的情况下,它什么也不做。因此,除非你有充分的理由,否则最好让它引发NotImplementedError
。
(可以说,一个好的理由可能是所有子类都因某种原因调用super().my_method()
,因此您需要在抽象类中实现所有方法。)
如何从覆盖率报告中排除抽象方法
无论如何,测试覆盖率只是您构建的指示器:您要测试的代码部分和您实际测试的部分。定义“要测试的代码”取决于您。
如果您认为有兴趣,可以添加一个测试来检查抽象方法是否返回NotImplementedError
或者只是pass
。
或者你可能认为(这似乎是合理的)测试这个方法是没有意义的,那么在测试覆盖报告中排除该方法的方式是使用
#pragma: no cover
。
excluding
class IReader(object):
@abstractmethod
def read(self):
pass
上面链接的文档页面展示了如何通过在您的配置文件中添加以下内容来排除所有
NotImplementedError
方法:
[report]
exclude_lines =
pragma: no cover
raise NotImplementedError
为了避免在每个抽象方法中添加
pragma
,您可以这样做。
2020编辑
我刚刚注意到@abstractmethod装饰器。由于它阻止类被实例化,所以我不会引发NotImplementedError
。请参见this other answer.
我只会保留该方法为空。从语法上讲,文档字符串就足够了。
class IReader(object):
@abstractmethod
def read(self):
"""Read data"""
#pragma: no cover
注释。或者也可以使用raise NotImplementedError
(尽管我不确定它是否会默认从覆盖范围中排除)。 - Łukasz Rogalski