如何测试龙卷风read_message没有东西可读



我有一个龙卷风聊天,我正在做一些测试,大多数客户端消息从服务器生成回复,但其他必须不生成任何回复。

我设法做到了这段代码,等待读取超时发生,有更好的方法来做到这一点吗?

import json
import tornado
from tornado.httpclient import HTTPRequest
from tornado.web import Application
from tornado.websocket import websocket_connect
from tornado.testing import AsyncHTTPTestCase, gen_test
class RealtimeHandler(tornado.websocket.WebSocketHandler):
    def on_message(self, message):
        if message != 'Hi':
            self.write_message('Hi there')
        return 
class ChatTestCase(AsyncHTTPTestCase):
    def get_app(self):
        return Application([
            ('/rt', RealtimeHandler),
        ])
    @gen_test
    def test_no_reply(self):
        request = HTTPRequest('ws://127.0.0.1:%d/rt' % self.get_http_port())
        ws = yield websocket_connect(request)
        ws.write_message('Hi')
        with self.assertRaises(tornado.ioloop.TimeoutError):
            response = yield ws.read_message()

当测试结束时也有一个问题

======================================================================
ERROR: test_no_reply (myproj.tests.ChatTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/ubuntu/my_env/local/lib/python2.7/site-packages/tornado/testing.py", line 120, in __call__
    result = self.orig_method(*args, **kwargs)
  File "/home/ubuntu/my_env/local/lib/python2.7/site-packages/tornado/testing.py", line 506, in post_coroutine
    self._test_generator.throw(e)
StopIteration

一般来说,很难对阴性结果进行测试:你要等多久才能得出你正在测试的事情永远不会发生的结论?最好重新安排事情,这样测试就可以用积极的术语来表达。在这个简单的示例中很难做到这一点,但是考虑下面的处理程序:

class RealtimeHandler(tornado.websocket.WebSocketHandler):
    def on_message(self, message):
        if int(message) % 2 == 1:
            self.write_message('%s is odd' % message)
在这种情况下,您可以通过发送消息1、2和3来测试它,并断言您得到两个响应,"1是奇数"one_answers"3是奇数"。

您看到的StopIteration失败对我来说有点惊讶:我不希望在@gen_test方法中捕获超时,因此这样做可能会产生意想不到的结果,但我不希望它变成StopIteration。在任何情况下,最好重新构造测试,这样您就不必依赖超时。如果您确实需要超时,请使用gen.with_timeout,这样您就可以从测试内部控制超时,而不是依赖于@gen_test中的外部超时。

只是为了说明@Ben Darnell的答案。

from tornado import gen
class ChatTestCase(AsyncHTTPTestCase):
    def get_app(self):
        return Application([
            ('/rt', RealtimeHandler),
        ])
    @gen_test
    def test_no_reply(self):
        request = HTTPRequest('ws://127.0.0.1:%d/rt' % self.get_http_port())
        ws = yield websocket_connect(request)
        ws.write_message('Hi')
        with self.assertRaises(gen.TimeoutError):
            response = yield gen.with_timeout(datetime.timedelta(seconds=4), ws.read_message()

相关内容

  • 没有找到相关文章

最新更新