有没有办法在pytest(python)中覆盖默认断言?

时间:2016-03-22 17:01:57

标签: python pytest

每次调用assert时,我都希望将一些信息记录到文件/数据库中。有没有办法在每次调用assert时覆盖断言或注册某种回调函数来执行此操作?

此致 沙拉德帕

4 个答案:

答案 0 :(得分:1)

我认为这是不可能的。 assert是Python中的语句(而不是函数),具有预定义的行为。它是一种语言元素,不能只是被修改。更改语言不能解决问题。问题必须使用语言提供的内容来解决

但是你可以做一件事。断言会在失败时引发AssertionError异常。这可以被利用来完成工作。将assert statement放在Try-expect块中,然后在该块内进行回调。它并不像您正在寻找的那样好。每个断言都必须这样做。修改声明的行为是我们不会做的事情。

答案 1 :(得分:1)

尝试重载AssertionError而不是assert。原始断言错误在python2中的exceptions module和python3中的builtins模块中可用。

import exceptions

class AssertionError:
    def __init__(self, *args, **kwargs):
        print("Log me!")
        raise exceptions.AssertionError

答案 2 :(得分:1)

有可能,因为pytest实际上在某些情况下重写了断言表达式。我不知道该怎么做或它有多容易,但这里是文档解释何时在pytest中发生断言重写: https://docs.pytest.org/en/latest/assert.html

  

默认情况下,如果Python版本大于或等于2.6,py.test将重写测试模块中的断言语句。

     

...

     

py.test在导入时重写测试模块。它通过使用一个   import hook写一个新的pyc文件。

理论上,您可以查看pytest代码以了解它们是如何做到的,也许可以做类似的事情。

  

有关进一步的信息,本杰明彼得森写了py.test的新断言重写幕后[http://pybites.blogspot.com/2011/07/behind-scenes-of-pytests-new-assertion.html]

答案 3 :(得分:0)

我建议使用pyhamcrest。它有非常美丽的匹配器,可以简单地重新实现。你也可以写自己的。