如何编写测试并发性的Tornado单元测试

时间:2015-11-02 22:44:47

标签: python asynchronous tornado

我有兴趣确保我的Tornado处理程序不会阻止,所以我想编写一些单元测试作为完整性检查。

我想到的是一个异步睡眠2秒钟的处理程序。在测试中,我想连续两次调用此处理程序,以便模拟"同时"请求。

如果我没有弄错的话,这两个请求应该同时运行,因此在不到4秒的时间内完成。问题是我不确定如何通过AsyncHTTPTestCase向我的应用程序同时发出2个请求。

这是我到目前为止所做的:

class SyncSleepHandler(tornado.web.RequestHandler):
    def get(self):
        time.sleep(2)


class AsyncSleepHandler(tornado.web.RequestHandler):
    @gen.coroutine
    def get(self):
        yield gen.sleep(2)


class SleepTest(AsyncHTTPTestCase):
    def get_app(self):
        return Application([(r'/sync', SyncSleepHandler),
                            (r'/async', AsyncSleepHandler)], debug=True)

    def test_async_sleep(self):
        start = time.time()
        resp1 = self.fetch(r'/async', method='GET')
        resp2 = self.fetch(r'/async', method='GET')
        diff = time.time() - start
        self.assertTrue(2 < diff < 4, msg="Difference is {:}".format(diff))

1 个答案:

答案 0 :(得分:4)

AsyncHTTPTestCase.fetch控制IOLoop并进行单次抓取,因此不能用于此类测试,但您可以直接转到底层self.http_client,并使用{{ 1}}来控制@tornado.testing.gen_test

IOLoop