Pytest权威教程07-Monkeypatching,对模块和环境进行Mock
Monkeypatching,对模块和环境进行Mock
有时,测试需要调用依赖于全局设置的函数,或调用无法轻松测试的代码(如网络访问)。 monkeypatch fixture可帮助你安全地设置/删除属性,字典项或环境变量,或修改sys.path以进行导入。 请参阅monkeypatch博客文章,了解一些介绍材料并讨论其动机。
简单示例如: 猴子补丁方法
如果你想阻止os.expanduser
返回某个目录,你可以在测试用例调用其之前,使用monkeypatch.setattr()
方法改造这个函数:
# test_module.py文件内容
import os.path
def getssh(): # 伪应用代码
return os.path.join(os.path.expanduser("~admin"),'.ssh')
def test_mytest(monkeypatch):
def mockreturn(path):
return '/abc'
monkeypatch.setattr(os.path,'expanduser',mockreturn)
x = getssh()
assert x == '/abc/.ssh'
这里在我们的测试用例中,使用猴子补丁改造了os.path.expanduser
, 然后再进行调用。 测试执行完成后对os.path.expanduser
修改将被撤消。
Monkeypatching 返回对象: 构建mock类
全局补丁示例如:阻止"requests"库的远程操作
如果要阻止"requests"库在所有测试中执行http请求,你可以执行以下操作:
# conftest.py文件内容
import pytest
@pytest.fixture(autouse=True)
def no_requests(monkeypatch):
monkeypatch.delattr("requests.sessions.Session.request")
每个测试用例执行时都会自动使用该fixture,它将删除测试用例内置属性中的request.session.Session.request
,以便在测试中任何使用requests库创建http请求的用例都将失败。
注意:
不建议使用猴子补丁改造Python内置函数,如open,compile等,因为它可能会破坏pytest的内部逻辑。 如果必须要使用,你可以通过参数:--tb = native
,- tables = plain
和--capture = no
来试试,不一定不会有问题。
注意:
改造stdlib
函数和pytest依赖的某些第三方库本身可能会破坏pytest,因此在这些情况下,建议使用MonkeyPatch.context()
来改造这些模块:
import functools
def test_partial(monkeypatch):
with monkeypatch.context() as m:
m.setattr(functools,"partial",3)
assert functools.partial == 3
查看#3290号bug详情
Monkeypatching 环境变量
Monkeypatching字典
参考API
查阅MonkeyPatch类相关文档。
Pytest权威教程07-Monkeypatching,对模块和环境进行Mock的更多相关文章
- Pytest权威教程21-API参考-03-夹具(Fixtures)
目录 夹具(Fixtures) @ pytest.fixture config.cache的 capsys capsysbinary capfd capfdbinary doctest_namespa ...
- Pytest权威教程19-编写钩子(Hooks)方法函数
目录 编写钩子(Hooks)函数 钩子函数验证和执行 firstresult: 遇到第一个有效(非None)结果返回 hookwrapper:在其他钩子函数周围执行 钩子(Hooks)函数排序/调用示 ...
- Pytest权威教程(官方教程翻译)
Pytest权威教程01-安装及入门 Pytest权威教程02-Pytest 使用及调用方法 Pytest权威教程03-原有TestSuite的执行方法 Pytest权威教程04-断言的编写和报告 P ...
- Pytest权威教程25-配置
目录 配置 命令行选项和配置文件设置 初始化:确定ROOTDIR和INIFILE 寻找rootdir 如何更改命令行选项默认值 内置的配置文件选项 返回: Pytest权威教程 配置 命令行选项和配置 ...
- Pytest权威教程24-Pytest导入机制及系统路径
目录 Pytest导入机制和sys.path/PYTHONPATH 包中的测试脚本及conftest.py文件 独立测试模块及conftest.py文件 调用通过python -m pytest调用p ...
- Pytest权威教程21-API参考-07-配置选项(Configuration Options)
目录 配置选项(Configuration Options) addopts cache_dir confcutdir console_output_style doctest_encoding do ...
- Pytest权威教程21-API参考-06-变量及异常
目录 特殊变量(Special Variables) collect_ignore collect_ignore_glob pytest_plugins pytest_mark PYTEST_DONT ...
- Pytest权威教程21-API参考-05-对象(Objects)
目录 对象(Objects) CallInfo Class Collector Config ExceptionInfo FixtureDef FSCollector Function Item Ma ...
- Pytest权威教程21-API参考-04-钩子(Hooks)
目录 钩子(Hooks) 引导时的Hook方法 初始化时的Hook方法 测试运行时的Hook方法 收集用例时的Hook方法 生成测试结果时的Hook方法 调试/交互Hook方法 返回: Pytest权 ...
随机推荐
- NEST 字符串sort
text字符串sort会先分词.可先建立filed字段.并设置为keyword mapping public void Mapping() { var response = client.IndexE ...
- Ruby开发小记
基础点 1.log打印 puts "Hello!" 2.拼接字符 value1 = "today" value2 = "#{value1} is Th ...
- 【方法】list<?> 两个list集合 查找不同元素,求差值
//方法1 //自己声明list//思路,从list1中删除list2中相同的元素//使用循环遍历对比的方式删除//list1包含list2,list1多与list2//结束得出list1为不相同元素 ...
- 网络时间同步服务和chrony
时间同步和chrony 时间同步:多主机协作工作时,各个主机时间同步很重要,时间不一致会造成很多重要应用的故障,如:加密协议,日志,集群等, 利用NTP(Network Time Protocol) ...
- UIP和lwip的区别 转载
uIP是专门为8位和16位控制器设计的一个非常小的TCP/IP栈.完全用C编写,因此可移植到各种不同的结构和操作系统上,一个编译过的栈可以在几KB ROM或几百字节RAM中运行.uIP中还包括一个HT ...
- 基于STM8的IIC协议--实例篇--时钟模块(DS3231)读取
1. 综述 由上篇博客可知道IIC协议如何用代码实现,本篇博客就不涉及协议内容,只讲解如何使用. 本次的实验传感为:DS3231(时钟模块),对于时钟模块的具体信息我也就不多介绍,大家可以自行度娘,具 ...
- git修改提交历史中的author信息
当次提交 当次的提交显示指定提交者信息: git commit -m "Initial commit" --author="mn <mn@furzoom.com&g ...
- Spring4- 04-Spring简易整合Mybatis -导入jar包/ 正常编写pojo/ 编写spring 配置文件
笔记要点&出错分析与总结 POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,工程组织 (AirportService为机场 ...
- 忘记 MySQL 的 root 帐号密码该怎么办
如果你忘了 MySQL 的 root 帐号密码,别担心,使用下面步骤就可以重设一个新密码: 首先停止 MySQL 服务 “/etc/init.d/mysql stop” 启动 MySQL 服务并屏蔽用 ...
- 关于devexpress报表XtraReport,动态修改报表样式(.repx格式),动态添加数据并使用的理解
一.基本概念: XtraReports 中的每个报表都由 XtraRepot 类的一个实例表示,或者由该类的子类来表示(这种情况更常见). 因此,每个报表都作为带区的容器使用,而每个带区中都包含报表控 ...