lut*_*tar 4 python yield pytest
假设我们有一个固定装置,它分配了一些非托管资源并释放它们,如下例所示:
@pytest.fixture
def resource():
res = driver.Instance()
yield res
res.close()
Run Code Online (Sandbox Code Playgroud)
即使在使用该夹具的测试过程中发生问题,是否可以保证资源会被释放?
如果没有这样的保证,也许下面的模式会更好?
@pytest.fixture
def resource(q):
res = driver.Instance()
def finalize():
res.close()
q.addfinalizer(finalize())
return res
Run Code Online (Sandbox Code Playgroud)
\n\n如果屈服装置在屈服之前引发异常,则 pytest 将不会尝试在屈服装置\xe2\x80\x99s 的屈服语句之后运行拆卸代码。但是,对于已经成功运行该测试的每个固定装置,pytest 仍会像平常一样尝试将其拆除。
\n
你说,“即使在使用该夹具的测试过程中发生了一些不好的事情”,这意味着已经yield执行了。只要夹具产生,pytest就会尝试执行拆卸。
\n\n虽然产量固定装置被认为是更干净、更直接的选项,但还有另一种选择,那就是将 \xe2\x80\x9cfinalizer\xe2\x80\x9d 函数直接添加到 test\xe2\x80\x99s 请求上下文目的。它带来了与产量固定装置类似的结果,但需要更多的冗长。
\n
关于安全装置的部分提供了一些关于如何安全地处理拆卸代码的好技巧,这一行很好地总结了这一点:
\n\n\n最安全、最简单的装置结构要求限制装置仅进行一个状态改变动作,然后将它们与拆卸代码捆绑在一起
\n