Tornado框架的异步代码单元支持同步获取URL在项目里实战的心得和方法

举报
黎燃 发表于 2024/08/14 22:02:59 2024/08/14
【摘要】 异步代码单元支持TestCase测试子类IOLoop-基于异步代码。UnitTest框架是同步的,因此测试方法返回时必须完成测试。这意味着异步代码不能以与通常完全相同的方式使用,必须进行调整。要使用协同程序编写测试,请使用龙卷风。测试gen_测试而不是tornado.gen.coroutine此类还提供(已弃用)stop()和wait()更多手动测试方法。测试方法本身必须调用self-Wa...

异步代码单元支持

TestCase测试子类IOLoop-基于异步代码。
UnitTest框架是同步的,因此测试方法返回时必须完成测试。这意味着异步代码不能以与通常完全相同的方式使用,必须进行调整。要使用协同程序编写测试,请使用龙卷风。测试gen_测试而不是tornado.gen.coroutine
此类还提供(已弃用)stop()和wait()更多手动测试方法。测试方法本身必须调用self-Wait(),异步回调应调用self-Stop()表示完成。
默认情况下,为每个测试构建新的IOLoop,并且可以用作self-io_ Loop。如果要测试的代码需要一个全局IOLoop,那么子类应该重写get_new_IOLoop返回它。

class MyTestCase(AsyncTestCase):
    @tornado.testing.gen_test
    def test_http_fetch(self):
        client = AsyncHTTPClient()
        response = yield client.fetch("http://www.tornadoweb.org")
        # Test contents of response
        self.assertIn("FriendFeed", response.body)

# This test uses argument passing between self.stop and self.wait.
class MyTestCase2(AsyncTestCase):
    def test_http_fetch(self):
        client = AsyncHTTPClient()
        client.fetch("http://www.tornadoweb.org/", self.stop)
        response = self.wait()
        # Test contents of response
        self.assertIn("FriendFeed", response.body)

不应直接调用此IOLoop的start和stop方法,而应使用self。停止并自我等待。传递给self的参数。stop从self.wait返回。可能有多次等待/停止。

import hello

class TestHelloApp(AsyncHTTPTestCase):
    def get_app(self):
        return hello.make_app()

    def test_homepage(self):
        response = self.fetch('/')
        self.assertEqual(response.code, 200)
        self.assertEqual(response.body, 'Hello, world')

启动HTTP服务器的测试用例。
子类必须重写get_App(),返回龙卷风。web应用程序(或其他)HTTPServer回调)。测试通常使用自http_客户端从服务器获取URL。
例如,假设用户指南中的“hello,world”示例位于hello py。

self.http_client.fetch(self.get_url('/'), self.stop)
response = self.wait()

同步获取URL

给定路径将连接到本地服务器的主机和端口。任何其他关键字参数都将直接传递给AsyncHTTPClient Fetch(因此可以通过method=“POST”、body=“…”等使用)。
如果路径以http://orhttps://,它将被视为一个完整的URL并按原样提取。
如果raise_Error为真,则为龙卷风。如果响应代码不是200,将引发httpclient HTTPError。这与raise_Error参数AsyncHTTPClient Fetch不同,但默认值为False。这是真的。AsyncHTTPClient)因为测试通常需要处理非200个响应代码。

class MyTest(AsyncHTTPTestCase):
    @gen_test
    def test_something(self):
        response = yield self.http_client.fetch(self.get_url('/'))

在5.0版中进行了更改:添加了对绝对URL的支持。
在版本5.1中更改:RAISE added_Error参数。
在版本5.1之后删除:此方法当前将任何异常转换为状态代码为599的HTTPResponse。在龙卷风6.0中,除了龙卷风。httpclient HTTPError将通过,raise_Error=False将仅抑制非200响应代码导致的错误。

class MyTest(AsyncHTTPTestCase):
    @gen_test(timeout=10)
    def test_something_slow(self):
        response = yield self.http_client.fetch(self.get_url('/'))

控制日志输出

用于捕获和抑制预期日志输出的上下文管理器。
帮助减少错误条件测试的噪音,同时仍保留意外的日志条目。不是线程安全的。
属性logged_如果堆栈设置为true,则记录任何异常堆栈跟踪。

with ExpectLog('tornado.application', "Uncaught exception"):
    error_response = self.fetch("/some_page")

Logger—要监视的记录器对象(或记录器名称)。传递一个空字符串以监视根记录器。
Regex–要匹配的正则表达式。将禁用指定记录器上与此正则表达式匹配的任何日志条目。
必需–如果为true,则在with语句中不会匹配任何日志条目。
级别—来自日志的模块,指示预期的日志级别。如果提供此参数,则仅此级别的日志消息将被视为匹配项。此外,提供的记录器将在必要时调整其级别(在ExpectLog中启用预期消息)。

# Runs all tests
python -m tornado.test.runtests
# Runs one test
python -m tornado.test.runtests tornado.test.web_test
import tornado.escape
import_object('tornado.escape') is tornado.escape
True
import_object('tornado.escape.utf8') is tornado.escape.utf8
True
import_object('tornado') is tornado
True
import_object('tornado.missing_module')
Traceback (most recent call last):
    ...
ImportError: No module named missing_module

从异常对象中提供errno。
在某些情况下,errno属性未设置,因此我们从参数中提取errno。然而,如果有人在没有任何参数的情况下实例化异常,他们将得到一个元组错误。因此,此函数抽象了所有行为,并为提供了获取errno的安全方法。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。