回答重点
pytest 的 yield 主要用于生成一个可迭代的 fixture,该 fixture 可以在测试函数中被多次调用。yield 关键字允许在 fixture 函数中执行一些前置操作,然后返回一个值给测试使用,最后执行一些清理操作。这对于需要复杂的设置和拆卸代码情况下非常有用。
扩展知识
1) fixture 基础 :pytest 的 fixture 是一种特殊的函数,这些函数用于为测试提供所需的资源。通常,fixture 通过 @pytest.fixture
装饰器来定义,并且可以被其他测试函数传入使用。
2) yield 详解:通常,fixture 的设置和清理操作会使用 setup 和 teardown 来管理,具体可以通过 yield 来达到这个目的:
-
@pytest.fixture
使用 yield 的方式如下:import pytest
@pytest.fixture
def sample_fixture():
# 前置操作
resource = create_resource()
yield resource # 返回给测试用例使用
# 清理操作
resource.cleanup() -
在上面的例子中,
create_resource
代表某个需要在测试用例中使用的资源,而resource.cleanup()
则是一段清理代码。这种使用 yield 的方法能够使代码结构更清晰,前置和清理操作更加直观。
3) setup 和 teardown 方式的对比:在不使用 yield 的情况下,你可以通过 setup 和 teardown 方式手动管理资源的初始化和销毁: ```python import pytest
@pytest.fixture
def sample_fixture():
resource = create_resource()
yield resource
resource.cleanup()
```
这种对比通过 yield 型 fixture 更为优雅,减少了代码冗余,简化了逻辑。
4) 扩展应用场景:不止于单一资源的管理,yield 还可以应用于更复杂的场景。一些常见应用包括:
- 数据库连接管理:前置操作创建数据库连接,后置操作关闭连接。
- 临时文件管理:前置操作创建临时文件,后置操作删除临时文件。
- 会话管理:前置操作开启会话,后置操作关闭会话。
5) 现代替代方案:虽然 yield fixture 强大且直观,但随着 Python 语言的发展,async/await 机制的发展在异步编程场景中也提供了新的解决resource的流程,pytest 通过 async fixture 可以更好地处理异步任务。
import pytest
import asyncio
@pytest.fixture
async def async_fixture():
resource = await create_async_resource()
yield resource
await resource.cleanup()