Как вы используете tornado.testing для создания модульных тестов WebSocket? - PullRequest
10 голосов
/ 18 февраля 2012

Я работаю над проектом, который работает с функциональностью веб-сокета торнадо. Я вижу достаточное количество документации для работы с асинхронным кодом, но ничего не говорится о том, как это можно использовать для создания модульных тестов, работающих с их реализацией WebSocket.

Предоставляет ли tornado.testing функциональность для этого? Если да, может ли кто-нибудь привести краткий пример того, как это сделать?

Заранее спасибо.

Ответы [ 3 ]

15 голосов
/ 29 сентября 2015

Как сказал @Vladimir, вы все равно можете использовать AsyncHTTPTestCase для создания / управления тестовым экземпляром веб-сервера, но вы можете по-прежнему тестировать WebSockets так же, как и обычные запросы HTTP - есть только нет синтаксического сахара, чтобы помочь вам.

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

Надеюсь, это хорошая отправная точка в любом случае.

4 голосов
/ 08 марта 2013

Я попытался реализовать некоторые модульные тесты для обработчиков на основе tornado.websocket.WebSocketHandler и получил следующие результаты:

Прежде всего AsyncHTTPTestCase определенно отсутствует поддержка веб-сокетов.

Тем не менее, его можно использовать как минимум для управления IOLoop и приложениями, что важно.К сожалению, нет клиента WebSocket, снабженного торнадо, поэтому введите здесь стороннюю библиотеку.

Вот модульный тест для веб-сокетов с использованием клиентского веб-сокета Jef Balog tornado .

1 голос
/ 18 марта 2013

Этот ответ (и вопрос) может представлять интерес, я использую ws4py для клиента и AsyncTestCase Торнадо, который упрощает все это.

...