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

时间:2017-03-14 17:35:23

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

我试图测试使用Tornado构建的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')

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时,它指出未到达jobs: - name: dotpersecond plan: - task: dotpersecond config: image_resource: type: docker-image source: repository: docker.mycomp.com:443/app-builder tag: latest username: {{dckr-user}} password: {{dckr-pass}} run: path: sh args: - "-c" - | for i in `seq 1000`; do echo hi; sleep 2; done 的最后一行,即服务器未关闭。

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

2 个答案:

答案 0 :(得分:1)

如果我在public void increaseDegress() { rotationAngle += 10; if(rotationAngle>360) { rotationAngle = 0; } } public void draw(Graphics g) { this.g = g; Graphics2D g2 = (Graphics2D) g; AffineTransform at = new AffineTransform(); Rectangle rect = this.getBounds(); at.rotate(Math.toRadians(rotationAngle), rect.getX() + rect.getWidth() / 2, rect.getY() + rect.getHeight() / 2); g2.setColor(Color.BLUE); g2.setTransform(at); g2.draw(at.createTransformedShape(this)); } 之后添加await tornado.gen.sleep(1)(允许处理其他异步任务的异步睡眠),则覆盖率最高可达100%。

答案 1 :(得分:1)

套接字关闭,但您可以在不等待回调运行的情况下完成测试。是否需要对此进行任何操作取决于您在近距离回调中所做的事情以及是否有必要进行测试。

如果您的测试关心正在运行的回调,那么您需要稍微睡一会给它一个机会(如您所发现的),或者做一些事情以允许测试观察回调运行的事实。不幸的是,这很笨拙;请参阅Tornado's websocket_test.py文件中close_future的使用情况。