python第三方库系列之十九--python測试使用的mock库

发布时间:2026/9/29 12:14:45

python第三方库系列之十九--python測试使用的mock库 一、为什么要使用mock, 这是很多人心中存在的疑问。在编写代码的时候, 要假想系统里面存在着特别多的外部依赖情形, 咱们不需要, 也不乐意把所有的程序模块都跑一遍。打个简单的比方说,如果是要去验证分享文章到微博的那个功能效果, 那么在每次执行测试任务的时候, 如果非得要去真实地调用那个接口一次, 这样做的话, 不仅办事效率非常低下, 还会制造出来非常多的无用数据, 并且还会因为外部环境里的各种不确定因素而致使测试结果失败。对于有些耗时更久, 或者无法简单创建测试环境的系统来说, 真实的测试就显得更没有必要了。我们仅仅只需要知道, 代码是按照预期的逻辑去运行的, 并且同时也调用了那些需要调用的外部接口。还是以分享到微博这个功能作为举例来说明一下情况, 那么关于分享部分的伪码可能会呈现出这样一种具体的状态:def share():Share system generated message to weibo.msg generate_msg()weibo get_weibo_client(user_id)weibo.upload(msg)我们可以假定存在这样一种技术手段, 当需要对上述代码进行测量的时候, 它能够让全体的代码都得到执行。可是这里有个前提, 就是并不会真正地去运行 weibo.(msg) 这个操作。与此同时, 系统还能够清楚地统计出每一个函数究竟被调用了几次, 以及每一次被执行的时候所传入的参数到底长什么样。这样一来, 我们编写测试案例的工作就会变得轻松许多了。所谓的中mock, 其实就是指在软件测试的过程之中, 用来模拟外部服务的一种手段。通常在下述这些具体的应用场景里, 会需要去使用到mock。a.在进行数据库操作的时候, 实际上是没有必要的去每一次都去执行读写数据库这一行为。b.HTTP 这个请求, 它在进行网络运作的时候, 那个过程会消耗非常多的时间, 所以说在咱们进行测试工作的时候, 还得去依靠那些外部的服务才可以。c.外部命令就是那种能够去运行系统命令的操作, 具体的例子可以是文件操作, 也可以是进程操作等等。二、mock的基本原理上面也已经提到过了, mock的作用是用来替换代码中所涉及的外部服务。因为属于动态类型的编程语言, 其中的所有元素全部都是对象的形式存在, 所以在程序正式运行之前, 需要将相应的实例、方法、函数以及变量进行整体的替换操作举个例子来说。 import os def myremove(filename): return filename os.remove myremove print os.remove(test-file)test-file以上所给出的那个例子, 是说明这一概念时最简单的情况。假若把相关的代码改动为使用一个叫做Mock的类来处理的话。那么当这个类里面的方法在真正被调用并且执行复写操作的时候。它是可以依据那些传入进来的参数来决定自己应该去做出怎样的行为的。而且它还具备能够记录每一次调用的能力。通过这种方式。你就能够对Mock究竟做了些什么工作有一个大致的了解吧。三、mock的使用1如何对某一个函数实行模拟操作呢?from mock import MockmyMethod Mock()myMethod.return_value 3myMethod(1, a, foobar)myMethod.assert_called_with(1, a, foobar) # TruemyMethod()myMethod.call_count # 2想要模拟出一个函数, 直接使用那个 mock.Mock 的实例就可以了, 你能够在初始化的时候设定好返回值, 比如说把它等于 Mock 并且括号里面写个等于三也行, 当然你也能够通过点那个属性的方式来设置也是可以的。除了, 你还能够mock , 它是一个函数或者是异常在mock 的对象被调用的时候, 它是会用参參一样的参数来被调用。myMethod Mock(side_effectKeyError(whatever))myMethod()Traceback (most recent call last):...KeyError: whatever上面所展示的这个样例, 本质上就是在模拟一个异常情况的发生。如果该功能是以函数的形式来呈现的, 那么这个特定的函数就会被进行调用。这种机制的存在, 使得我们在实际操作中能够获得一种能力, 也就是能够通过这种方式, 针对返回数值这一环节来进行动态层面的生成处理。下面这个样例是用来模拟实现一个函数, 这个函数能够返回输入进去的那个字符串的长度是多少。def side_effect(str):return len(str)myMethod Mock(side_effectside_effect)myMethod(sd) # 2在它存在的时候。mock还分别提供了以下这些种类的语句:ith2究竟该以怎样的一种方式来对一个类里的方法实施模拟, 这是很多人常常会产生疑问的问题。如果想要对某个类里面的指定方法进行模拟操作的话, 那么可以使用通过mock所提供的这个叫做patch的方法。import mockimport Module1mock.patch.object(Module1.Class1, some_method)def test(mock_method):mock_method.return_value 3mock_method.side_effect some_side_effectm Module1.Class1()m.some_method(*args, **kwargs)assert m.some_method is mock_methodm.some_method.assert_called_with(*args, **kwargs)3应该用什么方式来对一个类进行模拟操作呢?有的时刻可能需要去模拟一个函数啊亦或是一个类的具体行为, 这个范围是包括进去它的全部属性与全部方法的, 如果说采用手动去一个一个地加入这些内容的话, 那确实是太低的效率了而且特别地容易出错, mock这个技术提供了相关的功能来应对这种情况, 它是依据所提供的那个模板类而生成出来了一个所谓的mock实例。这属于一个用来模拟某个函数的具体实例。import mockdef myFunc(a, b, c):pass mock_func mock.create_autospec(myFunc, return_value3) mock_func(1,2,3) mock_func.assert_called_with(1,2,3) mock_func(a string)Traceback (most recent call last):...TypeError: () takes exactly 3 arguments (1 given)模拟出来一个类, 这个类别和它的是完全相同: mock_class mock.create_autospec(myClass)4在平常使用的时候, 其所采用的具体操作方法是怎样的。这里使用的是返回值等于3, 其作用是来模拟.post网络交互的返回值。这样就省去了真实的网络交互。当然, 也能够用一个方法的返回值来代替3这个返回值。import jsonimport mockfrom django.test import TestCaseclass ApiTest(TestCase):mock.patch(apps.agent.requests.post)def test(self, mock_method):mock_method.return_value 3mock_method.side_effect some_side_effectres self.client.post(/url/to/post)r json.loads(res.content)self.assertEqual(0, r[retval])
延伸阅读

更多相关文章

2026/9/29 12:14:45

深圳电子设备外壳来样定制,样品和图纸哪个更影响最终精度?

深圳市兄弟嘉诚科技有限公司,是深圳本地深耕金属外壳定制领域十余年的生产型厂家,围绕电子设备外壳的加工适配需求,覆盖铝型材外壳定制、钣金机箱定制、CNC外壳加工、非标机箱外壳定制等全品类服务,核心定位是为各类电子设备厂商提…

2026/9/29 12:14:45

机箱外壳加工出现返工,往往是前期忽略哪几个接口设计问题?

电子设备机箱外壳加工行业基础梳理机箱外壳是电子设备的基础结构件,不仅承担着保护内部线路板、接口、元器件的基础作用,还直接影响散热性能、防护等级和整机装配效率,接口设计作为机箱外壳和内部元器件对接的核心环节,一旦前期考…

2026/9/29 12:59:48

Unity大图切割指南:用Texture2D.GetPixels批量导出PNG与Sprite

简介:一份面向 Unity 开发者与初学者的图像切割与导出教程资源,解决将 Sprite 图集按规则切成多张小图并批量保存为 PNG 的实际需求。内容以单个 docx 文档封装,仅 133KB,轻量易读,重点梳理了 Unity 图像导入、纹理类型…

2026/9/29 12:59:48

面试题:二叉树的遍历及使用场景

1. 面试题:二叉树的前序、中序、后序遍历分别是什么? 核心思路(一句话) “前、中、后”描述的是根节点访问时机:前序是“根左右”,中序是“左根右”,后序是“左右根”。 解决方案流程图 遍历二叉…

2026/9/29 12:59:48

面试题:页面上的 CSS 样式不生效,你会怎么调试?

一、面试题:页面上的 CSS 样式不生效,你会怎么调试? 1. 核心思路(一句话) 先看 Styles 判断“规则有没有匹配/被覆盖”,再看 Computed 判断“最终到底算成了什么”,最后根据原因检查层叠、继承、…

2026/9/29 12:54:48

ffmpeg安装与实战:从环境变量配置到视频处理命令详解

简介:面向Linux用户的ffmpeg安装教程资源,以docx文档形式呈现,内容涵盖依赖包安装、编解码器配置、ffmpeg编译与常见故障排除。资源共1个文件,大小18KB,便于快速浏览与对照操作,适合需要搭建音视频处理环境…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 0:04:04

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:04:04

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑