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权 ...
随机推荐
- Windows server 2012 R2下安装sharepoint2013
• 安装windows server 2012 R2 系统,配置IP.系统打补丁,修改主机名.加域后重启.• 安装WEB服务器,勾选windows身份验证 • 安装应用程序服务器 • 安装.NET F ...
- Libev库学习
Libev库学习 https://www.cnblogs.com/wunaozai/p/3950249.html Libev库学习(1)https://www.cnblogs.com/wunaozai ...
- 《Linux》跟老男孩学Linux核心系统命令
一.命令行简介 1.1 Linux 命令行提示符介绍 [root@root_pc ~]# #<==这是超级管理员root用户对应的命令行 [oldboy@oldboy_pc ~]$ #<= ...
- Jenkins的语法之pipeline
如果不处理,pipeline:stages中任一stage失败,都会致使其以下stage都失败,那么处理方式为: 1.stage在可能出错的地方添加try catch语句 如:try{} catch( ...
- 【JUC】6.线程池—ThreadPoolExecutor
创建线程池可以分为三种方式: 1. 通过ThreadPoolExecutor的构造方法,创建ThreadPoolExecutor的对象,即一个线程池对象: 此构造方法,一共7个参数,5个必须参数,2个 ...
- 微信小程序 时间戳 转化为 日期格式
util.js : function transTime(unixtime) { var dateTime = new Date(parseInt(unixtime) * 1000) var yea ...
- Android笔记(五十三) 利用有道OPENAPI做简单的翻译demo
先去 http://fanyi.youdao.com/openapi?path=data-mode 申请开发者key 有道api会自动将申请的单词翻译并返回为xml或者json格式,我们所需要做的就是 ...
- 15.centos7基础学习与积累-001
1.从头开始积累centos7系统运用 大牛博客:https://blog.51cto.com/yangrong/p5 做到精通这个操作系统, 互联网常用服务器品牌: dell: 4u ...
- Python sorted 函数用法
1.背景 在python中,通常需要使用排序函数.而对字典针对一个键值进行排序会经常使用到.记录sorted 函数的键值排序用法. 2.代码 data 一个list,list 中的元素由字典组成 ...
- springboot学习笔记(一)
springboot案例(一) Application.java package com.xdr.spring; import org.springframework.boot.SpringAppli ...