Python 如何在测试中使用 Mock

2023-12-19

Mock概念

mock 的意思是模拟,也就是模拟接口返回的信息,用已有的信息替换它需要返回的信息,从实现对所依赖的模块的测试。

一般有两种场景:

  • 前端对后端接口的 mock,
  • 后端服务之间的测试中涉及的mock,常常发生在单元测试的时候。

前端mock可以通过一些工具来完成:

  • 使用抓包工具Fiddler,Charles 来实现,通过修改代理返回的数据,实现多种场景的测试。
  • 使用一些API管理工具来模拟,比如yapi,Easy Mock 等
  • 当然有编码能力的,也可以使用node.js,python的fastAPI来模拟

后端的 Mock 则是从接口的角度,如果一个接口A返回的数据需要依赖于另一个接口B,当敏捷开发中B接口还未开发完全时候这里会需要用到 Mock。

对于测试人员,对接口测试的时候,部分接口尚未开发完成,在约定了接口定义之后,也可以使用 Mock 来模拟。

在 python3.X 中 Mock 模块已经被集成到unittest里面。

Mock类

class Mock(spec=None,side_effect=None,return_value=DEFAULT,name=None)

  • spec:定义Mock对象的属性值,可以是一个列表,字符串,一个对象的实例
  • side_effect:可以用来抛出异常或者动态改变返回值,可以覆盖return_value
  • return_value:定义mock的返回值
  • name:作为mock对象的标识可以在print时候看到

简单的例子体验下 Mock 的功能特点

1

2

3

4

5

6

7

from unittest import mock

def add(num1,num2):

return num1 + num2 # pass

add = mock.Mock(return_value = 200 ) # 创建mock对象

print ( add( 10 , 20 ) )

你会发现无论输入的参数是什么,输出结果都是200。等于方法被 Mock 拦截处理了。

一个相对正式的 Mock 例子

正常情况:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

import requests

def request_scm():

# res = requests.get('http://www.mysx-scm.com')

res = requests.get( 'http://baidu.com' )

return res.status_code

import unittest

from unittest import mock

class TestScmApi(unittest.TestCase):

def testUrl( self ):

# request_scm = mock.Mock(return_value=200)

self .assertEqual(request_scm(), 200 , msg = 'testUrl 出现错误' )

if __name__ = = '__main__' :

unittest.main()

可以分别把两个 # 注释移到下一句试试。

一个完整的测试例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

import requests

class scmapi():

def request_scm():

res = requests.get( 'http://www.mysx-scm.com' )

# res = requests.get('http://baidu.com')

return res.status_code

def pay_alipay():

'''

待实现

return 200

'''

return 0

import unittest

from unittest import mock

class TestScmApi(unittest.TestCase):

needmock = True

def setUpClass():

print ( "setUpClass():所有方法之前执行" )

def tearDownClass():

print ( "tearDownClass():所有方法之后执行" )

def setUp( self ):

self .scmapi = scmapi()

print ( "setUp():每个方法之前执行" )

def tearDown( self ):

print ( "teardown():每个方法之后执行" )

def test_request_scm( self ):

if self .needmock:

scmapi.request_scm = mock.Mock(return_value = 200 )

self .assertEqual(scmapi.request_scm(), 200 , msg = 'test_request_scm 出现错误' )

def test_pay_alipay( self ):

if self .needmock:

scmapi.pay_alipay = mock.Mock(return_value = 200 )

self .assertEqual(scmapi.pay_alipay(), 200 , msg = 'test_pay_alipay 出现错误' )

if __name__ = = '__main__' :

unittest.main()

断言方法

基本的断言方法提供了测试结果是True还是False。所有的断言方法都有一个msg参数,如果指定msg参数的值,则将该信息作为失败的错误信息返回。

序号 断言方法 断言描述
1 assertEqual(arg1, arg2, msg=None) 验证arg1=arg2,不等则fail
2 assertNotEqual(arg1, arg2, msg=None) 验证arg1 != arg2, 相等则fail
3 assertTrue(expr, msg=None) 验证expr是true,如果为false,则fail
4 assertFalse(expr,msg=None) 验证expr是false,如果为true,则fail
5 assertIs(arg1, arg2, msg=None) 验证arg1、arg2是同一个对象,不是则fail
6 assertIsNot(arg1, arg2, msg=None) 验证arg1、arg2不是同一个对象,是则fail
7 assertIsNone(expr, msg=None) 验证expr是None,不是则fail
8 assertIsNotNone(expr, msg=None) 验证expr不是None,是则fail
9 assertIn(arg1, arg2, msg=None) 验证arg1是arg2的子串,不是则fail
10 assertNotIn(arg1, arg2, msg=None) 验证arg1不是arg2的子串,是则fail
11 assertIsInstance(obj, cls, msg=None) 验证obj是cls的实例,不是则fail
12 assertNotIsInstance(obj, cls, msg=None) 验证obj不是cls的实例,是则fail
​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你! 【100%无套路免费领取】

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

Python 如何在测试中使用 Mock 的相关文章

随机推荐

  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • Java版工程行业管理系统源码-专业的工程管理软件- 工程项目各模块及其功能点清单

    鸿鹄工程项目管理系统 Spring Cloud Spring Boot Mybatis Vue ElementUI 前后端分离构建工程项目管理系统 项目背景 随着公司的快速发展 企业人员和经营规模不断壮大 为了提高工程管理效率 减轻劳动强度
  • Python编程:从入门到实践(基础知识)

    第一章 起步 计算机执行源程序的两种方式 编译 一次性执行源代码 生成目标代码 解释 随时需要执行源代码 源代码 采用某种编程语言编写的计算机程序 目标代码 计算机可执行 101010 编程语言分为两类 静态语言 使用编译执行的编程语言 C
  • DEVOPS 持续部署的例子:IMVU

    持续部署的例子 IMVU IMVU是一家社交娱乐公司 它的产品允许用户以一种3D阿凡达式的体验互相连接起来 本节内容改编自一位IMVU工程师所写的博客 IMVU采用了持续集成 开发人员尽早提交并经常提交 每次提交都触发测试套件的执行 IMV
  • 面向对象编程---基于java控制台的高校教材管理系统课设

    功能要求 1 实现出版社 教材类型的管理 2 实现教材的订购管理 3 实现教材的入库管理 4 创建规则 实现教材的书号必须满足以ISBN开头 后跟10个数字 比如ISBN7302120363 5 创建触发器 实现教材入库和出库时自动修改库存
  • 为什么云监控、云产品流量监控中的流量数据和DDoS防护的流量监控数据有差异?

    一般情况下 DDoS防护的流量监控数据大于您在云监控或具体云产品数据页面看到的流量数据 示例 假设您的ECS实例遭受了DDoS攻击 触发流量清洗 您收到DDoS原生防护基础版的清洗通知 触发清洗时的流量为2 5 Gbps 但是 您在云监控中
  • 总结 BurpSuite 插件 HaE 与 Authz 用法!!!

    HaE与Authz均为BurpSuite插件生态的一员 两者搭配可以避免 越权 未授权 两类漏洞的重复测试行为 适用于业务繁杂 系统模块功能多的场景 两个插件都可以在store里安装 安装完后 点击Filter Settings勾选Show
  • 【工作流Activiti】了解工作流

    1 什么是工作流 工作流 Workflow 就是通过计算机对业务流程自动化执行管理 它主要解决的是 使在多个参与者之间按照某种预定义的规则自动进行传递文档 信息或任务的过程 从而实现某个预期的业务目标 或者促使此目标的实现 通俗来讲 就是业
  • 【工作流Activiti】Activiti的使用

    1 数据库支持 Activiti 运行必须要有数据库的支持 支持的数据库有 mysql oracle postgres mssql db2 h2 2 Activiti环境 我们直接在当前项目 guigu oa parent做Activiti
  • python 基础

    Python 基础 部分信息参考 菜鸟教程 文章目录 Python 基础 介绍背景 环境搭建 下载 win下 Linux下
  • 超星学习通《大学生创新基础》 答案

    1 1 1 多选题 具有高创造性个体的人格特征是 ACBD A 独立性 B 自信 C 对复杂问题感兴趣 D 冒险精神 2 多选题 创新型人才的特点是 ABD A 具有创新精神和创新能力 B 个性灵活 开放 C 力求稳妥 拒绝冒险 D 精力充
  • 绝对干货!自动化测试PO设计模式的进阶实现(附源码),适合想提升编码能力的测试同学

    本文阅读的前提 同学们知道如何进行Selenium自动化测试并了解什么是PO设计模式 对于代码基础较弱的测试同学希望多读几次文章并上手操作 这篇文章看懂后 大家的编码能力就会进步了 代码哪里不懂欢迎留言 PO模式的设计问题 在前面的文章 无
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • SQL语句整理二--Mysql

    文章目录 知识点梳理 1 mysql 中 in 和 exists 区别 2 varchar 与 char 的区别
  • 有没有免费好用的进销存管理系统?

    有没有免费好用的进销存管理系统 要 好用 还要 免费 这样的进销存系统选型策略 到最后是 一箭双雕 还是 鱼与熊掌不可兼得 呢 让我们从好用和免费开始 慢慢分析 免费和好用能共存吗 怎么才算是好用的进销存系统 推荐一款好用的 订阅制付费的系
  • 第六章--- 实现微服务:匹配系统(下)

    0 写在前面 这一章终于完了 但是收尾工作真的好难呀QAQ 可能是我初学的缘故 有些JAVA方面的特性不是很清楚 只能依葫芦画瓢地模仿着用 特别是JAVA的注解 感觉好多但又不是很懂其中的原理 只知道要在某个时候用某个注解 我真是有够菜的
  • React中渲染html结构---dangerouslySetInnerHTML

    dangerouslySetInnerHTML 胡子 语法绑定的内容全部作为普通文本渲染 渲染html结构基于 dangerouslySetInnerHTML dangerouslySetInnerHTML 是 React 标签的一个属性
  • 漏洞复现-某友CRM系统某接口存在任意文件读取(附漏洞检测脚本)

    免责声明 文章中涉及的漏洞均已修复 敏感信息 均已做打码处理 文章仅做 经验分享 用途 切勿当真 未授权的攻击属于非法行为 文章中 敏感信息 均已做多层打马处理 传播 利用本文章所提供的信息而造成的任何直接或者间接的后果及损失 均由使用者本
  • 为啥都说信息安全缺人,但招聘时招安全的却不多?

    为什么会形成这样一个扭曲的状况 因为我们现在说 信息安全缺人 一般是指 缺口 很大 而不是指 需求 很大 比如某小型 云服务 供应商 一共也就大概几百台物理机器 每隔四五个月才喊人来手动升级一下系统 打打补丁 要是补丁打得不及时导致用户被黑
  • Python 如何在测试中使用 Mock

    Mock概念 mock 的意思是模拟 也就是模拟接口返回的信息 用已有的信息替换它需要返回的信息 从实现对所依赖的模块的测试 一般有两种场景 前端对后端接口的 mock 后端服务之间的测试中涉及的mock 常常发生在单元测试的时候 前端mo