如何在 python 中对 POST 方法进行单元测试?

2024-03-27

我有一个方法可以将包含 JSON 的 POST 发送到 Elasticsearch 实例。我正在尝试编写一个单元测试来验证发送的 JSON 的内容,但我不确定如何进行。我应该在 python 中创建一个本地服务器并让它验证 POST 的内容或其他内容吗?我目前有这个:

class TestAnalytics(BaseTest):

    def test_post(self):
        info = {"test1": "value1", "test2": "value2"}
        resp = requests.post(config.tool_repo_urls['es_url'], data=json.dumps(info), headers={'Content-Type': 'application/json'})
        assert_equal(resp.status_code, 200)  # verify valid response code

创建本地服务器是一种矫枉过正的行为,你可以做的是使用unitest库来修补post()方法,因此它使用 patch 方法将数据发送到您的内部断言方法,这是链接https://docs.python.org/3/library/unittest.mock-examples.html https://docs.python.org/3/library/unittest.mock-examples.html。你应该看看部分27.6.2。补丁装饰器

Example:

class TestAnalytics(BaseTest):

    @patch('requests.post')
    def test_post(self,mock_post):
        info = {"test1": "value1", "test2": "value2"}
        resp = requests.post(config.tool_repo_urls['es_url'], data=json.dumps(info), headers={'Content-Type': 'application/json'})
        #Some checks done on mock_post object

下面是完整的工作示例EDIT:

import json

from unittest import TestCase
from unittest.mock import patch

import requests


class TestAnalytics(TestCase):

    @patch('requests.post')
    def test_post(self, mock_post):
        info = {"test1": "value1", "test2": "value2"}
        resp = requests.post("www.someurl.com", data=json.dumps(info), headers={'Content-Type': 'application/json'})
        mock_post.assert_called_with("www.someurl.com", data=json.dumps(info), headers={'Content-Type': 'application/json'})


TestAnalytics().test_post()

Method assert_called_with检查是否完全使用其调用中指定的参数调用了修补的方法。在这种情况下这是真的

将其更改为例如:

mock_post.assert_called_with("www.someurl.com", data=json.dumps(info))

会给:

AssertionError: Expected call: post('www.someurl.com', data='{"test1": "value1", "test2": "value2"}')
Actual call: post('www.someurl.com', data='{"test1": "value1", "test2": "value2"}', headers={'Content-Type': 'application/json'})

您还可以使用mock_post反对检查个别参数,请检查上面的链接以获取完整的规格MagicMock can do

EDIT2

最近发现了这个用于单元测试的小库requests

https://github.com/getsentry/responses https://github.com/getsentry/responses

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

如何在 python 中对 POST 方法进行单元测试? 的相关文章

随机推荐

  • option.style.display =“none”在 safari 中不起作用[重复]

    这个问题在这里已经有答案了 这是我正在研究的示例 http jsfiddle net 4suwY 5 http jsfiddle net 4suwY 5 HTML
  • 如何从文本文件中只读取一项内容?

    我可以从文件中读入 并且可以通过更改 for 循环中的数字来更改给出的行数 但我不希望文件中的所有数字像这样并排显示 我需要它们全部随机地一一下降 public class Assignment2 public static void ma
  • Python Sklearn.Model_Selection 给出错误,无法导入梳

    我将 train test split 导入为 from sklearn model selection import train test split 并给出错误无法导入名称 comb 我使用的版本是 scipy 0 18 1 和 skl
  • Botconnector 不适用于自签名的 Nodejs 机器人

    我创建了一个简单的机器人 自签名 ssl 证书 显然这不适用于机器人连接器 几秒钟后 我从机器人收到以下错误 error code BadCertificate message An error occurred while sending
  • 获取用户 keycloak Not Found 异常

    我无法像示例中那样获得用户组 样品来自 看看我们的测试套件 例如 UserTest https github com keycloak keycloak blob 2 5 0 Final testsuite integration arqu
  • Winforms 中是否可以从 ListView 拖放到 TreeView?

    如果不可能的话 我还可以使用 2 个 TreeView 控件 我只是不会在第二个 TreeView 控件中具有层次结构 它就像某种存储库 任何代码示例或教程都会非常有帮助 ListView自然不支持拖放 但您可以使用少量代码启用它 http
  • 如何在cordova应用程序中创建两个离子模式?

    您好 在我的应用程序中 我已经有一个用于登录的离子模式 ionicModal fromTemplateUrl templates login html scope scope then function modal scope modal
  • 如何隔离Spring Boot应用程序Redis和Spring Boot会话全局Redis

    据我所知 spring boot和spring session为我们提供了一站式自动配置 但是当我的应用程序使用会话redis和应用程序缓存redis时 不是同一个redis服务器 我该如何配置呢 非常感谢您的回复 事实上 默认情况下 sp
  • OpenGL资源共享策略

    我正在创建一个类似 CAD 的应用程序 基于 Qt 它将是一个多文档界面 每个文档将包含大约 5 个视口 源自 QGLWidget 因此 我需要在整个应用程序中共享平面着色器 然后在每个文档 即 5 个视口 之间共享 3D 资源 存储为 V
  • 在两台显示器上最大化 WPF 窗口

    就像标题一样 我希望我的 WPF 在 2 个显示器上最大化 现在我的电脑有 2 个显示器 我设置 this Width System Windows Forms Screen AllScreens 0 Bounds Width System
  • PhoneGap Android 中的 pdf 查看器

    我正在寻找使用 Phonegap 2 0 的 Android pdf 查看器 我尝试了 childbrowser 插件 它可以在 iOS 上运行 但不能在 Android 上运行 我试过这个http www giovesoft com 20
  • Symfony 2 - 删除表单和 CSRF 令牌

    我有一个来自数据库的条目列表 我希望在每一行的末尾都有一个 删除按钮 这样用户就不必先转到编辑 显示页面来删除条目 我尝试使用 csrf 令牌创建一个隐藏的输入字段 如下所示 return this gt createFormBuilder
  • 如何仅获取 Rails 路由中的查询字符串?

    我正在使用这样的路线 match v1 method gt v1 index 我的目的是捕获 api 方法的名称 然后将请求发送到控制器内的该方法 def index self send params method params end 我
  • Java递归问题

    我在Java中遇到了一个递归面试问题 需要你的帮助 Write a Java function 这样 给定一个 int 数组 是否可以将 int 分为两组 使两组之和相同 并具有以下约束 所有 5 的倍数的值必须在一组中 并且所有是 3 的
  • C 向量/数组列表/链接列表

    我正在用 C 语言编写一个小程序 我需要一种向量 ArrayList LinkedList 但我正在使用 C 语言 知道如何在 C 语言中做这种事情吗 我想存储结构 然后添加 删除一些结构 对于可调整大小的数组 您可以使用malloc an
  • PostgreSQL 中的约束和断言

    我正在尝试创建一个简单的数据库 其中有一个客户数据表和一个订单数据表 我正在尝试编写一个约束 使客户在某一天订购的商品数量不能超过特定数量 这是我所拥有的 CREATE TABLE CUSTOMER CUSTOMER NUM CHAR 3
  • python 正则表达式:用单个子替换地址中的 st、and、the 等

    我有很多地址 例如 东 19 街 或 西 141 街 我想在一次 re sub 调用中删除 th 和 st re sub d st d nd d rd d th g lt 1 gt East 19th Street 不起作用 因为它并不总是
  • 当宏注释不能在定义它的同一编译中使用时,这意味着什么?

    我对这个说法很好奇 错误 3 18 另一种可能性是您尝试使用宏 定义它的同一编译运行中的注释 我尝试谷歌搜索并发现了这个 最后 请记住 使用宏需要分两步进行编译 首先编译宏 然后编译使用宏的代码 这是必要的 以便您的宏可以在编译其余代码之前
  • .Net 中值类型有什么用?

    The 官方指南 http msdn microsoft com en us library y23b5415 aspx表明这些的实际用途很少 有没有人有例子说明他们在哪里充分利用了它们 相反 您会发现 C C 人们涌向结构 又称值类型 一
  • 如何在 python 中对 POST 方法进行单元测试?

    我有一个方法可以将包含 JSON 的 POST 发送到 Elasticsearch 实例 我正在尝试编写一个单元测试来验证发送的 JSON 的内容 但我不确定如何进行 我应该在 python 中创建一个本地服务器并让它验证 POST 的内容