【问题标题】:How to use pytest-aiohttp fixtures with scope session如何在范围会话中使用 pytest-aiohttp 固定装置
【发布时间】:2018-01-25 22:23:53
【问题描述】:

我正在尝试为 aiohttp 应用程序编写测试。我正在使用 pytest-aiohttp 插件。我的目的是在第一次测试执行之前初始化并运行一次应用程序,并在所有测试完成后拆除。像'loop'、'test_client'这样的pytest-aiohttp 夹具非常有用,但它们有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

所以我的夹具“客户端”为每个测试运行,这是我想要避免的

【问题讨论】:

    标签: python pytest fixtures aiohttp


    【解决方案1】:

    test_client 固定装置是对来自aiohttp.test_utilsTestServerTestClient 类的简单包装。

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

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

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

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

    【讨论】:

    • 如果我有一个会话范围的夹具,它只执行独立于循环的副作用,为什么我不能在使用函数范围的循环夹具的测试中依赖它?
    • 您能否提供一个使用session 范围执行此操作的示例。现在这对我不起作用。由于我的应用程序有一个附加 tensorflow 的子进程,然后将其锁定到 GPU 中。现在必须为每次测试重新创建应用程序意味着每次都必须重新初始化 GPU。这会显着减慢测试速度。
    • 原来我只需要这样做:``` @pytest.fixture(scope='session') def loop(): return asyncio.get_event_loop() ```
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    相关资源
    最近更新 更多