2012-02-17 16 views
7

Pracuję nad projektem, który działa z funkcją websocket tornada. Widzę przyzwoitą ilość dokumentacji do pracy z asymetrycznym kodem, ale nic o tym, jak można to wykorzystać do tworzenia testów jednostkowych, które działają z ich implementacją WebSocket.Jak korzystać z tornado.testing do tworzenia testów jednostek WebSocket?

Czy funkcja tornado.testing zapewnia taką funkcję? Jeśli tak, to czy ktoś może podać krótki przykład, jak to zrobić?

Z góry dziękuję.

+0

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

+0

Tak, widziałem tę stronę. Mogę się mylić, ale sądzę, że asynchroniczne przypadki testowe, które tam dokumentują, dotyczą zwykłych żądań HTTP, a nie WebSockets. –

+0

Wygląda na to, że chcesz użyć klienta, aby trafić serwer testowy. W takim przypadku uważam, że odpowiedź brzmi "nie", nie jest. 'tornado.testing' nie zawiera klienta websocket. Możesz spróbować czegoś takiego jak Selenium. –

Odpowiedz

3

Mam próbował realizować kilka testów jednostkowych na podstawie tornado.websocket.WebSocketHandler koparki i mam następujące wyniki:

przede wszystkim AsyncHTTPTestCase pewno ma brak wsparcia gniazd internetowych.

Mimo to można go używać przynajmniej do zarządzania IOLoop i aplikacji, które są znaczące. Niestety, nie ma klienta WebSocket dostarczanego z tornadem, więc tutaj wejdź do rozwijanej biblioteki.

Oto unit test on Web Sockets przy użyciu Jf Baloga tornado websocket client.

+0

Komentarz "Mała poprawka" może zostać usunięty, ponieważ został już scalony z wyżej wymienionym repozytorium. – Joakim

+1

Tornado ma klienta Websocket: tornado.websocket.websocket_connect, który tworzy instancję obiektu WebSocketClientConnection. –

1

This answer (i pytanie) mogą być interesujące, używam ws4py dla klienta i AsyncTestCase Tornado, który upraszcza całą sprawę.

+0

Chciałbym zobaczyć pełny przykład jak przetestować async websockets w tornado. Czy gdzieś masz wpis na blogu? – Clint

+0

Cześć, nie, nie, właśnie upuszczono ws4py dla innego modułu python (nie pamiętam teraz jego nazwy). Musimy dokonać pewnych korekt z powodu tej zmiany. Powiadomię cię (tutaj), kiedy będziemy mieli coś znowu w pracy (za tydzień lub dwa). – Pedru

+0

OK, [tutaj] (https://www.assembla.com/code/python_websocket_testing/git/nodes). Korzysta z żądań synchronizacji z gniazdami internetowymi (dla każdego żądania otrzymujemy odpowiedź), ale możesz je ustawić jako asynchroniczne z pewnymi modyfikacjami. Biblioteka klienta gniazd internetowych pochodzi z [here] (https://github.com/liris/websocket-client/tree/py3) dla Pythona3, ale jest też wersja python2. b.t.w. nie ma żadnego elementu tornado (przypuszczam, że twoim zamiarem jest przetestowanie serwera tornado?) – Pedru

10

Jak @Vladimir powiedział, nadal można używać AsyncHTTPTestCase utworzyć/zarządzać instancję Test serwer, ale może jeszcze przetestować WebSockets w taki sam sposób, jak to normalne żądania HTTP - nie tylko nie cukier syntaktyczny pomóc Ci.

Tornado ma również własnego klienta WebSocket, więc nie ma potrzeby (o ile widziałem) korzystania z klienta innej firmy - być może jest to ostatnie dodanie. Więc spróbuj coś takiego:

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 

Mam nadzieję, że i tak jest to dobry punkt wyjścia.

Powiązane problemy