Pytest官方教程-07-Monkeypatching,对模块和环境进行Mock

目录:

  1. 安装及入门
  2. 使用和调用方法
  3. 原有TestSuite使用方法
  4. 断言的编写和报告
  5. Pytest fixtures:清晰 模块化 易扩展
  6. 使用Marks标记测试用例
  7. Monkeypatching/对模块和环境进行Mock
  8. 使用tmp目录和文件
  9. 捕获stdout及stderr输出
  10. 捕获警告信息
  11. 模块及测试文件中集成doctest测试
  12. skip及xfail: 处理不能成功的测试用例
  13. Fixture方法及测试用例的参数化
  14. 缓存: 使用跨执行状态
  15. unittest.TestCase支持
  16. 运行Nose用例
  17. 经典xUnit风格的setup/teardown
  18. 安装和使用插件
  19. 插件编写
  20. 编写钩子(hook)方法
  21. 运行日志
  22. API参考
    1. 方法(Functions)
    2. 标记(Marks)
    3. 钩子(Hooks)
    4. 装置(Fixtures)
    5. 对象(Objects)
    6. 特殊变量(Special Variables)
    7. 环境变量(Environment Variables)
    8. 配置选项(Configuration Options)
  23. 优质集成实践
  24. 片状测试
  25. Pytest导入机制及sys.path/PYTHONPATH
  26. 配置选项
  27. 示例及自定义技巧
  28. Bash自动补全设置

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修改将被撤消。

示例:阻止"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类相关文档。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容