gpt4 book ai didi

unit-testing - pytest autouse fixture 导致测试失败

转载 作者:行者123 更新时间:2023-12-02 01:04:16 25 4
gpt4 key购买 nike

pytest允许创建自动应用于测试套件中每个测试的 fixture (通过 autouse 关键字参数)。这对于实现影响每个测试用例的设置和拆卸操作很有用。更多详情请见 the pytest documentation .

理论上,相同的基础设施对于验证每次测试运行后预期存在的后置条件也非常有用。例如,可能每次测试运行时都会创建一个日志文件,我想确保在测试结束时它存在。

不要拘泥于细节,但我希望您了解基本概念。关键是将这段代码添加到每个测试函数中会很乏味和重复,尤其是当 autouse 时。 fixture 已经提供了将此操作应用于每个测试的基础设施。此外,fixtures 可以打包成插件,所以我的检查可以被其他包使用。

问题是它似乎不可能导致 fixture 的测试失败。考虑以下示例:

@pytest.fixture(autouse=True)
def check_log_file():
# Yielding here runs the test itself
yield

# Now check whether the log file exists (as expected)
if not log_file_exists():
pytest.fail("Log file could not be found")

在日志文件不存在的情况下,我不会得到测试失败。相反,我收到了 pytest 错误。如果我的测试套件中有 10 个测试,并且它们都通过了,但其中 5 个缺少日志文件,我将得到 10 个通过和 5 个错误。我的目标是获得 5 次传球和 5 次失败。

所以第一个问题是:这可能吗?我只是错过了什么吗? This answer向我暗示这可能是不可能的。如果是这样,那么第二个问题是:还有其他方法吗?如果这个问题的答案也是“不”:为什么不呢?这是 pytest的基本限制吗?基础设施?如果没有,那么是否有计划支持这种功能?

最佳答案

在 pytest 中,一个 yield -ing fixture 在设置期间执行其定义的前半部分,在拆卸期间执行后半部分。此外,设置和拆卸不被视为任何单独测试的一部分,因此不会导致其失败。这就是为什么您将异常报告为附加错误而不是测试失败的原因。

在哲学上,尽管您尝试的方法可能(巧妙)方便,但我认为它违反了测试设置和拆卸的精神,因此即使您可以做到,也不应该这样做。设置和拆除阶段的存在是为了支持测试的执行——而不是补充它对系统行为的断言。如果行为重要到足以断言,那么断言就足够重要以驻留在一个或多个专用测试的主体中。

如果您只是想尽量减少代码重复,我建议将断言封装在辅助方法中,例如 assert_log_file_cleaned_up() ,可以从适当的测试主体中调用。这将允许测试机构保留其作为系统行为规范的描述能力。

关于unit-testing - pytest autouse fixture 导致测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48646305/

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