2017-08-17 4 views
4

Ich versuche, Tests für aiohttp Anwendung schreiben. Ich benutze pytest-aiohttp plugin. Ich beabsichtige, die Anwendung vor der ersten Testdurchführung zu initialisieren und auszuführen und nach Abschluss aller Tests abzubrechen. pytest-aiohttp Fixtures wie 'loop', 'test_client' sind sehr hilfreich, aber sie haben scope = 'function', was bedeutet, dass ich sie nicht von meinem eigenen Fixture mit scope = 'session' verwenden kann. Gibt es eine Möglichkeit, dies zu umgehen? Und wenn nicht, was wäre ein richtiger Ansatz, um mein Ziel zu erreichen, ohne eingebaute Vorrichtungen zu verwenden? Mein Code ist wie folgt (conftest.py)Wie pytest-aiohttp Fixtures mit Scope-Sitzung verwenden

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

Meine Tests dann diese

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

meine Leuchte 'Kunden' für jeden Test läuft also, das, was ich will, ist zu vermeiden

Antwort

3

test_client Halterung ist eine einfache Verpackung um TestServer und TestClient Klassen von aiohttp.test_utils.

Sie können Ihre eigene Version des Scheinwerfers mit 'session' Umfang herstellen.

Aber dieser Weg hat seine eigenen Probleme: Tests sollten isoliert werden, in der Praxis bedeutet es Ereignisschleife Erholung für jeden Test.

Aber aiohttp-Anwendung auf Sitzungsebene unterstützt keine solche Schleifenwiederherstellung. Daher sollte die App in einem separaten Thread ausgeführt werden, was das Schreiben von Test-Assertionen wesentlich erschwert.

In meiner Praxis startet aiohttp Anwendung sofort, aber Dinge wie DB Schema Migration und DB Fixtures braucht Zeit. Diese Aktivitäten können im Session-Umfang einfach als separate Fixtures implementiert werden, aber das Starten/Stoppen der App sollte in jedem Test durchgeführt werden.