Tornado WebSocket 连接未在测试套件内关闭

Tornado WebSocket connection is not closed inside a test suite

我正在尝试测试这个用 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 的最后一行没有到达,即服务器没有关闭。

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

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

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

如果你的测试关心回调是 运行,那么你需要睡一会儿给它一个机会(正如你发现的那样),或者做一些事情让测试观察事实上,回调是 运行。不幸的是,这很笨拙;查看 Tornado's websocket_test.py 文件中 close_future 的用法。