Pytest正在检查错误返回的消息



pytest、str((和python错误类型之间的交互破坏了我们想要确认错误返回的精确文本的完整错误测试。

以下示例:

def erroring_func(name, required_item_list):
# skip boring bit. Just throw an error.
raise KeyError(f'{name} is missing required item(s): {required_item_list')
def test_erroring_func():
with pytest.raises(KeyError) as err:
name = 'This dataframe'
required_item_list = ['a column']
_ = erroring_func(name, required_item_list)
assert str(err.value) == f"{name} is missing required item(s): {required_item_list}"

这看起来很合理,但会返回错误:

assert '"This dataframe is missing required item(s): ['lat']"' == "This dataframe is missing required item(s): ['lat']

不知何故,str(err.value)在输出中创建了单个反斜杠,这些反斜杠极难在f字符串中重新创建(实际上是不可能的(或在创建后插入字符串。

您可以通过匹配KeyError如何更改文本来完全解决问题。这可以用带有单引号的f字符串和双引号的f'"your text {here}"'来完成

assert str(err.value) == f'"{name} is missing required item(s): {required_item_list}"'

(感谢Anthony Sotile(

一个不完整的补丁(缺少详细错误的主要值(是为了测试返回的错误中是否存在固定的子字符串。

def test_erroring_func()
with pytest.raises(KeyError) as err:
name = 'This dataframe'
required_item_list = ['a column']
_ = erroring_func(name, required_item_list)
assert "is missing required item(s):" in str(err.value)

PS。更新到更现代的pytest语法,regex匹配可以定义为pytest.raises中的arg

def test_erroring_func():
with pytest.raises(KeyError, match="is missing required item(s):") as err:
name = 'This dataframe'
required_item_list = ['a column']
_ = erroring_func(name, required_item_list)

最新更新