gpt4 book ai didi

python - 单元测试 cherrypy 网络应用程序

转载 作者:太空狗 更新时间:2023-10-29 17:41:57 25 4
gpt4 key购买 nike

我最近不得不重写我们的 rest api,并从 Flask 切换到 Cherrypy(主要是由于 Python 3 兼容性)。但是现在我一直在尝试编写我的单元测试,Flask 有一个非常漂亮的内置测试客户端,您可以使用它向您的应用程序发送虚假请求(无需启动服务器)。我找不到任何类似的功能对于 Cherrypy,是否有这样的功能,或者我是否卡在启动服务器并针对它执行实际请求?

最佳答案

据我所知,CherryPy 确实没有为这种类型的测试提供工具(没有正在运行的服务器)。但它仍然很容易做到(尽管它依赖于 CherryPy 的一些内部结构)。

这是一个简单的展示:

from StringIO import StringIO
import unittest
import urllib

import cherrypy

local = cherrypy.lib.httputil.Host('127.0.0.1', 50000, "")
remote = cherrypy.lib.httputil.Host('127.0.0.1', 50001, "")

class Root(object):
@cherrypy.expose
def index(self):
return "hello world"

@cherrypy.expose
def echo(self, msg):
return msg

def setUpModule():
cherrypy.config.update({'environment': "test_suite"})

# prevent the HTTP server from ever starting
cherrypy.server.unsubscribe()

cherrypy.tree.mount(Root(), '/')
cherrypy.engine.start()
setup_module = setUpModule

def tearDownModule():
cherrypy.engine.exit()
teardown_module = tearDownModule

class BaseCherryPyTestCase(unittest.TestCase):
def webapp_request(self, path='/', method='GET', **kwargs):
headers = [('Host', '127.0.0.1')]
qs = fd = None

if method in ['POST', 'PUT']:
qs = urllib.urlencode(kwargs)
headers.append(('content-type', 'application/x-www-form-urlencoded'))
headers.append(('content-length', '%d' % len(qs)))
fd = StringIO(qs)
qs = None
elif kwargs:
qs = urllib.urlencode(kwargs)

# Get our application and run the request against it
app = cherrypy.tree.apps['']
# Let's fake the local and remote addresses
# Let's also use a non-secure scheme: 'http'
request, response = app.get_serving(local, remote, 'http', 'HTTP/1.1')
try:
response = request.run(method, path, qs, 'HTTP/1.1', headers, fd)
finally:
if fd:
fd.close()
fd = None

if response.output_status.startswith('500'):
print response.body
raise AssertionError("Unexpected error")

# collapse the response into a bytestring
response.collapse_body()
return response

class TestCherryPyApp(BaseCherryPyTestCase):
def test_index(self):
response = self.webapp_request('/')
self.assertEqual(response.output_status, '200 OK')
# response body is wrapped into a list internally by CherryPy
self.assertEqual(response.body, ['hello world'])

def test_echo(self):
response = self.webapp_request('/echo', msg="hey there")
self.assertEqual(response.output_status, '200 OK')
self.assertEqual(response.body, ["hey there"])

response = self.webapp_request('/echo', method='POST', msg="hey there")
self.assertEqual(response.output_status, '200 OK')
self.assertEqual(response.body, ["hey there"])

if __name__ == '__main__':
unittest.main()

编辑,我已将此答案扩展为 CherryPy recipe .

关于python - 单元测试 cherrypy 网络应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14260101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com