[英]How can I write a Tornado unit test which tests concurrency
我有興趣確保我的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
並進行單次提取,因此它不能用於此類測試,但您可以直接轉到底層的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.