2017-03-14 44 views
0

我試圖測試與龍捲風建立了這個網頁套接字句柄這我使用的是內置模塊tornado.testing一些調整,從一個簡單的AsyncHTTPTestCase調用main.py龍捲風WebSocket連接是不是一個測試套件

import tornado.websocket 

class SocketHandler(tornado.websocket.WebSocketHandler): 

    def open(self): 
     print(' [T] Websocket connection open') 

    def on_message(self, message): 
     print(' [T] Websocket message received: %s' % message) 

    def on_close(self): 
     print(' [T] Websocket connection closed') 

內關閉例如:

import tornado.testing 
import tornado.web 
import tornado.websocket 

from main import SocketHandler 

class TestWebSockets(tornado.testing.AsyncHTTPTestCase): 

    def get_app(self): 
     return tornado.web.Application([(r'/', SocketHandler)]) 

    @tornado.testing.gen_test 
    async def test_async_client(self): 

     url = "ws://localhost:" + str(self.get_http_port()) + "/" 
     client = await tornado.websocket.websocket_connect(url) 
     client.write_message('message') 
     client.close() 

該測試通過。但是,當我運行pytest --cov-report term-missing --cov=.時,它指出沒有達到main.py的最後一行,即服務器未關閉。

任何人都知道發生了什麼?我已經嘗試過在關閉後添加延遲,但沒有成功。

回答

1

如果我在client.close()之後添加await tornado.gen.sleep(1)(允許處理其他異步任務的異步睡眠),它將覆蓋率提高到100%。

+0

0.1秒也適用於我 – Pierce

+0

謝謝,我正在使用同步睡眠功能,這是行不通的。你知道爲什麼嗎? – gsmafra

+1

服務器端是異步python在同一個進程中,使用相同的事件循環。它在同步睡眠期間根本沒有運行。 – Pierce

1

套接字已關閉,但您正在讓測試完成而無需等待回調運行。無論你需要做什麼都取決於你在關閉回調中做什麼以及測試是否有必要。

如果你的測試關心正在運行的回調,那麼你需要睡一會兒給它一個機會(如你發現的那樣),或者做一些事情讓測試觀察回調是跑。這不幸的是很笨拙;請參閱Tornado's websocket_test.py文件中close_future的使用。