美文网首页Pytest教程
Pytest官方教程-07-猴子补丁/模块和环境的Mock

Pytest官方教程-07-猴子补丁/模块和环境的Mock

作者: 韩志超 | 来源:发表于2018-11-27 13:15 被阅读66次

目录:

猴子补丁/模块和环境的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修改将被撤消。

示例:阻止"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详情

API参考

查阅MonkeyPatch类相关文档。

相关文章

  • Pytest官方教程-07-猴子补丁/模块和环境的Mock

    目录: 安装及起步 使用及调用方法 将pytest与原有测试套件一起使用 断言的编写和报告 pytest fixt...

  • iOS单元测试资料收集

    mock 中文资料 官方原版教程,开始mock mock3 API 参考

  • Python学习:如何试用pytest-mock(2)

    1.问题 前面我们讨论了pytest-mock,给模块mock的使用方法。当时还列举了两个问题,如何给对象的属性进...

  • 猴子补丁

    属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)。猴子补丁的叫法有些莫名其妙,只要和“模块运行时替...

  • Chapter 7 猴子补丁/模拟模块或环境的行为

    Chapter 7 猴子补丁/模拟模块或环境的行为 有时我们需要修改函数的全局配置或者调用类似网络访问这些不容易测...

  • pytest的中文翻译

    原文:Pytest权威教程(官方教程翻译) - 韩志超 - 博客园 (cnblogs.com)[https://w...

  • 猴子补丁的由来

    转:什么是猴子补丁 所谓的猴子补丁的含义是指在动态语言中,不去改变源码而对功能进行追加和变更。猴子补丁的这个叫法起...

  • 2020-01-31

    Pytest-Mock 进阶用法详解 一、什么是 Mock 测试? Mock测试就是在 测试过程 中,对于某些...

  • Python猴子补丁

    属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)。 为什么叫猴子补丁 属性的运行时替换和猴子也没什...

  • CFA mock exam和sample exam有什么区别?

    CFA mock exam 和sample exam都是CFA协会官方出版,sample和mock exam作为最...

网友评论

    本文标题:Pytest官方教程-07-猴子补丁/模块和环境的Mock

    本文链接:https://www.haomeiwen.com/subject/utrgqqtx.html