目录:
- 安装及入门
- 使用和调用方法
- 原有TestSuite使用方法
- 断言的编写和报告
- Pytest fixtures:清晰 模块化 易扩展
- 使用Marks标记测试用例
- Monkeypatching/对模块和环境进行Mock
- 使用tmp目录和文件
- 捕获stdout及stderr输出
- 捕获警告信息
- 模块及测试文件中集成doctest测试
- skip及xfail: 处理不能成功的测试用例
- Fixture方法及测试用例的参数化
- 缓存: 使用跨执行状态
- unittest.TestCase支持
- 运行Nose用例
- 经典xUnit风格的setup/teardown
- 安装和使用插件
- 插件编写
- 编写钩子(hook)方法
- 运行日志
- API参考
- 优质集成实践
- 片状测试
- Pytest导入机制及sys.path/PYTHONPATH
- 配置选项
- 示例及自定义技巧
- 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类相关文档。