1

我有一个扩展的测试类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

但我想知道是否有更清洁的方法来做到这一点(也许使用鼻子)?我已经研究了 unittestsetUpClass方法,但由于该方法必须是 a @classmethod,因此测试用例实例的 http 请求实用程序在setUpClass运行时尚不可用。

4

1 回答 1

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]
于 2013-06-14T20:22:17.183 回答