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

掌握pytest monkeypatch:简化测试

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

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]删除
最新教程 更多>
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-04-08
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-08
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-04-08
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    编程 发布于2025-04-08
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符在postgresql中提取最后一行,您可能需要遇到与数据集合中每个不同标识的信息相关的信息。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: id dat...
    编程 发布于2025-04-08
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-04-08
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-04-08
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-04-08
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-04-08
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-04-08
  • 如何配置Pytesseract以使用数字输出的单位数字识别?
    如何配置Pytesseract以使用数字输出的单位数字识别?
    Pytesseract OCR具有单位数字识别和仅数字约束 在pytesseract的上下文中,在配置tesseract以识别单位数字和限制单个数字和限制输出对数字可能会提出质疑。 To address this issue, we delve into the specifics of Te...
    编程 发布于2025-04-08
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-04-08
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-04-08
  • 如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    使用http request 上传文件上传到http server,同时也提交其他参数,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    编程 发布于2025-04-08
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 的 ...
    编程 发布于2025-04-08

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

Copyright© 2022 湘ICP备2022001581号-3