pytest fixture中yield代码执行与资源释放可靠性的技术问询
pytest Fixture资源释放问题解答
一、使用yield的Fixture是否能保证异常时释放资源?
能。pytest的yield型fixture设计逻辑就是不管测试用例是否抛出异常,yield语句之后的清理代码都会被执行。比如你给出的代码:
@pytest.fixture def resource(): res = driver.Instance() yield res res.close()
不管使用这个fixture的测试是成功、失败还是抛出异常,res.close()都会被调用,资源能正常释放。这是pytest官方推荐的fixture清理方式,逻辑清晰直观。
二、addfinalizer模式是否更合适?
你给出的addfinalizer代码存在错误:q.addfinalizer(finalize())这里是直接执行了finalize()函数,而非将函数对象传递给addfinalizer,这会导致资源在fixture创建阶段就被关闭,完全起不到后续清理的作用。正确写法应该是传递函数本身:
@pytest.fixture def resource(request): res = driver.Instance() def finalize(): res.close() request.addfinalizer(finalize) # 注意此处不带括号 return res
不过即便修正了这个问题,addfinalizer也并非更合适的选择——它是pytest早期的清理方式,目前官方更推荐使用yield型fixture,因为代码结构更清晰,资源创建与清理逻辑集中在同一fixture内,可读性更强。只有在少数复杂场景(比如需要添加多个清理函数)下,addfinalizer才会被用到,绝大多数场景yield都能覆盖需求。
内容的提问来源于stack exchange,提问作者lutar
相关产品推荐
相关产品推荐

