2017-03-14 45 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的使用。