如何在 pytest 中断言 UserWarning 和 SystemExit
How to assert both UserWarning and SystemExit in pytest
在 pytest 中断言 UserWarning 和 SystemExit
在我的应用程序中,我有一个函数,当提供错误的参数值时,将从 warnings
模块引发 UserWarnings
,然后从 sys
模块引发 SystemExit
。
代码是这样的:
def compare_tags(.....):
requested_tags = user_requested_tags # as list
all_tags = tags_calculated_from_input_file # as list
non_matching_key = [x for x in requested_tags if x not in all_tags]
# if user requested non existing tag then raise warning and then exit
if len(non_matching_key) > 0:
# generate warning
warnings.warn("The requested '%s' keys from '%s' is not present in the input file. Please makes sure the input file has the metadata of interest or remove the non matching keys." %(non_matching_key, given_tags))
# raise system exit
sys.exit(0)
为上述函数编写一个 pytest
我想立即在 pytest 中测试这个 UserWarning
和 SystemExit
。我可以在 pytest 中检查 SystemExit
as.
with pytest.raises(SystemExit):
compare_tags(....)
但这也会显示一条警告消息(这不是错误)。
如果我想检查警告:
pytest.warns(UserWarning,
compare_tags(...)
这将产生一个 SystemExit
错误,因为这个被调用的函数将触发系统退出。
如何将 warnings
和 SystemExit
检查在同一个 pytest 中?
您可以像这样嵌套两个异常:
def test_exit():
with pytest.raises(SystemExit):
error_msg = "warning here"
with pytest.warns(UserWarning, match = error_msg):
compare_tags(...)
pytest.warns
和 pytest.raises
是常用的上下文管理器,可以在用逗号分隔时在单个 with
语句中声明(请参阅 compound statements):
with pytest.warns(UserWarning), pytest.raises(SystemExit):
compare_tags(...)
实际上与写作
相同
with pytest.warns(UserWarning):
with pytest.raises(SystemExit):
compare_tags(...)
请注意顺序很重要 - 当您以相反的顺序放置两个上下文管理器时:
with pytest.raises(SystemExit), pytest.warns(UserWarning):
...
这和写法一样
with pytest.raises(SystemExit):
with pytest.warns(UserWarning):
...
这里的问题是 pytest.raises
将捕获所有引发的错误,然后检查捕获的内容。这包括 pytest.warns
提出的内容。这意味着
with pytest.raises(SystemExit), pytest.warns(UserWarning):
sys.exit(0)
会通过,因为 pytest.warns
中出现的错误将在 pytest.raises
中被吞没,而
with pytest.warns(UserWarning), pytest.raises(SystemExit):
sys.exit(0)
将按预期失败。
在 pytest 中断言 UserWarning 和 SystemExit
在我的应用程序中,我有一个函数,当提供错误的参数值时,将从 warnings
模块引发 UserWarnings
,然后从 sys
模块引发 SystemExit
。
代码是这样的:
def compare_tags(.....):
requested_tags = user_requested_tags # as list
all_tags = tags_calculated_from_input_file # as list
non_matching_key = [x for x in requested_tags if x not in all_tags]
# if user requested non existing tag then raise warning and then exit
if len(non_matching_key) > 0:
# generate warning
warnings.warn("The requested '%s' keys from '%s' is not present in the input file. Please makes sure the input file has the metadata of interest or remove the non matching keys." %(non_matching_key, given_tags))
# raise system exit
sys.exit(0)
为上述函数编写一个 pytest
我想立即在 pytest 中测试这个 UserWarning
和 SystemExit
。我可以在 pytest 中检查 SystemExit
as.
with pytest.raises(SystemExit):
compare_tags(....)
但这也会显示一条警告消息(这不是错误)。
如果我想检查警告:
pytest.warns(UserWarning,
compare_tags(...)
这将产生一个 SystemExit
错误,因为这个被调用的函数将触发系统退出。
如何将 warnings
和 SystemExit
检查在同一个 pytest 中?
您可以像这样嵌套两个异常:
def test_exit():
with pytest.raises(SystemExit):
error_msg = "warning here"
with pytest.warns(UserWarning, match = error_msg):
compare_tags(...)
pytest.warns
和 pytest.raises
是常用的上下文管理器,可以在用逗号分隔时在单个 with
语句中声明(请参阅 compound statements):
with pytest.warns(UserWarning), pytest.raises(SystemExit):
compare_tags(...)
实际上与写作
相同with pytest.warns(UserWarning):
with pytest.raises(SystemExit):
compare_tags(...)
请注意顺序很重要 - 当您以相反的顺序放置两个上下文管理器时:
with pytest.raises(SystemExit), pytest.warns(UserWarning):
...
这和写法一样
with pytest.raises(SystemExit):
with pytest.warns(UserWarning):
...
这里的问题是 pytest.raises
将捕获所有引发的错误,然后检查捕获的内容。这包括 pytest.warns
提出的内容。这意味着
with pytest.raises(SystemExit), pytest.warns(UserWarning):
sys.exit(0)
会通过,因为 pytest.warns
中出现的错误将在 pytest.raises
中被吞没,而
with pytest.warns(UserWarning), pytest.raises(SystemExit):
sys.exit(0)
将按预期失败。