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

标签 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))

最佳答案

AsyncHTTPTestCase.fetch 控制IOLoop 并进行一次fetch,所以不能用于这种测试,但是可以直接到底层self.http_client,并使用@tornado.testing.gen_test来控制IOLoop:

@gen_test
def test_async_sleep(self):
    start = time.time()
    resp1, resp2 = yield [
        self.http_client.fetch(self.get_url('/async')),
        self.http_client.fetch(self.get_url('/async')),
    ]
    diff = time.time() - start

关于python - 如何编写测试并发性的 Tornado 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33488410/

相关文章:

Python Pandas if/else 语句

postgresql - 在对象数组上执行异步 pg-node 查询

python-3.x - Tornado:stream_request_body 输出的 mime 类型

python - Django 密码重置

python - 在 python 3 中,如何将数据从二维数组传输到 csv 文本文件

java - 打破 CompletableFutures 链

python - Tornado :来自迭代器的 AsyncHttpClient.fetch?

python - 如何在 Tornado 的 POST 处理程序中获取 JSON 参数?

python - 具有转换的重复数组

rest - 使用 Spring Boot 和 Java 8 的非阻塞 REST