How to use pytest-aiohttp fixtures with scope session

痞子三分冷 提交于 2021-01-02 06:07:10

问题


I am trying to write tests for aiohttp application. I am using pytest-aiohttp plugin. My intention is to initialize and run the application once before first test execution and tear down after all tests finished. pytest-aiohttp fixtures like 'loop', 'test_client' are very helpful but they have scope='function' which means I can not use them from my own fixture with scope='session'. Is there a way to workaround this? And if not then what would be a proper approach for achieving my goal without using built-in fixtures? My code is as follows (conftest.py)

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

My tests then use this

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

So my fixture 'client' runs for every test, which is what i want to avoid


回答1:


test_client fixture is a simple wrapper around TestServer and TestClient classes from aiohttp.test_utils.

You can craft your own version of the fixture with 'session' scope.

But this way has own problems: tests should be isolated, in practice it means event loop recreation for every test.

But session-level aiohttp application doesn't support such loop recreation. Thus the app should be run in separate thread which makes writing test assertions much harder.

In my practice aiohttp application starts instantly but things like DB schema migration and DB fixtures applying takes time. These activities could be implemented in session scope easy as separate fixtures but app starting/stopping should be performed inside every test.



来源:https://stackoverflow.com/questions/45736201/how-to-use-pytest-aiohttp-fixtures-with-scope-session

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!