使用Python来写mock代码(桩代码)-其实很简单

1.Mock基本用法
- 使用Mock能创建你能访问(模拟)的属性和方法
- 指定类或者函数的返回值和断言方式
创建handle_mock_01.py文件
# 1. 导入mock模块
from unittest import mock class Payment(object):
"""
创建支付类
"""
pass payment = Payment()
# 2. 创建Mock对象, 作为Payment的实例方法
payment.pay = mock.Mock(return_value="Success")
# 3. 当调用pay方法时, 会返回定义Mock对象时指定的return_value值
print(payment.pay())
2.不同的参数返回不同的值

创建handle_mock_02.py文件
# 1. 导入mock模块
from unittest import mock class Payment(object):
"""
创建支付类
"""
pass def parameter_return_data(param):
"""定义参数与返回值映射函数
"""
param_data = {
"用户ID1": "支付成功",
"用户ID2": "支付异常",
"用户ID3": "支付超时",
"用户ID4": KeyError("参数有误"), # 可以返回异常 }
return param_data[param] payment = Payment()
# 2. 创建Mock对象, 作为Payment的实例方法
payment.pay = mock.Mock(side_effect=parameter_return_data)
# 3. 当调用pay方法时, 会返回指定的值
print(payment.pay("用户ID1")) # 返回结果: 支付成功
print(payment.pay("用户ID2")) # 返回结果: 支付异常
print(payment.pay("用户ID3")) # 返回结果: 支付超时
print(payment.pay("用户ID4")) # 返回结果: '参数有误'
3.传参个数
创建handle_mock_03.py文件
# 1. 导入mock模块
from unittest import mock class Payment(object):
"""
创建支付类
"""
pass def fn(a, b):
"""假设实际pay函数, 有两个参数"""
pass payment = Payment()
# 2. 创建Mock对象, 作为Payment的实例方法
payment.pay = mock.create_autospec(fn, return_value="支付成功")
# 3. 当调用pay方法时, 传参数的个数如果不为两个, 则会抛出异常
print(payment.pay("用户ID1", "卡号")) # 返回结果: 支付成功
print(payment.pay("用户ID1")) # 返回结果: TypeError: missing a required argument: 'b'
4.断言方式
创建handle_mock_04.py文件
# 1. 导入mock模块
from unittest import mock class Payment(object):
"""
创建支付类
"""
pass def parameter_return_data(param):
"""定义参数与返回值映射函数
"""
param_data = {
"用户ID1": "支付成功",
"用户ID2": "支付异常",
"用户ID3": "支付超时",
"用户ID4": KeyError("参数有误"), # 可以返回异常 }
return param_data[param] payment = Payment()
# 2. 创建Mock对象, 作为Payment的实例方法
payment.pay = mock.Mock(side_effect=parameter_return_data)
# 3. 当调用pay方法时, 会返回指定的值
# 4. 不同的断言方式
# a. assert_called() mock方法至少调用一次
# 如果还未调用, 则返回 AssertionError: Expected 'None' to have been called.
# 如果已经调用, 则返回None
print(payment.pay("用户ID1")) # 返回结果: 支付成功
# print(payment.pay.assert_called()) # 返回结果: None # b. assert_called_once() mock方法只调用一次
# 如果调用超过一次则返回 AssertionError: Expected 'None' to have been called.
# 否则返回None
print(payment.pay.assert_called_once()) # 返回结果: None # c. assert_called_with() 断言mock方法已经携带某个参数调用了
# 如果没有携带某个参数调用, 那么会断言失败
print(payment.pay.assert_called_with("用户ID1")) # 返回结果: None # d. assert_called_once_with() 断言mock方法已经携带某个参数调用了一次
# 如果没有携带某个参数调用一次的话, 那么会断言失败
print(payment.pay.assert_called_once_with("用户ID1")) # 返回结果: None # e. assert_any_call() 有携带参数(有即可)调用过 # f. assert_not_called() 断言mock方法从未调用过
二、总结

- 本文介绍了Python处理Mock的常用操作
- 对于使用Python写mock代码有帮助
- 本文为原创, 如需转载请联系本人。有不足之处, 欢迎指点!
如果对python自动化测试、web自动化、接口自动化、移动端自动化、大型互联网架构技术、面试经验交流等等感兴趣的老铁们,可以关注我。我会不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。欢迎分享,欢迎评论,欢迎转发。需要资料的同学可以关注我的微头条获取资料链接。
使用Python来写mock代码(桩代码)-其实很简单的更多相关文章
- 写一个程序,统计自己C语言共写了多少行代码,Github基本操作
前言 在上一篇博客中,本人提到了自己的文件操作可以说是几乎没用过.现在想想,这也算是只在OJ上做题的一个弊端吧.虽然通过OJ做题是一个学习代码好手段,但其他方面也要多多涉猎才好,而不是说OJ用不到文件 ...
- 用python & bat写软件安装脚本 + HM NIS Edit自动生成软件安装脚本
2019-03-11更新:原来NSIS脚本也可以禁用64位文件操作重定向的! 1.在安装脚本的开始处定义 LIBRARY_X64. !include "MUI.nsh"!inclu ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- 【转】利用Python中的mock库对Python代码进行模拟测试
出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...
- python实现统计你一共写了多少行代码
程序员要保证一定的代码量就必须勤奋的敲代码,但怎么知道自己一共写了多少代码呢,笔者用python写了个简单的脚本,遍历所有的.java,.cpp,.c文件的行数,但是正如大家所知,java生成了许多代 ...
- (转)Python新手写出漂亮的爬虫代码2——从json获取信息
https://blog.csdn.net/weixin_36604953/article/details/78592943 Python新手写出漂亮的爬虫代码2——从json获取信息好久没有写关于爬 ...
- (转)Python新手写出漂亮的爬虫代码1——从html获取信息
https://blog.csdn.net/weixin_36604953/article/details/78156605 Python新手写出漂亮的爬虫代码1初到大数据学习圈子的同学可能对爬虫都有 ...
- Python写出LSTM-RNN的代码
0. 前言 本文翻译自博客: iamtrask.github.io ,这次翻译已经获得trask本人的同意与支持,在此特别感谢trask.本文属于作者一边学习一边翻译的作品,所以在用词.理论方面难免会 ...
- python怎么写可读性好的面向过程的长篇代码?
最近接受老代码,mmp的,说是重新运行运行起来,那还不如重写呢,因为有很多毛病,不能直接运行,pep8就不用妄想奢望了,还有包括语法错误问题和内存严重泄露的问题(运行几分钟后python.exe进程达 ...
随机推荐
- Homebrew命令总结
brew又叫homebrew,是macos上的一个包管理工具,能够在mac中方便的进行包管理,类似于ubuntu系统下的apt-get,记得自己第一次接触brew是为了在mac上安装一个独立绿色的视频 ...
- 【JMeter_22】JMeter逻辑控制器__录制控制器<Recording Controller>
录制控制器<Recording Controller> 个人感觉录制的脚本缺陷太明显,没有研究过,暂不做介绍,等后续空了研究后再写
- cocos2dx 启用cjson
在appDelegate.cpp文件中添加 #if __cplusplus extern "C" { // 加入此代码的目的,防止污染引擎的scripting目录 #include ...
- SLS编写规范
SLS编写规范 规范要点说明 首先,状态的执行不可回滚,执行完了就是执行完了,并不会中断回滚,其次,状态的执行,可以反复执行,也就是说一个状态文件,可以多次来进行调用. 在编写状态文件过程中,有以下几 ...
- Java基础-Java中transient有什么用-序列化有那几种方式
此文转载于知乎的一篇文章,看着写的非常全面,分享给大家. 先解释下什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术. Java序列化 ...
- SSL/TSL 原理( 握手原理和传输原理)
本文参考<计算机网络 自顶向下方法> 目录 背景 通信的4要素 SSL/TLS in Detail 通讯保证 The Handshake Protocol 1. Initial Clien ...
- 《Elasticsearch 权威指南》阅读笔记
书籍地址 https://www.elastic.co/guide/cn/elasticsearch/guide/current/languages.html
- Python实用笔记 (11)高级特性——迭代器
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable. 可以使用isinstance()判断一个对象是否是Iterable对象: >>> from collectio ...
- 如何查看docker run启动参数命令
通过runlike去查看一个容器的docker run启动参数 安装pip yum install -y python-pip 安装runlike pip install runlike 查看dock ...
- HTTPS加密协议详解(一):HTTPS基础知识
转自:https://blog.csdn.net/hherima/article/details/52469267------------------------------专栏导航:-------- ...