簡體   English   中英

如何編寫測試並發性的Tornado單元測試

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM