允许对pytest.raises使用异常实例的插件
pytest-raisin的Python项目详细描述
pytest葡萄干
将更高级别接口放入pytest.raises的插件。 它允许使用异常instance作为预期值,该值将根据类型和argsattribute与实际异常(如果有)进行比较。
# Old-skool: with pytest.raises(SystemExit) as cm: sys.exit(1) assert cm.value.args ==(1,)# New hotness: with pytest.raises(SystemExit(1)): sys.exit(1)
如果需要,可以为用户定义的错误子类注册更复杂的比较(请参见Advanced Usage)。
安装
pip install pytest-raisin
基本用法
测试中的用法如下所示
>>>currant_exchange_rates={..."sultana":50,..."raisins":100,...}>>>withpytest.raises(KeyError("grape")):...currant_exchange_rates["grape"]...>>>withpytest.raises(KeyError("sultanas")):...currant_exchange_rates["prunes"]...AssertionError:KeyErrorargsdonotmatch!Actual:('prunes',)Expected:('sultanas',)>>>withpytest.raises(KeyError("Carlos Sultana")):...currant_exchange_rates["sultana"]Failed:DIDNOTRAISEKeyError('Carlos Sultana')
默认情况下,插件是启用的:pytest.raises直接用新功能进行monkeypached。要在没有新内容的情况下临时执行,请使用pytest -pno:pytest-raisin。
pytest.raises的各种遗留形式将继续工作,返回到原始实现。
高级使用
在大多数用例中,如果args属性具有匹配的元组,则将异常视为等效异常的默认行为应该是令人满意的。 但是,一些第三方异常类内部有额外的逻辑(例如django的ValidationError),您可能希望在这里提供更自定义的断言。
插件用户可以通过pytest raisin的decorator工厂注册自己的错误/可调用文件:
@pytest.register_exception_compare(MyError)defmy_error_compare(exc_actual,exc_expected):...
将使用参数exc_actual和exc_expected调用比较函数,这两个参数都是MyError的直接实例(如果类型不完全匹配,则测试将在前面失败)。此函数应检查实例,并在认为它们不匹配时引发带有有用上下文消息的AssertionError。如果异常被认为是等价的,则它不应该执行任何操作(即返回None)。
注意:当使用异常实例作为pytest.raises的参数时,不允许使用子类的实例。如果要允许子类化,请使用传递类型的原始语法。