如何将 pytest-aiohttp 装置与范围会话一起使用

2024-02-28

我正在尝试为 aiohttp 应用程序编写测试。我正在使用 pytest-aiohttp 插件。我的目的是在第一次测试执行之前初始化并运行应用程序一次,并在所有测试完成后拆除。 pytest-aiohttp 固定装置(例如“loop”、“test_client”)非常有用,但它们具有scope=“function”,这意味着我无法从自己的固定装置中使用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

所以我的固定装置“客户端”针对每个测试运行,这是我想避免的


test_clientFixture 是一个简单的包装TestServer and TestClient课程来自aiohttp.test_utils https://github.com/aio-libs/aiohttp/blob/master/aiohttp/test_utils.py.

您可以使用以下方法制作您自己的夹具版本'session' scope.

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

但会话级 aiohttp 应用程序不支持这种循环重新创建。因此,应用程序应该在单独的线程中运行,这使得编写测试断言变得更加困难。

在我的实践中,aiohttp 应用程序会立即启动,但诸如数据库架构迁移和数据库固定装置应用之类的事情需要时间。这些活动可以在会话范围内作为单独的固定装置轻松实现,但应用程序启动/停止应在每个测试内执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 pytest-aiohttp 装置与范围会话一起使用 的相关文章

随机推荐