关于python:如何在作用域会话中使用pytest-aiohttp固定装置

How to use pytest-aiohttp fixtures with scope session

我正在尝试为aiohttp应用程序编写测试。 我正在使用pytest-aiohttp插件。 我的意图是在第一次测试执行之前初始化和运行应用程序一次,并在所有测试完成后拆除。 pytest-aiohttp固定装置(例如'loop','test_client')非常有用,但是它们具有scope ='function',这意味着我无法在自己的固定装置中使用scope ='session'来使用它们。 有办法解决此问题吗? 如果不是,那么在不使用内置固定装置的情况下实现我的目标的正确方法是什么?
我的代码如下(conftest.py)

1
2
3
4
@pytest.fixture()
def client(test_client, loop):
    app = init(loop)
    return loop.run_until_complete(test_client(app))

我的测试然后使用这个

1
2
3
4
class TestGetAlerts:
async def test_get_login_url(self, client):
    resp = await client.get('/api/get_login_url')
    assert resp.status == 200

所以我的夹具"客户端"会在每次测试时运行,这是我要避免的事情


test_client固定装置是围绕aiohttp.test_utils中的TestServerTestClient类的简单包装。

您可以使用'session'范围制作自己的灯具版本。

但是这种方式有其自身的问题:应该隔离测试,实际上,这意味着每个测试都需要重新创建事件循环。

但是会话级的aiohttp应用程序不支持这种循环娱乐。 因此,应用程序应在单独的线程中运行,这会使编写测试断言更加困难。

在我的实践中,aiohttp应用程序会立即启动,但是数据库模式迁移和数据库夹具的应用需要时间。 这些活动可以在会话范围内轻松实现,就像单独的固定装置一样,但应在每个测试中执行应用程序启动/停止。