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

掌握pytest monkeypatch:简化测试

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

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]删除
最新教程 更多>
  • 如何处理PHP文件系统功能中的UTF-8文件名?
    如何处理PHP文件系统功能中的UTF-8文件名?
    在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    编程 发布于2025-04-28
  • Java为何无法创建泛型数组?
    Java为何无法创建泛型数组?
    通用阵列创建错误 arrayList [2]; JAVA报告了“通用数组创建”错误。为什么不允许这样做?答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<myO...
    编程 发布于2025-04-28
  • 哪种在JavaScript中声明多个变量的方法更可维护?
    哪种在JavaScript中声明多个变量的方法更可维护?
    在JavaScript中声明多个变量:探索两个方法在JavaScript中,开发人员经常遇到需要声明多个变量的需要。对此的两种常见方法是:在单独的行上声明每个变量: 当涉及性能时,这两种方法本质上都是等效的。但是,可维护性可能会有所不同。 第一个方法被认为更易于维护。每个声明都是其自己的语句,使其...
    编程 发布于2025-04-28
  • 使用jQuery如何有效修改":after"伪元素的CSS属性?
    使用jQuery如何有效修改":after"伪元素的CSS属性?
    在jquery中了解伪元素的限制:访问“ selector 尝试修改“:”选择器的CSS属性时,您可能会遇到困难。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    编程 发布于2025-04-28
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-04-28
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, attributeError:SomeClass实...
    编程 发布于2025-04-28
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-04-28
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确...
    编程 发布于2025-04-28
  • 如何在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 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-04-28
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-04-28
  • 在JavaScript中如何获取实际渲染的字体,当CSS字体属性未定义时?
    在JavaScript中如何获取实际渲染的字体,当CSS字体属性未定义时?
    Accessing Actual Rendered Font when Undefined in CSSWhen accessing the font properties of an element, the JavaScript object.style.fontFamily and objec...
    编程 发布于2025-04-28
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-04-28
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击单击单个鼠标单击单击单击?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(document.Selection){...
    编程 发布于2025-04-28
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    编程 发布于2025-04-28
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-04-28

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

Copyright© 2022 湘ICP备2022001581号-3