如何在范围会话中使用 pytest-aiohttp 装置
How to use pytest-aiohttp fixtures with scope session
我正在尝试为 aiohttp 应用程序编写测试。我正在使用 pytest-aiohttp 插件。我的意图是在第一次测试执行之前初始化和 运行 应用程序一次,并在所有测试完成后拆除。像 'loop'、'test_client' 这样的 pytest-aiohttp fixtures 非常有用,但是它们有 scope='function' 这意味着我不能在我自己的 fixture 中使用它们,scope='session'。有没有办法解决这个问题?如果不是,那么在不使用内置固定装置的情况下实现我的目标的正确方法是什么?
我的代码如下(conftest.py)
@pytest.fixture()
def client(test_client, loop):
app = init(loop)
return loop.run_until_complete(test_client(app))
然后我的测试使用这个
class TestGetAlerts:
async def test_get_login_url(self, client):
resp = await client.get('/api/get_login_url')
assert resp.status == 200
所以我的 fixture 'client' 运行s 用于每次测试,这是我想避免的
test_client
fixture 是 TestServer
和 TestClient
类 的简单包装器,来自 aiohttp.test_utils
.
您可以使用 'session'
范围制作您自己的灯具版本。
但这种方式有其自身的问题:测试应该被隔离,实际上这意味着为每个测试重新创建事件循环。
但是会话级别的 aiohttp 应用程序不支持这种循环重建。因此,应用程序应该 运行 在单独的线程中,这使得编写测试断言变得更加困难。
在我的实践中,aiohttp 应用程序会立即启动,但数据库模式迁移和数据库固定装置应用等事情需要时间。这些活动可以作为单独的装置在会话范围内轻松实现,但应用程序 starting/stopping 应该在每个测试中执行。
我正在尝试为 aiohttp 应用程序编写测试。我正在使用 pytest-aiohttp 插件。我的意图是在第一次测试执行之前初始化和 运行 应用程序一次,并在所有测试完成后拆除。像 'loop'、'test_client' 这样的 pytest-aiohttp fixtures 非常有用,但是它们有 scope='function' 这意味着我不能在我自己的 fixture 中使用它们,scope='session'。有没有办法解决这个问题?如果不是,那么在不使用内置固定装置的情况下实现我的目标的正确方法是什么? 我的代码如下(conftest.py)
@pytest.fixture()
def client(test_client, loop):
app = init(loop)
return loop.run_until_complete(test_client(app))
然后我的测试使用这个
class TestGetAlerts:
async def test_get_login_url(self, client):
resp = await client.get('/api/get_login_url')
assert resp.status == 200
所以我的 fixture 'client' 运行s 用于每次测试,这是我想避免的
test_client
fixture 是 TestServer
和 TestClient
类 的简单包装器,来自 aiohttp.test_utils
.
您可以使用 'session'
范围制作您自己的灯具版本。
但这种方式有其自身的问题:测试应该被隔离,实际上这意味着为每个测试重新创建事件循环。
但是会话级别的 aiohttp 应用程序不支持这种循环重建。因此,应用程序应该 运行 在单独的线程中,这使得编写测试断言变得更加困难。
在我的实践中,aiohttp 应用程序会立即启动,但数据库模式迁移和数据库固定装置应用等事情需要时间。这些活动可以作为单独的装置在会话范围内轻松实现,但应用程序 starting/stopping 应该在每个测试中执行。