python中使用mock模块返回数据
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模块返回数据的更多相关文章
- 使用Python中的mock模块进行单元测试
在进行单元测试的时候,有时候会遇到这种情况: 出于某些原因,我们不想测试某一部分内容,但是我们想要测试的部分却依赖这部分内容. 这时候,可以使用mock模块来模拟调用这部分内容,并给出返回结果,举例如 ...
- 浅析Python中的struct模块
最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,在这里做一下简单的总结. 了解c语言 ...
- python中的StringIO模块
python中的StringIO模块 标签:python StringIO 此模块主要用于在内存缓冲区中读写数据.模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中.此类中的大部分 ...
- python中的select模块
介绍: Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqu ...
- Python中的re模块--正则表达式
Python中的re模块--正则表达式 使用match从字符串开头匹配 以匹配国内手机号为例,通常手机号为11位,以1开头.大概是这样13509094747,(这个号码是我随便写的,请不要拨打),我们 ...
- python中的shutil模块
目录 python中的shutil模块 目录和文件操作 归档操作 python中的shutil模块 shutil模块对文件和文件集合提供了许多高级操作,特别是提供了支持文件复制和删除的函数. 目录和文 ...
- 【转】浅析Python中的struct模块
[转]浅析Python中的struct模块 最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概 ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- 深入理解python中的select模块
简介 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kque ...
随机推荐
- 实验室外的攻防战 UOJ#180 [树状数组]
实验室外的攻防战 UOJ#180 [树状数组] 题目 时针指向午夜十二点,约定的日子--2月28日终于到来了.随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 \(picks\) 博士所在的实验室 ...
- troubleshoot之:使用JFR分析性能问题
目录 简介 GC性能事件 同步性能 IO性能 代码执行的性能 其他有用的event 简介 java程序的性能问题分析是一个很困难的问题.尤其是对于一个非常复杂的程序来说,分析起来更是头疼. 还好JVM ...
- Vue.js中传值给子部件及触发动作的问题
最近研究一个用vue.js做的程序并修改增加功能.其中用到传值给子部件等问题. template中有个子部件: <template> ...... <child-form v-if ...
- Java多线程_缓存对齐
1.什么是缓存对齐 当前的电脑中,数据存储在磁盘上,可以断电保存,但是读取效率较低.不断电的情况下,数据可以在内存中存储,相对硬盘效率差不多是磁盘的一万倍左右.但是运算时,速度最快的是直接缓存在CPU ...
- DFS【搜索1】
DFS模板 void dfs(int depth)//depth表示当前的层数(或深度) { if(depth>n)//到达叶子节点,该路已走到尽头 return; for(int i=;i&l ...
- linux 查找删除
find -name "*.php" -exec rm -f '{}' \;
- lombook插件的说明
lombok是一个可以帮助我们简化java代码编写的工具类,尤其是简化javabean的编写,即通过采用注解的方式,消除代码中的构造方法,getter/setter等代码,使我们写的类更加简洁,当然, ...
- wordpress建站如何用SMTP配置邮件通知
前提条件:你已经有了企业邮箱,相关文章请看:如何开通阿里云企业邮箱免费版(点此前往) 不建议使用主机商提供的邮箱,因为换主机商是比较常见的事情,因此导致的邮箱迁移就有些麻烦了,不如一开始就选择独立的第 ...
- [状压DP]P1441 题解 砝码称重
前置知识:状压DP 洛谷传送门 emm....看到题目,我第一个想到的就是枚举.暴力大法好! 具体怎么枚举?当然是子集枚举啦!枚举出每一个可能的砝码选择方案.对于每一个合法的(也就是选取数量等于\(n ...
- VS Code安装yo(Yeoman) 插件下载.net core 模版代码开发
在安装插件以前,请看插件地址的相关依赖 Pre-requirements [Node.js] (https://nodejs.org) [npm] (https://www.npmjs.com) [Y ...