2012-02-17 12 views
7

Estoy trabajando en un proyecto que funciona con la funcionalidad de websocket de tornado. Veo una buena cantidad de documentación para trabajar con código asíncrono, pero nada sobre cómo se puede usar para crear pruebas unitarias que funcionen con su implementación de WebSocket.¿Cómo se usa tornado.testing para crear pruebas de unidades WebSocket?

¿Tiene tornado.testing la funcionalidad para hacer esto? Si es así, ¿podría alguien proporcionar un breve ejemplo de cómo hacerlo realidad?

Gracias de antemano.

+0

http://www.tornadoweb.org/documentation/testing.html –

+0

Sí, vi esa página. Podría estar equivocado, pero creo que los casos de prueba asíncrona que documentan allí son para solicitudes HTTP normales, no WebSockets. –

+0

Parece que desea utilizar un cliente para llegar a un servidor de prueba, en cuyo caso creo que la respuesta es no, no es así. 'tornado.testing' no incluye un cliente websocket. Podrías probar algo como Selenio. –

Respuesta

3

He intentado poner en práctica algunas pruebas unitarias en tornado.websocket.WebSocketHandler controladores basados ​​y obtuvo los siguientes resultados:

En primer lugar AsyncHTTPTestCase definitivamente tiene falta de apoyo tomas web.

Aún así, se puede usar al menos para administrar IOLoop y material de aplicación que es significativo. Desafortunadamente, no hay ningún cliente WebSocket provisto de tornado, así que aquí ingrese a la biblioteca desarrollada por un lado.

Aquí está unit test on Web Sockets usando Jef Balog's tornado websocket client.

+0

El comentario "Corrección pequeña" se puede eliminar ya que se ha fusionado en el repositorio en sentido ascendente mencionado anteriormente. – Joakim

+1

Tornado tiene un cliente Websocket: tornado.websocket.websocket_connect que crea una instancia de un objeto WebSocketClientConnection. –

1

This answer (y la pregunta) pueden ser de interés, yo uso ws4py para el cliente y AsyncTestCase de Tornado que simplifica todo.

+0

Me encantaría ver un ejemplo completo de cómo probar websockets asincrónicos en tornado. ¿Tienes una publicación en algún blog? – Clint

+0

Hola, no, no, acabamos de eliminar ws4py para otro módulo de python (no recuerdo su nombre en este momento). Tenemos que hacer algunos ajustes debido a este cambio. Le avisaré (aquí) cuando tengamos algo funcionando de nuevo (en una semana o dos) – Pedru

+0

OK, [aquí] (https://www.assembla.com/code/python_websocket_testing/git/nodes) sí lo está. Utiliza solicitudes de socket web de sincronización (para cada solicitud recibimos una respuesta), pero puede hacer que sea asincrónico con algunas modificaciones. La biblioteca del cliente de socket web proviene de [aquí] (https://github.com/liris/websocket-client/tree/py3) es para python3, pero también hay una versión de python2. b.t.w. no hay ningún componente de tornado (supongo que tu intención es probar un servidor de tornado?) – Pedru

10

Como @Vladimir dijo, todavía se puede utilizar AsyncHTTPTestCase para crear/gestionar la instancia de servidor web de prueba, pero puede todavía probar WebSockets de la misma manera como lo haría peticiones HTTP normales - simplemente no hay azúcar sintáctico para ayudarte.

Tornado también tiene su propio cliente WebSocket, por lo que no es necesario (por lo que he visto) utilizar un cliente de terceros; sin embargo, es una adición reciente. Así que intente algo como:

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 

Espero que sea un buen punto de partida de todos modos.

Cuestiones relacionadas