单元测试cherpy web应用程序

2024-01-22

我最近不得不重写我们的 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 食谱 https://bitbucket.org/Lawouach/cherrypy-recipes/src/50aff88dc4e24206518ec32e1c32af043f2729da/testing/unit/serverless?at=default.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单元测试cherpy web应用程序 的相关文章

随机推荐

  • 如何在关闭弹出窗口时调用函数

    我正在调用Javascriptwindow open 函数在弹出窗口中加载另一个 url 当用户关闭弹出窗口时 我想要MyThanks 要调用的函数 我怎样才能做到这一点 我的脚本
  • WTF form.validate_on_submit() 不起作用

    我有以下代码 并且正在提交表单 当我点击提交按钮时 我的表单验证会打印出来False 我已经检查并确保我包含了不同帖子中的所有内容 但我无法对其进行验证 我做错了什么吗 app route index html methods GET PO
  • 如何将 Javascript 对象键大写?

    有人知道有什么好的方法可以扭转这个吗 var obj key1 value1 key2 value2 key3 value3 key4 value4 into var obj Key1 value1 Key2 value2 Key3 val
  • 如何向 SQLite 3 表中插入多行? [复制]

    这个问题在这里已经有答案了 在 MySQL 中我会使用 INSERT INTO mytable col1 col2 VALUES 1 aaa 2 bbb 但这会导致 SQLite 中出现错误 SQLite 的正确语法是什么 之前已经在这里回
  • 使用 ES6 装饰器时出现意外的标记“@”

    我有一个 React 项目设置 我正在尝试将 MobX 合并到其中 这样我就必须使用装饰器 即 observable 当我这样做时 我收到以下错误 https github com mobxjs mobx https github com
  • 隐藏 Web API 响应的属性

    我想隐藏Modifiedby Modifieddate and Createddate来自 Web API 响应的属性 我尝试使用 JsonOgnore IgnoreDataMember 但没有工作 ModelMetadataType ty
  • 为什么 Visual Studio 不允许我在 enable_if 中使用模板化的 constexpr 函数?

    因此 我将其归结为最小的 完整的 可验证的示例 并且 Visual Studio 2015 似乎不允许我使用模板化的 constexpr函数在一个enable if 例如 template
  • 使用 AutoFixture 创建递归数据结构的固定装置

    我正在开发一个项目 其中有一些递归数据结构 我想为其创建一个固定装置 数据结构是XmlCommandElement 它有一个单一的方法ToCommand转换XmlCommandElement to Command 树上的每个节点都可以是Xm
  • 如何在迭代字典时从字典中删除项目?

    我可以在迭代 Python 字典时删除其中的项目吗 我想从字典中删除不满足特定条件的元素 而不是创建一个全新的字典 以下是一个好的解决方案 还是有更好的方法 for k v in mydict items if k val del mydi
  • PHP DateInterval 与 DateTime 具有可比性吗?

    我发现 PHP 中的 DateTime 对象可以与另一个对象进行比较 因为 gt 和 和 DateInterval 一样吗 当我试图回答这个问题时 我发现了一些奇怪的事情
  • wx.Python:在多个面板之间传递控制

    我是 wxPython 的新手 并且研究过类似的问题 但无法具体找到我的问题的答案 我正在创建两个带有分离器的面板 每个面板都有许多小部件 我希望一个面板中的小部件控制另一个面板的某些属性 反之亦然 在这个例子中 我试图改变背景RightP
  • ReLU 没有学习处理负输入 Keras / Tensorflow

    我希望我的神经网络将负值转换为正值 理论上 这可以使用 ReLU 函数和 1 个节点来完成 该节点将输入权重学习为 1 因此负输入乘以 1 正输入 它只是继续输出 0 代码如下 我使用 1 作为输入值 看看它是否可以至少在单个输入上进行学习
  • 更改我的项目文件不会更改 Docker 计算机内的文件

    我正在尝试使用 Docker 来改进我的工作流程 我安装了 适用于 Windows 的 Docker 工具箱 https docs docker com engine getstarted step one 在我的 Windows 10 家
  • 在Python中,可以在不使用继承的情况下实现mixin行为吗?

    Python 中是否有一种合理的方法来实现类似于 Ruby 中的 mixin 行为 即不使用继承 class Mixin object def b self print b def c self print c class Foo obje
  • JavaPlot 和 gnuplot

    我正在拼命地努力让 Java 和 gnuplot 更好地发挥作用 我已经开始使用JavaPlot并将 jar 添加到类路径 使用 Eclipse 我还下载了 gnuplot 并将其放在安全的地方 第一个问题 所有例子都由JavaPlot假设
  • boost::filesystem::directory_iterator 是否因删除而失效?

    我正在遍历一个目录 当某个项目符合某些条件时 我将其删除 我可以在循环内安全地执行此操作 还是必须将路径保存在数组中并稍后删除 我没有找到相关信息boost 文件系统文档 http www boost org doc libs 1 52 0
  • PDFBox IOException:文件结尾,预期行

    我目前正在尝试使用 PDFBox 和 Selenium 从已上传并通过链接访问的 PDF 中获取文本 我用这个作为来源 http www seleniumeasy com selenium tutorials how to extract
  • 如何在 Firefox DevTools 中编辑或删除 cookie?

    在 Firebug 中 我可以使用以下命令删除和编辑任何 cookieCookies panel 但在 Firefox DevTools 中我找不到任何删除或编辑 cookie 的方法 我可以在哪里做到这一点 要在 Firefox DevT
  • bash“read -a”在空分隔字符串变量上循环

    我一直在阅读这篇文章 bash for in 在空分隔字符串变量上循环 https stackoverflow com questions 8677546 bash for in looping on null delimited stri
  • 单元测试cherpy web应用程序

    我最近不得不重写我们的 REST API 并从 Flask 切换到 Cherrypy 主要是由于 Python 3 兼容性 但现在我一直在尝试编写单元测试 Flask 有一个非常漂亮的内置测试客户端 您可以使用它向您的应用程序发送虚假请求