Via*_*iuk 13 python unit-testing tornado
我想尝试在TDD练习后编写一些代码.我想基于python的龙卷风框架创建简单的应用程序.我正在通过互联网查看人们如何为龙卷风编写测试并找到类似这样的内容:
class TestSomeHandler(AsyncHTTPTestCase):
def test_success(self):
response = self.fetch('/something')
self.assertEqual(response.code, 200)
Run Code Online (Sandbox Code Playgroud)
如果我错了,请纠正我但看起来更像集成测试.而不是它我试图为一些虚拟处理程序编写简单的单元测试.例如这样一个:
class SomeHandler(BaseHandler):
@gen.coroutine
def get(self):
try:
from_date = self.get_query_argument("from", default=None)
datetime.datetime.strptime(from_date, '%Y-%m-%d')
except ValueError:
raise ValueError("Incorrect argument value for from_date = %s, should be YYYY-MM-DD" % from_date)
Run Code Online (Sandbox Code Playgroud)
测试看起来像:
class TestSomeHandler(AsyncHTTPTestCase):
def test_no_from_date_param(self):
handler = SomeHandler()
with self.assertRaises(ValueError):
handler.get()
Run Code Online (Sandbox Code Playgroud)
我知道我错过了get()申请和要求.尚未处理如何创建它们.
但我的问题是,人们是否像第一个例子那样为龙卷风编写测试,或者有人在app中调用处理程序?要遵循什么模式?如果有人有相关的代码可以分享,那就太好了.
使用模式的AsyncHTTPTestCase主要原因是,它使您可以处理所有请求。当然,也AsyncTestCase可以手动使用和处理它。
AsyncTestCase示例。由于这将get是协程的测试方法,因此我们将使用gen_test它来使其变得更简单。RequestHandler需要Application和HTTPRequest对象。因为我们不中继应用程序的设置,所以ui_methods等Application是一个简单的模拟。
from tornado.testing import AsyncTestCase, gen_test
from tornado.web import Application
from tornado.httpserver import HTTPRequest
from unittest.mock import Mock
class TestSomeHandler(AsyncTestCase):
@gen_test
def test_no_from_date_param(self):
mock_application = Mock(spec=Application)
payload_request = HTTPRequest(
method='GET', uri='/test', headers=None, body=None
)
handler = SomeHandler(mock_applciation, payload_request)
with self.assertRaises(ValueError):
yield handler.get()
Run Code Online (Sandbox Code Playgroud)
恕我直言,这取决于您使用哪种模式。我选择AsyncHTTPTestCasehttp-verb方法(get,post等),因为:
当然,处理程序的其余方法已通过进行了测试AsyncTestCase。