Pythoncoverage.py exclude_lines

dev*_*rey 5 python regex django code-coverage coverage.py

背景

我有几个 Django 项目,我将它们与 coverage.py 一起使用,并且一直在尝试向我的 .coveragerc 配置文件的 exclude_lines 部分添加一些额外的表达式。问题是,即使使用适当的正则表达式在测试器(例如http://www.pythonregex.comhttp://www.regexr.com )中提取行,它也不会导致行被忽略那个报告。

我已经查看了文档并浏览了存储库,但无法挖掘出我所拥有的配置可能无法正常工作的任何原因。从文档看来,我的配置与他们描述的完全一样。

我还尝试使用django-nose 1.2 版,这是 PyPI 的最后一个版本,它允许异常注入但无济于事,它似乎在确定 Django 视图和 Django REST Framework API 端点的覆盖范围方面存在一些问题在 1.7 版中。

我试过的

我的配置如下:

[run]
branch = True
omit =
    */tests*
    */migrations/*
    *__init__.py*
    */settings/*
    *wsgi.py*
    *admin.py*

[report]
# Regexes for lines to exclude from consideration
exclude_lines =
    pragma: no cover
    def __repr__
    if self.debug:
    raise AssertionError
    raise NotImplementedError
    (.*)except Exception as e:(.*)
    if 0:
    if __name__ == .__main__.:
Run Code Online (Sandbox Code Playgroud)

我还为配置的报告部分中的异常处理尝试了以下组合:

(.*)except Exception as e:
except Exception as e:
except Exception as e:(.*)
Run Code Online (Sandbox Code Playgroud)

下面是一个带有我希望被忽略的代码部分的函数示例:

def my_func():
    try:
        # Some logic
        return True
    except Exception as e:
        return defensive_exception(my_func.__name__, e, False)
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,根据文档,我希望except Exception as e:忽略下面的所有内容或至少该except Exception as e行本身。然而,情况似乎并非如此。如果有人对我的配置有什么问题或我需要做的不同有什么了解,我将不胜感激。

Wol*_*lph 7

我总是做的就是使用pragma: no cover你已经在你的exclude_lines.

def my_func():
    try:
        # Some logic
        return True
    except Exception as e:  # pragma: no cover
        return defensive_exception(my_func.__name__, e, False)
Run Code Online (Sandbox Code Playgroud)


Ned*_*der 5

您不需要匹配整行,因此不需要末尾的点星。这应该有效:

[report]
# Regexes for lines to exclude from consideration
exclude_lines =
    pragma: no cover
    def __repr__
    if self.debug:
    raise AssertionError
    raise NotImplementedError
    except Exception as e:
Run Code Online (Sandbox Code Playgroud)

也就是说:这种编码风格让我非常关注。在你做的时候捕捉一揽子异常是糟糕的风格,可以隐藏问题。那么您似乎并不关心该代码是否经过测试!

如果您需要像这样对大量函数执行强异常处理,也许您想编写一个函数装饰器来包装函数调用。这将减少代码行数,并集中您的逻辑。然后您也可以在一个地方处理覆盖问题。