【问题标题】:Tornado WebSocket connection is not closed inside a test suiteTornado WebSocket 连接未在测试套件内关闭
【发布时间】:2017-03-14 17:35:23
【问题描述】:

我正在尝试测试这个使用 Tornado 构建的 WebSocket 处理程序,我称之为main.py

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')

使用内置模块 tornado.testing 并根据一个简单的 AsyncHTTPTestCase 示例进行一些修改:

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 的最后一行没有到达,即服务器没有关闭。

有人知道发生了什么吗?我已经尝试在关闭后添加延迟但没有成功。

【问题讨论】:

    标签: python unit-testing websocket code-coverage tornado


    【解决方案1】:

    如果我在client.close() 之后添加await tornado.gen.sleep(1)(允许处理其他异步任务的异步睡眠),它会将覆盖率提高到 100%。

    【讨论】:

    • 谢谢,我使用的是同步睡眠功能,但它不起作用。你知道为什么吗?
    • 服务端是异步python在同一个进程,使用同一个事件循环。它在同步睡眠期间根本没有运行。
    【解决方案2】:

    套接字 已关闭,但您让测试完成而不等待回调运行。您是否需要对此做任何事情取决于您在关闭回调中所做的事情以及测试是否有必要。

    如果您的测试关心正在运行的回调,那么您需要睡一会给它一个机会(正如您所发现的那样),或者做一些事情来让测试观察回调正在运行的事实.不幸的是,这相当笨拙。查看close_futureTornado's websocket_test.py 文件中的使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-08
      • 2016-05-15
      • 2016-03-11
      • 2013-02-02
      • 1970-01-01
      • 2010-10-05
      • 2017-04-14
      • 2012-07-30
      相关资源
      最近更新 更多