使用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进程达 ...
随机推荐
- 西门子S7-300 PLC视频教程(百度网盘)收集于网络-供参考学习
百度网盘地址: 西门子300 PLC视频教程 群文件里面可以找到. 下载: https://blog.csdn.net/txwtech/article/details/93016190
- 安卓开发,Service 服务
Service 服务 是一种应用组件,可长时间后台运行,不提供用户界面.如音乐播放器/下载程序.不能自己运行. 使用Service的方式: (一)startService(): 调用者和服务之间没有联 ...
- Redis安装过程jemalloc/jemalloc.h报错
问题: [root@localhost redis-3.0.0]# make cd src && make all make[1]: Entering directory `/data ...
- Docker(一)Docker概述
Docker概述 概述 Docker是供开发人员和系统管理员 使用容器构建,运行和共享应用程序的平台.使用容器来部署应用程序称为容器化.容器不是新的,但用于轻松部署应用程序的容器却是新的. 容器化越来 ...
- java8 Optional 类
package jdk180reduce; import java.util.ArrayList; import java.util.HashMap; import java.util.List; i ...
- ES7.x客户端的认证创建一步一步来
前言 好久没来写博客了,还是简单的记录一下吧.今天要写的是es在7.x版本后的客户端的创建以及一些es的查询所语句到的小问题.直接先吧客户端端的代码呈上. 正文 public class ESClie ...
- Flask03-Form
## Web 表单 配置 为了能够处理 web 表单,我们将使用 Flask-WTF ,该扩展封装了 WTForms 并且恰当地集成进 Flask 中. 许多 Flask 扩展需要大量的配置,因此我们 ...
- 为什么 group by后面 必须跟selecte 后面的除了聚集函数外的所有字段
如:SELECT store_name, SUM(Sales) FROM Store_Information GROUP BY store_name 可以而SELECT store_name, add ...
- 实战技巧,Vue原来还可以这样写
hookEvent,原来可以这样监听组件生命周期 1. 内部监听生命周期函数 <template> <div class="echarts"></di ...
- python中 _、__、__xx__() 区别及使用场景
1.访问权限(private.public)与继承方式(只有public继承) 在面向对象编程语言中,类的属性与方法都会设置访问控制权限,从而满足我们的设计需求.一般而言,我们通常会将对象的属性设置为 ...