异步代码单元支持
TestCase测试子类IOLoop-基于异步代码。 UnitTest框架是同步的,因此测试方法返回时必须完成测试。这意味着异步代码不能以与通常完全相同的方式使用,必须进行调整。要使用协同程序编写测试,请使用龙卷风。测试gen_测试而不是tornado.gen.coroutine 此类还提供(已弃用)stop()和wait()更多手动测试方法。测试方法本身必须调用self-Wait(),异步回调应调用self-Stop()表示完成。 默认情况下,为每个测试构建新的IOLoop,并且可以用作self-io_ Loop。如果要测试的代码需要一个全局IOLoop,那么子类应该重写get_new_IOLoop返回它。
代码语言:javascript复制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返回。可能有多次等待/停止。
代码语言:javascript复制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。
代码语言:javascript复制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个响应代码。
代码语言:javascript复制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响应代码导致的错误。
代码语言:javascript复制class MyTest(AsyncHTTPTestCase):
@gen_test(timeout=10)
def test_something_slow(self):
response = yield self.http_client.fetch(self.get_url('/'))
控制日志输出
用于捕获和抑制预期日志输出的上下文管理器。 帮助减少错误条件测试的噪音,同时仍保留意外的日志条目。不是线程安全的。 属性logged_如果堆栈设置为true,则记录任何异常堆栈跟踪。
代码语言:javascript复制with ExpectLog('tornado.application', "Uncaught exception"):
error_response = self.fetch("/some_page")
Logger—要监视的记录器对象(或记录器名称)。传递一个空字符串以监视根记录器。 Regex–要匹配的正则表达式。将禁用指定记录器上与此正则表达式匹配的任何日志条目。 必需–如果为true,则在with语句中不会匹配任何日志条目。 级别—来自日志的模块,指示预期的日志级别。如果提供此参数,则仅此级别的日志消息将被视为匹配项。此外,提供的记录器将在必要时调整其级别(在ExpectLog中启用预期消息)。
代码语言:javascript复制# Runs all tests
python -m tornado.test.runtests
# Runs one test
python -m tornado.test.runtests tornado.test.web_test
代码语言:javascript复制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的安全方法。