在Tornado AsyncHTTPTestCase中缓存HTTP响应

时间:2013-06-14 19:29:46

标签: python tornado nose

我有一个扩展tornado.testing.AsyncHTTPTestCase的测试类,我正在使用Nose来运行它的测试方法。每种测试方法都会检查受测试的Tornado服务器上的URL的响应。其中一些请求需要几秒钟才能完成。每个请求都以多种方法进行测试。

我希望避免在测试期间两次发出相同的HTTP请求,因为这会显着减慢测试速度。确保每个请求只进行一次的最佳方法是什么?

示例:

class ServerTest(AsyncHTTPTestCase):
    def test_endpoint(self):
        self.http_client.fetch(self.get_url('/'), self.stop)
        response = self.wait()
        self.assertTrue(response.code == 200)

    def test_endpoint_differently(self):
        self.http_client.fetch(self.get_url('/'), self.stop)
        response = self.wait()
        self.assertTrue(response.body != "")

上述两种测试方法都要求/端点,这很慢。如何在第一次测试运行之前发生此请求并让测试检查缓存的响应?

我已经使用了类似的变量:

class ServerTest(AsyncHTTPTestCase):
    responses = {}

    def setUp(self):
        if self.responses == {}:
            # do http request
            responses['/'] = result

但我想知道是否有更清洁的方法(可能使用Nose)?我已经调查了unittest setUpClass方法,但由于该方法必须是@classmethod,因此测试用例实例的http请求实用程序在setUpClass运行时尚不可用。

1 个答案:

答案 0 :(得分:1)

此类实现我的解决方案:https://gist.github.com/emmett9001/5785018

进一步研究这一点让我意识到按照我的希望前载所有请求并没有多大意义。我实现了简单的缓存,确保每个请求只发生一次:

responses = {}

def cache_response(self, key, response):
    self.responses[key] = {}
    self.responses[key]['response'] = response
    self.responses[key]['time'] = dt.datetime.now()

def get_cached_url(self, path):
    if path not in self.responses.keys():
        self.http_client.fetch(self.get_url(path), self.stop)
        self.cache_response(path, self.wait(timeout=30))
    return self.responses[path]