5

背景

我有几个使用coverage.py 的Django 项目,并且一直在尝试向我的.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__.:

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

(.*)except Exception as e:
except Exception as e:
except Exception as e:(.*)

下面是我希望忽略的代码部分的函数示例:

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

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

4

2 回答 2

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:

那说:这种编码风格让我很担心。在你做的时候捕捉毯子异常是不好的风格,并且可以隐藏问题。那么您似乎并不关心该代码是否经过测试!

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

于 2014-11-21T18:01:50.067 回答
3

我一直在做的就是使用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)
于 2014-11-21T16:09:01.137 回答