2017-08-17 4 views
4

aiohttpアプリケーションのテストを作成しようとしています。私はpytest-aiohttpプラグインを使用しています。私の意図は、最初のテストの実行前に一度アプリケーションを初期化して実行し、すべてのテストが終了した後に解体することです。 'loop'、 'test_client'のようなpytest-aiohttpのフィクスチャは非常に役に立ちますが、スコープ= 'function'を持っています。つまり、スコープ= 'session'を持つ自分のフィクスチャからは使用できません。これを回避する方法はありますか?そうでなければ、ビルトインの備品を使わずに目標を達成するための適切なアプローチは何でしょうか?次のように 私のコードは私のテストは、このスコープセッションでpytest-aiohttpフィクスチャを使用する方法

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

だから私の治具のクライアントは、「私は

を避けたいものですすべてのテストのために実行を使用します(conftest.py)

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

です

答えて

3

test_clientフィクスチャは、TestServerおよびTestClientクラスの簡単なラッパーです。aiohttp.test_utilsです。

'session'スコープの独自のバージョンの照明器具を作ることができます。

しかし、この方法には独自の問題があります。テストは分離する必要があります。実際には、テストごとにイベントループレクリエーションが必要です。

しかし、セッションレベルのaiohttpアプリケーションは、このようなループレクレーションをサポートしていません。したがって、アプリは別のスレッドで実行する必要があり、テストアサーションを書くのがずっと難しくなります。

私の練習では、iohttpアプリケーションは即座に起動しますが、DBスキーマの移行やDBフィクスチャの適用などの作業には時間がかかります。これらのアクティビティはセッションスコープで個別のフィクスチャとして簡単に実装できますが、アプリの起動/停止はすべてのテストで実行する必要があります。

関連する問題