2017-08-17 75 views
4

我正在嘗試爲aiohttp應用程序編寫測試。我正在使用pytest-aiohttp插件。我的意圖是在第一次測試執行之前初始化和運行應用程序,並在所有測試完成後拆除。像'loop','test_client'這樣的pytest-aiohttp裝置是非常有用的,但它們有scope ='function',這意味着我不能在範圍='session'的自己的fixture中使用它們。有沒有辦法解決這個問題?如果不是的話,那麼在沒有使用嵌入式燈具的情況下,實現我的目標的方法是什麼? 我的代碼如下(conftest.py)然後如何在示波器會話中使用pytest-aiohttp夾具

@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 

所以我的固定「客戶」爲每一個測試,這正是我想避免

運行

回答

3

test_client夾具是來自aiohttp.test_utilsTestServerTestClient類的簡單包裝。

您可以用'session'範圍製作您自己的夾具版本。

但是這種方式有自己的問題:測試應該是孤立的,實際上它意味着每個測試的事件循環重新創建。

但會話級aiohttp應用程序不支持此類循環重新創建。因此,應用程序應該在單獨的線程中運行,這使得編寫測試斷言變得更加困難。

在我的實踐中,aiohttp應用程序立即啓動,但諸如數據庫模式遷移和DB裝置應用等事情需要時間。這些活動可以在會話範圍內作爲單獨的固定裝置輕鬆實現,但應在每次測試中執行應用程序啓動/停止。