dda*_*lla 5 unit-testing fixtures pytest
pytest允许创建自动应用于测试套件中每个测试的夹具(通过autouse关键字参数)。这对于实现影响每个测试用例的设置和拆卸操作很有用。更多细节可以在pytest 文档中找到。
理论上,相同的基础设施对于验证每次测试运行后预期存在的后置条件也非常有用。例如,可能每次测试运行时都会创建一个日志文件,我想确保在测试结束时它存在。
不要拘泥于细节,但我希望你了解基本概念。关键是将这些代码添加到每个测试函数中会很乏味和重复,尤其是当autouse夹具已经提供了将此操作应用于每个测试的基础架构时。此外,fixtures 可以打包成插件,所以我的检查可以被其他包使用。
问题是似乎不可能从夹具中导致测试失败。考虑以下示例:
@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")
Run Code Online (Sandbox Code Playgroud)
在日志文件不存在的情况下,我不会得到测试失败。相反,我收到了 pytest 错误。如果我的测试套件中有 10 个测试,并且它们都通过了,但是其中 5 个缺少日志文件,我将得到 10 个通过和 5 个错误。我的目标是获得 5 次传球和 5 次失败。
所以第一个问题是:这可能吗?我只是错过了什么吗?这个答案向我表明这可能是不可能的。如果是这样,那么第二个问题是:还有其他方法吗?如果这个问题的答案也是“不”:为什么不呢?这是pytest基础设施的根本限制吗?如果没有,那么是否有计划支持这种功能?
在 pytest 中,yield-ing 夹具的前半部分定义在设置期间执行,后半部分在拆卸期间执行。此外,设置和拆卸不被视为任何单独测试的一部分,因此不会导致其失败。这就是为什么您会看到异常报告为附加错误而不是测试失败。
从哲学角度来看,尽管您尝试的方法可能(巧妙)方便,但我认为它违反了测试设置和拆卸的精神,因此即使您可以这样做,也不应该这样做。设置和拆卸阶段的存在是为了支持测试\xe2\x80\x94 的执行,而不是补充其对系统行为的断言。如果该行为足够重要,需要断言,则该断言也足够重要,可以驻留在一个或多个专用测试的主体中。
\n\n如果您只是想尽量减少代码的重复,我建议将断言封装在辅助方法中,例如,assert_log_file_cleaned_up()可以从适当的测试主体中调用该方法。这将使测试机构保留其作为系统行为规范的描述能力。