”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 掌握pytest monkeypatch:简化测试

掌握pytest monkeypatch:简化测试

发布于2025-02-09
浏览:796

Mastering Pytest Monkeypatch: Simplify Your Testing在python中进行测试时,确保可靠和孤立的测试至关重要。一个普遍的挑战是如何模拟或修改测试过程中对象和功能的行为。这是Pytest monkeypatch灯具发光的地方。它提供了一种灵活的方法,可以在测试过程中动态替换代码的部分。

在此博客中,我们将探索MonkeyPatch的力量,为什么有用以及如何使用它来编写干净,有效的测试。

什么是monkeypatch?


functions或方法

对象的属性

    环境变量
  • 这种动态修改是暂时的,仅适用于测试范围,确保一旦测试结束,就可以恢复原始行为。这使得Monkeypatch对于在特定条件下嘲笑,重大依赖或测试代码而不进行永久更改时特别有用。
  • 为什么要使用MonkeyPatch?
以下是一些关键方案,其中monkeypatch可以简化您的测试:


模拟依赖关系

:用模拟对象或函数替换外部依赖关系以测试孤立的单元。

测试边缘案例
    :模拟边缘案例行为,例如异常或特定的返回值。
  1. 临时环境更改:用于测试配置特定逻辑的修改环境变量。
  2. :暂时覆盖类或模块的方法。
  3. 使用MonkeyPatch的示例
  4. 1。嘲笑功能
  5. 假设您的函数依赖于外部API:
  6. #my_app.py def fetch_data(): #模拟API调用 返回“真正的API响应”
在不实际调用API的情况下测试逻辑,您可以模拟fetch_data:

#test_my_app.py 来自my_app import fetch_data def test_fetch_data(monkeypatch): def mock_fetch_data(): 返回“模拟响应” monkeypatch.setAttr(“ my_app.fetch_data”,mock_fetch_data) surstert fetch_data()==“模拟响应”

2。覆盖环境变量


想象您正在测试一个取决于环境变量的函数:

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
#config.py 导入操作系统 def get_database_url(): 返回os.getEnv(“ database_url”,“ default_url”)


您可以使用monkeypatch模拟不同的环境:

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
#test_config.py 从配置imimt get_database_url def test_get_get_database_url(monkeypatch): monkeypatch.setenv(“ database_url”,“模拟_url”) assert get_database_url()==“ Mocked_url”

3。嘲笑班级的方法


如果您需要临时替换课堂中的方法:

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
#my_class.py 类计算器: def add(self,a,b): 返回b


用模拟方法测试行为:

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
#test_my_class.py 来自my_class导入计算器 def test_calculator_add(monkeypatch): def mock_add(self,a,b): 返回42 monkeypatch.setAttr(计算器,“ add”,mock_add) calc =计算器() assert calc.add(1,2)== 42

4。嘲笑内置功能


您甚至可以为特定方案模拟内置功能:

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
#my_module.py def is_file_openable(文件名): 尝试: 带有打开(文件名,“ R”): 返回true 除了ioerror: 返回false


模拟打开以模拟不同的行为:

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
#test_my_module.py 来自my_module import is_file_openable def test_is_file_openable(monkeypatch): def mock_open(文件名,模式): 提高ioError(“嘲笑IoError”) monkeypatch.setAttr(“ helidins.open”,mock_open) 断言不是is_file_openable(“ test.txt”)

MonkeyPatch的最佳实践

# my_module.py
def is_file_openable(filename):
    try:
        with open(filename, "r"):
            return True
    except IOError:
        return False
范围

:仅在测试范围内使用monkeypatch来避免副作用。

:为依赖性注入或其他设计模式不可行的方案保留monkeypatch。
# my_module.py
def is_file_openable(filename):
    try:
        with open(filename, "r"):
            return True
    except IOError:
        return False
使用explicit路径
:设置属性时,提供显式模块和对象路径以防止意外修改。

    还原默认值
  1. :monkeypatch自动还原原始状态,但避免链接或嵌套以保持测试简单。
  2. 结论 通过合并此处概述的示例和最佳实践,您可以使测试套件可靠且可维护。探索官方的Pytest文档以了解更多信息并解锁Pytest的全部潜力!
  3. 快乐测试!
版本声明 本文转载于:https://dev.to/mohamedabdelwahab/mastering-pytest-monkeypatch-simplify-your-testing-jj8?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-07-25
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-07-25
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    编程 发布于2025-07-25
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withCo...
    编程 发布于2025-07-25
  • 如何在Chrome中居中选择框文本?
    如何在Chrome中居中选择框文本?
    选择框的文本对齐:局部chrome-inly-ly-ly-lyly solument 您可能希望将文本中心集中在选择框中,以获取优化的原因或提高可访问性。但是,在CSS中的选择元素中手动添加一个文本 - 对属性可能无法正常工作。初始尝试 state)</option> < op...
    编程 发布于2025-07-25
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    编程 发布于2025-07-25
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-07-25
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-07-25
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-07-25
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案:的,请访问量很大,并应为procectiquiestate的,并在整个代码上正确格式不多: java.text.simpledateformat; 导入java.util.calendar; 导入java...
    编程 发布于2025-07-25
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-07-25
  • PHP SimpleXML解析带命名空间冒号的XML方法
    PHP SimpleXML解析带命名空间冒号的XML方法
    在php 很少,请使用该限制很大,很少有很高。例如:这种技术可确保可以通过遍历XML树和使用儿童()方法()方法的XML树和切换名称空间来访问名称空间内的元素。
    编程 发布于2025-07-25
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-07-25
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-07-25
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-07-25

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3