如何为Tornado的AsyncHTTPClient编写测试?

时间:2016-03-01 16:28:34

标签: python unit-testing asynchronous tornado

我正在尝试在编写Tornado应用程序时遵循TDD练习。我有一个get方法的端点,它从几个API获取数据,过滤,组合并发送响应。对于这个get处理程序,我创建了一个帮助程序,它负责异步数据提取。我想为它编写测试。

Helper看起来像这样:

class DummyHelper(object):
    @gen.coroutine
    def fetch(self, url):
        http_client = AsyncHTTPClient()
        response = yield http_client.fetch(url)

        raise gen.Return(response.body)

测试是:

from tornado.testing import AsyncHTTPTestCase
from tornado.web import HTTPError
import app
from lib.handlers.dummy import DummyHelper
from tornado.testing import gen_test

class TestDummyHandler(AsyncHTTPTestCase):    
    def get_app(self):
        return app.get_app()

    @gen_test
    def test_200_fetch(self):
        helper = DummyHelper()
        response = yield helper.fetch("http://google.com/")
        self.assertEqual(response.code, 200)

    @gen_test
    def test_404_fetch(self):
        helper = DummyHelper()
        with self.assertRaises(HTTPError):
            yield helper.fetch("http://google.com/test")

test_200_fetch的一切正常。但它不适用于test_404_fetch。如何使它工作?我应该写这些测试吗?

1 个答案:

答案 0 :(得分:1)

该测试针对不同的例外。有两个HTTPError

您需要使用httpclient中的那个。

<强>提示

  1. 如果您未对RequestHandler进行测试,则可以使用AsyncTestCase,但不需要get_app
  2. 如果您的测试依赖于外部资源(google..com),则无法轻易隔离...这不是单元测试,更多是集成测试。这不是一件坏事,但值得注意。
  3. 示例

    from tornado import gen
    from tornado.httpclient import AsyncHTTPClient
    
    
    class DummyHelper(object):
        @gen.coroutine
        def fetch(self, url):
            http_client = AsyncHTTPClient()
            response = yield http_client.fetch(url)
            raise gen.Return(response)
    
    
    import unittest
    from tornado.testing import AsyncTestCase
    from tornado.httpclient import HTTPError
    from tornado.testing import gen_test
    
    class TestDummyHandler(AsyncTestCase):
    
        @gen_test
        def test_200_fetch(self):
            helper = DummyHelper()
            response = yield helper.fetch("http://google.com/")
            self.assertEqual(response.code, 200)
    
        @gen_test
        def test_404_fetch(self):
            helper = DummyHelper()
            with self.assertRaises(HTTPError):
                yield helper.fetch("http://google.com/test")
    
    if __name__ == '__main__':
        unittest.main()