【问题标题】:How do you use tornado.testing for creating WebSocket unit tests?你如何使用 tornado.testing 来创建 WebSocket 单元测试?
【发布时间】:2012-03-09 07:33:36
【问题描述】:

我正在开发一个使用 tornado 的 websocket 功能的项目。我看到了大量关于使用异步代码的文档,但没有关于如何使用它来创建与其 WebSocket 实现一起工作的单元测试。

tornado.testing 是否提供执行此操作的功能?如果是这样,有人可以提供一个简短的例子来说明如何实现吗?

提前致谢。

【问题讨论】:

  • 是的,我看到了那个页面。我可能是错的,但我相信他们记录的异步测试用例用于常规 HTTP 请求,而不是 WebSockets。
  • 听起来您想使用客户端实际访问测试服务器,在这种情况下,我认为答案是否定的,它没有。 tornado.testing 不包括 websocket 客户端。你可以试试 Selenium 之类的东西。

标签: python unit-testing asynchronous websocket tornado


【解决方案1】:

正如@Vladimir 所说,您仍然可以使用AsyncHTTPTestCase 来创建/管理测试网络服务器实例,但是您可以仍然以与正常 HTTP 请求相同的方式测试 WebSocket - 有只是没有语法糖可以帮助你。

Tornado 也有它自己的 WebSocket 客户端,所以没有必要(据我所知)使用第三方客户端——尽管它可能是最近添加的。所以试试类似的东西:

import tornado

class TestWebSockets(tornado.testing.AsyncHTTPTestCase):
    def get_app(self):
        # Required override for AsyncHTTPTestCase, sets up a dummy
        # webserver for this test.
        app = tornado.web.Application([
            (r'/path/to/websocket', MyWebSocketHandler)
        ])
        return app

    @tornado.testing.gen_test
    def test_websocket(self):
        # self.get_http_port() gives us the port of the running test server.
        ws_url = "ws://localhost:" + str(self.get_http_port()) + "/path/to/websocket"
        # We need ws_url so we can feed it into our WebSocket client.
        # ws_url will read (eg) "ws://localhost:56436/path/to/websocket

        ws_client = yield tornado.websocket.websocket_connect(ws_url)

        # Now we can run a test on the WebSocket.
        ws_client.write_message("Hi, I'm sending a message to the server.")
        response = yield ws_client.read_message()
        self.assertEqual(response, "Hi client! This is a response from the server.")
        # ...etc

希望无论如何这是一个很好的起点。

【讨论】:

    【解决方案2】:

    我尝试在基于tornado.websocket.WebSocketHandler 的处理程序上实现一些单元测试,并得到以下结果:

    首先AsyncHTTPTestCase 肯定缺乏网络套接字支持。

    不过,至少可以使用它来管理IOLoop 和重要的应用程序。可惜tornado没有提供WebSocket客户端,所以这里进入侧开发库。

    这里是 unit test on Web Sockets,使用 Jef Balog 的 tornado websocket client

    【讨论】:

    • “Small fix”注释可以删除,因为它已被合并到已经提到的上游存储库中。
    • Tornado 确实有一个 Websocket 客户端:tornado.websocket.websocket_connect 实例化一个 WebSocketClientConnection 对象。
    【解决方案3】:

    This answer(和问题)可能很有趣,我使用 ws4py 作为客户端,使用 Tornado 的 AsyncTestCase 来简化整个事情。

    【讨论】:

    • 我很想看到一个完整的例子来说明如何在龙卷风中测试异步 websocket。你在某处有博文吗?
    • 嗨,不,我没有,我们刚刚为另一个 python 模块删除了 ws4py(现在不记得它的名字了)。由于这种变化,我们必须做一些调整。当我们有工作(一两周内)恢复正常时,我会通知你(这里)
    • 好的,here 是。它使用同步 Web 套接字请求(对于我们收到响应的每个请求),但您可以通过一些修改使其异步。 Web 套接字客户端库来自here,它适用于 python3,但也有一个 python2 版本。顺便提一句。没有任何龙卷风组件(我想您的意图是测试龙卷风服务器?)
    • @Clint 关于这个你可以参考my post
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多