返回: Pytest权威教程

返回: Pytest权威教程

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的更多相关文章

  1. Pytest权威教程21-API参考-03-夹具(Fixtures)

    目录 夹具(Fixtures) @ pytest.fixture config.cache的 capsys capsysbinary capfd capfdbinary doctest_namespa ...

  2. Pytest权威教程19-编写钩子(Hooks)方法函数

    目录 编写钩子(Hooks)函数 钩子函数验证和执行 firstresult: 遇到第一个有效(非None)结果返回 hookwrapper:在其他钩子函数周围执行 钩子(Hooks)函数排序/调用示 ...

  3. Pytest权威教程(官方教程翻译)

    Pytest权威教程01-安装及入门 Pytest权威教程02-Pytest 使用及调用方法 Pytest权威教程03-原有TestSuite的执行方法 Pytest权威教程04-断言的编写和报告 P ...

  4. Pytest权威教程25-配置

    目录 配置 命令行选项和配置文件设置 初始化:确定ROOTDIR和INIFILE 寻找rootdir 如何更改命令行选项默认值 内置的配置文件选项 返回: Pytest权威教程 配置 命令行选项和配置 ...

  5. Pytest权威教程24-Pytest导入机制及系统路径

    目录 Pytest导入机制和sys.path/PYTHONPATH 包中的测试脚本及conftest.py文件 独立测试模块及conftest.py文件 调用通过python -m pytest调用p ...

  6. Pytest权威教程21-API参考-07-配置选项(Configuration Options)

    目录 配置选项(Configuration Options) addopts cache_dir confcutdir console_output_style doctest_encoding do ...

  7. Pytest权威教程21-API参考-06-变量及异常

    目录 特殊变量(Special Variables) collect_ignore collect_ignore_glob pytest_plugins pytest_mark PYTEST_DONT ...

  8. Pytest权威教程21-API参考-05-对象(Objects)

    目录 对象(Objects) CallInfo Class Collector Config ExceptionInfo FixtureDef FSCollector Function Item Ma ...

  9. Pytest权威教程21-API参考-04-钩子(Hooks)

    目录 钩子(Hooks) 引导时的Hook方法 初始化时的Hook方法 测试运行时的Hook方法 收集用例时的Hook方法 生成测试结果时的Hook方法 调试/交互Hook方法 返回: Pytest权 ...

随机推荐

  1. ②将SVN迁移到GitLab-多分支多标签迁移

    之前我们介绍了<①将SVN迁移到GitLab-单分支迁移>,文中研究了svn迁移到git单分支的操作过程,本文针对实际开发过程中svn使用到的trunk.branches.tags情况进行 ...

  2. android 常用库的地址--dialog,recycler

    android 弹出框     https://github.com/li-xiaojun/XPopup android  RecyclerViewAdapter     https://github ...

  3. 使用springboot实现一个简单的restful crud——03、前端页面、管理员登陆(注销)功能

    前言 这一篇我们就先引入前端页面和相关的静态资源,再做一下管理员的登陆和注销的功能,为后续在页面上操作数据做一个基础. 前端页面 前端的页面是我从网上找的一个基于Bootstrap 的dashboar ...

  4. VBA 字符串-相关函数(6-12)

    Mid()函数 Mid()函数返回给定输入字符串中指定数量的字符. 语法 Mid(String,start[,Length]) 参数 String - 必需的参数.输入从中返回指定数量的字符的字符串. ...

  5. CPU子系统

    CPU的基本结构: CPU的主要部件: ​ 运算部件.缓存部件.寄存器.控制器.时序部件 CPU的工作原理: ​ 主要功能:处理指令.执行操作.控制时间.数据运算 ​ 执行指令的流程:读取指令.指令译 ...

  6. 使用企业证书给iOS应用重签

    来源:https://github.com/sailtsao/iReSign 这里有个开源的签名工具,已经修改为支持dylib frameworks等的签名了,使用这个签名不会出现任何问题 iReSi ...

  7. 解决mysql跟php不在同一台机器上,编译安装php服务报错问题:configure: error: Cannot find MySQL header files under /application/mysql.

    在编译安装php服务时报错: configure: error: Cannot find MySQL header files under /application/mysql. Note that ...

  8. python中的debug

    python中有很多的debug方法,大部分新人忽略了Python debugger(pdb)的重要性. 1.命令行运行 在终端中输入命令行   python -m pdb helloword.py ...

  9. SQL SERVER-Extendevent捕获执行慢的语句

    USE MASTER; GO /* Conditionally drop the session if it already exists */ IF EXISTS (SELECT * FROM sy ...

  10. @JsonIgnore注解

    注解名称:@JsonIgnore 作用:在实体类向前台返回数据时用来忽略不想传递给前台的属性或接口. Eg:User实体中会有字段password字段,当返回用户信息给前台的时候,当然是不希望将pas ...