摘要:非常适合写单元测试用它掉网络请求的返回值即可测试用的给上面的加装饰器放在上面这种一般的使用场景就是加缓存或者计时之类因为异步的里面是个所以最里面包的一层还是要加并且用返回
mock非常适合写单元测试, 用它patch掉网络请求的返回值即可
async_func.py
#!/usr/bin/env python # -*- coding:utf-8 -*- import signal import errno import tornado.gen import tornado.ioloop import tornado.web import tornado.httpclient import tornado.httpserver HOST = "baidu.com" @tornado.gen.coroutine def search(keyword): client = tornado.httpclient.AsyncHTTPClient() url = "http://%s/s?wd=%s" % (HOST, keyword) resp = yield client.fetch(url) raise tornado.gen.Return(resp.body) class FooHandler(tornado.web.RequestHandler): @tornado.gen.coroutine def get(self): keyword = self.get_argument("wd") result = yield search(keyword) self.finish(result) def handle_signal_kill(sig, frame): print "Catch signal: %s" % errno.errorcode(sig) tornado.ioloop.IOLoop.instance().stop() if __name__ == "__main__": app = tornado.web.Application( handlers=[ (r"/", FooHandler), ] ) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(8888) signal.signal(signal.SIGINT, handle_signal_kill) signal.signal(signal.SIGQUIT, handle_signal_kill) signal.signal(signal.SIGTERM, handle_signal_kill) signal.signal(signal.SIGHUP, handle_signal_kill) # test url: http://127.0.0.1:8888/?wd=nmb tornado.ioloop.IOLoop.current().start()
测试用的test.py
#!/usr/bin/env python # -*- coding:utf-8 -*- import mock import tornado.gen import tornado.ioloop import tornado.testing import tornado.concurrent import unittest import tornado.testing from async_func import search class AsyncTestCase(tornado.testing.AsyncTestCase): def setUp(self): super(AsyncTestCase, self).setUp() @mock.patch("tornado.httpclient.AsyncHTTPClient") @tornado.testing.gen_test def test_fetch(self, AsyncHTTPClient): AsyncHTTPClient.return_value = mock.MagicMock() future = tornado.concurrent.Future() future.set_result(mock.MagicMock(body="mycontent")) x = mock.MagicMock() x.fetch.return_value = future AsyncHTTPClient.return_value = x result = yield search("nmb48") self.assertIn(result, "mycontent test") unittest.main()
给上面的FooHandler加装饰器(放在coroutine上面), 这种一般的使用场景就是加缓存或者计时之类...
因为异步的里面是个generator, 所以最里面包的一层还是要加coroutine并且用gen返回
def cache_it(func): @tornado.gen.coroutine def _deco(self): print "decrator work" # save cache or other... result = yield func(self) raise tornado.gen.Return(result) return _deco
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/45483.html
摘要:主要是为了实现系统之间的双向解耦而实现的。问题及优化队列过长问题使用上述方案的异步非阻塞可能会依赖于的任务队列长度,若队列中的任务过多,则可能导致长时间等待,降低效率。 Tornado和Celery介绍 1.Tornado Tornado是一个用python编写的一个强大的、可扩展的异步HTTP服务器,同时也是一个web开发框架。tornado是一个非阻塞式web服务器,其速度相当快。...
摘要:译者说于年月日发布,该版本正式支持的关键字,并且用旧版本编译同样可以使用这两个关键字,这无疑是一种进步。其次,这是最后一个支持和的版本了,在后续的版本了会移除对它们的兼容。 译者说 Tornado 4.3于2015年11月6日发布,该版本正式支持Python3.5的async/await关键字,并且用旧版本CPython编译Tornado同样可以使用这两个关键字,这无疑是一种进步。其次...
摘要:译者说于年月日发布,该版本正式支持的关键字,并且用旧版本编译同样可以使用这两个关键字,这无疑是一种进步。其次,这是最后一个支持和的版本了,在后续的版本了会移除对它们的兼容。本节最好直接在或者阅读,以获得更好的阅读体验格式支持。 译者说 Tornado 4.3于2015年11月6日发布,该版本正式支持Python3.5的async/await关键字,并且用旧版本CPython编译Torn...
阅读 3533·2021-11-25 09:43
阅读 3115·2021-10-08 10:04
阅读 1585·2019-08-26 12:20
阅读 2031·2019-08-26 12:09
阅读 563·2019-08-23 18:25
阅读 3548·2019-08-23 17:54
阅读 2296·2019-08-23 17:50
阅读 770·2019-08-23 14:33