gpt4 book ai didi

python - 如何在 pytest 中断言 UserWarning 和 SystemExit

转载 作者:太空宇宙 更新时间:2023-11-04 11:11:19 26 4
gpt4 key购买 nike

在 pytest 中断言 UserWarning 和 SystemExit

在我的应用程序中,我有一个函数,当提供错误的参数值时,将从 warnings 模块中引发一个 UserWarnings,然后从中引发 SystemExit sys 模块。

代码是这样的:

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 中测试此 UserWarningSystemExit。我可以在 pytest as 中检查 SystemExit

with pytest.raises(SystemExit):
compare_tags(....)

但这也会显示一条警告消息(这不是错误)。

如果我想检查警告:

pytest.warns(UserWarning, 
compare_tags(...)

这将产生一个SystemExit 错误,因为这个被调用的函数将触发系统退出。

如何将 warningsSystemExit 检查放在同一个 pytest 中?

最佳答案

pytest.warnspytest.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)

将按预期失败。

关于python - 如何在 pytest 中断言 UserWarning 和 SystemExit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58143032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com