python 从覆盖率报告中排除abstractproperties

nbnkbykc  于 2023-10-15  发布在  Python
关注(0)|答案(4)|浏览(125)

我有一个抽象的基类沿着它是这样的:

class MyAbstractClass(object):
    __metaclass__ = ABCMeta

    @abstractproperty
    def myproperty(self): pass

但是当我在我的项目上运行nosetests(which coverage)时,它会抱怨属性def行未测试。它不能 * 实际 * 被测试(AFAIK),因为抽象类的示例化将导致引发异常。
是否有任何变通方法,或者我必须接受< 100%的测试覆盖率?
当然,我也可以去掉ABCMeta的用法,让基类提升NotImpementedError,但我更喜欢前一种方法。

qpgpyjmq

qpgpyjmq1#

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

class MyAbstractClass(object):
    __metaclass__ = ABCMeta

    @abstractproperty
    def myproperty(self):
       """ this property is too abstract to understand. """
roqulrg3

roqulrg32#

没有办法精确地排除抽象属性,但是如果你做一个小小的改变,你可以。让抽象属性引发错误:

@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

svgewumm

svgewumm3#

我在.coveragerc中有自定义跳过逻辑:

[report]
exclude_lines =
    pragma: no cover
    @abstract

这样所有的abstractmethods和abstractproperties都被标记为skipped。

jgzswidk

jgzswidk4#

直接从docs。在pyproject.toml中添加以下部分:

[tool.coverage.report]
exclude_also = [
    "raise AssertionError",
    "raise NotImplementedError",
    "@(abc\\.)?abstractmethod",
    ]

.coveragerc

[report]
exclude_also =
    raise AssertionError
    raise NotImplementedError
    @(abc\.)?abstractmethod

相关问题