pytest
允许创建自动应用于测试套件中每个测试的灯具(通过autouse
关键字参数)。这对于实现影响每个测试用例的设置和拆除操作非常有用。更多细节可以在the pytest documentation找到。
从理论上讲,相同的基础设施对于验证每次测试运行后预期存在的后置条件也非常有用。例如,每次测试运行时都可能会创建一个日志文件,我希望在测试结束时确保它存在。
不要挂在细节上,但我希望你能得到基本的想法。关键是将此代码添加到每个测试函数会很繁琐和重复,尤其是当autouse
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夹具在设置期间执行其定义的前半部分,并且在拆卸期间执行后半部分。此外,设置和拆卸不被视为任何单独测试的一部分,因此不会导致其失败。这就是为什么您将异常报告为额外错误而不是测试失败的原因。
在一个哲学的注释中,就像你尝试过的方法一样(巧妙)方便,我认为它违反了测试设置和拆解的精神,因此即使你能做到,你也不应该这样做。存在设置和拆除阶段以支持测试的执行 - 不补充其系统行为的断言。如果行为足以断言,则断言非常重要,可以驻留在一个或多个专用测试的主体中。
如果您只是想尽量减少代码的重复,我建议将断言封装在一个辅助方法中,例如assert_log_file_cleaned_up()
,它可以从相应测试的主体中调用。这将允许测试机构保留其描述能力作为系统行为的规范。
AFAIK无法告诉pytest
将特定夹具中的错误视为测试失败。
我也有一个案例,我想使用夹具来最小化测试代码重复,但在你的情况下,pytest-dependency可能是一种方法。
此外,测试依赖性对于非单元测试并不坏,并且要小心autouse
,因为它使测试更难以阅读和调试。测试函数头中的显式夹具至少为您提供了一些查找已执行代码的方向。