mock是辅助单元测试的一个模块。它允许您用模拟对象替换您的系统的部分,并对它们已使用的方式进行断言。

mock在python3中已经被集成到了unittest单元测试框架中,所以,可以直接使用。

mock作用

1. 解决依赖问题:当我们测试一个接口或者功能模块的时候,如果这个接口或者功能模块依赖其他接口或其他模块,那么如果所依赖的接口或功能模块未开发完毕,那么我们就可以

使用mock模拟被依赖接口,完成目标接口的测试

2. 单元测试:如果某个功能未开发完成,我们又要进行测试用例的代码编写,我们也可以先模拟这个功能进行测试

3. 模拟复杂业务的接口:实际工作中如果我们在测试一个接口功能时,如果这个接口依赖一个非常复杂的接口业务,那么我们完全可以使用mock来模拟这个复杂的业务接口,其实这个和解决接口依赖是一样的原理。

4.前后端联调:如果你是一个前端页面开发,现在需要开发一个功能:根据后台返回的状态展示不同的页面,那么你就需要调用后台的接口,但是后台接口还未开发完成,是不是你就停止这部分工作呢?答案是否定的,你完全可以借助mock来模拟后台这个接口返回你想要的数据

实例:

# mock_modular.py

import requests

class PayApi():

    @staticmethod
def auth(card, money):
'''
第三方支付接口
:param card: 卡号
:param money: 支付金额
:return:
'''
pay_url = "http://www.payapi.com"
data = {
"card": card,
"money": money
}
response = requests.post(url=pay_url, data=data)
return response def pay(self, userId, card, money):
'''
我们自己的支付接口
:param userId: 用户id
:param card: 卡号
:param money: 支付金额
:return:
'''
# 调用第三方支付接口
response = self.auth(card, money)
try:
if response['status_code'] == "":
print("用户{}支付金额{}成功" .format(userId, money))
return "支付成功"
elif response['status_code'] == "":
print("用户{}支付失败,金额不变".format(userId))
return "支付失败"
else:
return "未知错误"
except Exception:
return "Error, 服务器异常!" if __name__ == "__main__":
pass
# modular.py

import unittest
from unittest import mock
from mock_modular import PayApi class TestPayApi(unittest.TestCase): def setUp(self):
self.pay = PayApi() def test_success(self):
# pay = PayApi()
     # mock.Mock定义要模拟的函数,return_value定义模拟函数的返回值
self.pay.auth = mock.Mock(return_value={"status_code": ""})
status = self.pay.pay('', '', "")
     # 增加断言,检查返回值是否正确
self.assertEqual(status, "支付成功") def test_fail(self):
# pay = PayApi()
self.pay.auth = mock.Mock(return_value={"status_code": ""})
status = self.pay.pay("", '', "")
self.assertEqual(status, "支付失败") def test_error(self):
# pay = PayApi()
self.pay.auth = mock.Mock(return_value={"status_code": ""})
status = self.pay.pay("", '', '')
self.assertEqual(status, "未知错误") def test_exception(self):
# pay = PayApi()
self.pay.auth = mock.Mock(return_value="")
status = self.pay.pay("", "", "")
self.assertEqual(status, "Error, 服务器异常!") '''
   # mock.patch(模块名.类名.函数名)指明了将要模拟的函数
@mock.patch("modular.PayApi.auth")
def test_success(self, mock_payapi):
mock_payapi.return_value={"status_code": "200"}
pay = PayApi()
status = pay.pay('10000', '123456', "10000")
self.assertEqual(status, "支付成功") @mock.patch("modular.PayApi.auth")
def test_fail(self, mock_payapi):
pay = PayApi()
mock_payapi.return_value={"status_code": "500"}
status = pay.pay("10001", '1234567', "20000")
self.assertEqual(status, "支付失败")
''' if __name__ == "__main__":
unittest.main()

运行modular.py,结果如下:

Ran 4 tests in 0.002s

OK
用户10001支付失败,金额不变
用户10000支付金额10000成功 Process finished with exit code 0

参考:https://www.cnblogs.com/linuxchao/p/linuxchao-mock.html

python中使用mock模块返回数据的更多相关文章

  1. 使用Python中的mock模块进行单元测试

    在进行单元测试的时候,有时候会遇到这种情况: 出于某些原因,我们不想测试某一部分内容,但是我们想要测试的部分却依赖这部分内容. 这时候,可以使用mock模块来模拟调用这部分内容,并给出返回结果,举例如 ...

  2. 浅析Python中的struct模块

    最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,在这里做一下简单的总结. 了解c语言 ...

  3. python中的StringIO模块

    python中的StringIO模块 标签:python StringIO 此模块主要用于在内存缓冲区中读写数据.模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中.此类中的大部分 ...

  4. python中的select模块

    介绍: Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqu ...

  5. Python中的re模块--正则表达式

    Python中的re模块--正则表达式 使用match从字符串开头匹配 以匹配国内手机号为例,通常手机号为11位,以1开头.大概是这样13509094747,(这个号码是我随便写的,请不要拨打),我们 ...

  6. python中的shutil模块

    目录 python中的shutil模块 目录和文件操作 归档操作 python中的shutil模块 shutil模块对文件和文件集合提供了许多高级操作,特别是提供了支持文件复制和删除的函数. 目录和文 ...

  7. 【转】浅析Python中的struct模块

    [转]浅析Python中的struct模块 最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概 ...

  8. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  9. 深入理解python中的select模块

    简介 Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kque ...

随机推荐

  1. JavaScript 使用yrm修改镜像源

    安装yrm npm install -g yrm 列出当前可用的镜像源 # yrm ls npm ----- https://registry.npmjs.org/ cnpm ---- http:// ...

  2. python新添加excel数据

    相关库 import os import xlwt from xlrd import open_workbook from xlutils.copy import copy 1.判断是否存在xls文件 ...

  3. jQuery的小测试

    1.在div元素中,包含了一个<span>元素,通过has选择器获取<div>元素中的<span>元素的语法是? $('div:has(span)'); 2.在&l ...

  4. ubuntu 绝望事件

    @ubuntu.com hi!大家好,早上发生了很有意思的事情 显示器分辨率(x2) 系统 2560x1440 Ubuntu 20.04.1 LTS 上面的表格是现在的环境 开机进入锁屏页面,正常显示 ...

  5. C++ 不具有继承关系的类之间的显式,隐式转换 2013-07-11 15:41

    好久没有写blog了,今天在学习c#的时候看到某一章节 讲类的隐式与显式转换.特此留笔,以供后续参考之用. 关于显式,隐式转换有些争论,说什么不建议隐式转换.但是个人认为非必要,如果有良好的基础书写基 ...

  6. vue 父子之间传值

    1:父组件 子组件 子组件利用 props 接收父级传过来的数值.子组件选中的数值返回父亲当中利用 钩子函数 $emit('函数名',传过去的数值)  

  7. SpringMVC+Spring+mybatis+maven+搭建多模块框架前后端分离开发框架的完整demo,拿走不谢。——猿实战02

            猿实战是一个原创系列文章,通过实战的方式,采用前后端分离的技术结合SpringMVC Spring Mybatis,手把手教你撸一个完整的电商系统,跟着教程走下来,变身猿人找到工作不是 ...

  8. java反序列化——XMLDecoder反序列化漏洞

    本文首发于“合天智汇”公众号 作者:Fortheone 前言 最近学习java反序列化学到了weblogic部分,weblogic之前的两个反序列化漏洞不涉及T3协议之类的,只是涉及到了XMLDeco ...

  9. python爬虫用drony转发进行抓包转发

    转载至https://www.cnblogs.com/lulianqi/p/11380794.html#l_2 实际操作步骤(Android) 笔者这里直接使用上面提到第3种方法(方法1在对于手机AP ...

  10. go module 获取码云私有仓库代码

    因为码云免费组织有5人限制,其他人想获得代码 只能通过别的方式 go mod 底层使用的git 获取代码, 所以首先解决如何通过git clone代码 思路为通过ssh密钥的方式获取 首先在码云仓库部 ...