深入了解Pytest中的Mocking:简化测试,避免依赖问题!

news2024/11/13 15:21:21

在软件开发中,测试是确保代码质量的关键步骤之一。而在测试中,经常需要模拟(Mock)一些对象或函数,以确保测试的独立性和可靠性。在Pytest中,Mocking是一个强大的工具,能够简化测试过程,避免对外部依赖的影响。

图片

什么是Mocking?

Mocking是一种用于测试的技术,它允许我们替代实际对象或函数,以便模拟它们的行为。这对于避免对外部服务的依赖、提高测试速度和确保测试的一致性非常有用。

Pytest中的Mocking基础

在Pytest中,Mocking的核心是使用 unittest.mock 库中的 Mock 类。通过创建一个Mock对象,我们可以模拟对象、函数或类,并定义其行为。下面是一个简单的例子:

# test_example.py

from unittest.mock import Mock

def get_data():    # 实际的获取数据的函数    # ...

def test_with_mock():    # 创建一个Mock对象    mock_get_data = Mock()

    # 设置Mock对象的返回值    mock_get_data.return_value = "Mocked Data"

    # 使用Mock对象进行测试    result = mock_get_data()

    assert result == "Mocked Data"

在这个例子中,我们创建了一个名为 mock_get_data 的Mock对象,并设置了它的返回值。接下来,我们调用这个Mock对象,实际上调用的是我们设置的返回值。这样,我们就成功地将对 get_data 函数的调用替代为对Mock对象的调用。

Fixture和Mocking的结合使用

在Pytest中,我们通常使用Fixture来设置测试环境。Mocking和Fixture的结合使用,可以更好地模拟复杂的场景。考虑一个场景:我们需要测试一个依赖外部API的函数。使用Fixture和Mocking,我们可以轻松地解决这个问题:

# test_api_integration.py

import pytestfrom unittest.mock import patch

def fetch_data_from_api(api_url):    # 实际调用外部API的函数    # ...

@pytest.fixturedef mocked_api_response():    # 使用patch装饰器,将外部API调用替换为Mock对象    with patch('test_api_integration.fetch_data_from_api') as mock_fetch:        mock_fetch.return_value = {'status': 'success', 'data': 'Mocked API Data'}        yield mock_fetch

def test_process_data_with_mocked_api(mocked_api_response):    # 在测试中,mocked_api_response会替代fetch_data_from_api    result = process_data()

    assert result == 'Processed Mocked API Data'

在这个例子中,我们使用了 patch 装饰器,将 fetch_data_from_api 函数替换为一个Mock对象。在测试函数中,mocked_api_response 作为Fixture被传递,确保了在测试过程中使用的是Mock对象而不是实际的API调用。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

Mocking的高级用法

除了简单的返回值设置外,Mocking还支持一系列高级用法,比如记录函数的调用次数、传递的参数等。以下是一个例子:

# test_advanced_mocking.py

from unittest.mock import Mock, call

def process_data(data_provider):    data = data_provider.get_data()    # 复杂的数据处理逻辑    # ...

def test_advanced_mocking():    # 创建一个Mock对象    mock_data_provider = Mock()

    # 模拟多次调用    mock_data_provider.get_data.return_value = "Mocked Data"    result_1 = process_data(mock_data_provider)    result_2 = process_data(mock_data_provider)

    # 断言Mock对象的方法被正确调用    mock_data_provider.get_data.assert_has_calls([call(), call()])

    assert result_1 == "Processed Mocked Data"    assert result_2 == "Processed Mocked Data"

在这个例子中,我们使用 assert_has_calls 来检查Mock对象的方法是否按照预期被调用。这种高级的Mocking用法可以帮助我们确保函数的行为符合预期。

Pytest中的Mocking是测试中不可或缺的一环,它能够简化测试流程、提高测试速度,并且使测试更加可靠。通过结合Fixture,我们能够更好地模拟真实场景。了解Mocking的高级用法,可以使测试代码更加强大和灵活。在编写测试时,充分利用Pytest中的Mocking,让测试变得更加轻松和可靠。

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1365943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于机器视觉的车牌检测-边缘检测因子的选择

车牌检测概述 车牌识别在检测报警、汽车出入登记、交通违法违章以及移动电子警察方面应用广泛。车牌识别过程为:首先通过摄像头获取包含车牌的彩色图像;然后进行车牌边缘检测,先粗略定位到车牌位置,再精细定位;最后根…

Qt/QML编程学习之心得:Linux下Thread线程创建(26)

GUI设计中经常为了不将界面卡死,会用到线程Thread,而作为GUI设计工具,Qt也提供了一个这样的类,即QThread。 QThread对象管理程序中的一个控制线程。线程QThread开始在run()中执行。默认情况下,run()通过调用exec()启动事件循环,并在线程内运行Qt事件循环。 也可以通过…

QGIS如何分类显示数据

问题 将经纬度点根据不同类别分类显示 步骤:右键 --》属性 效果 所有分类图层显示与隐藏

ANSYS Zemax OpticStudio 各版本安装指南

ANSYS Zemax OpticStudio下载链接 https://pan.baidu.com/s/1eIJjF93-ZC2CZWn3DGXkkA?pwd0531 1.解压安装包:①鼠标右击【Zemax2024(64bit)】压缩包②选择电脑上安装的解压软件(如:360压缩)③点击【解压到 Zemax2024(64bit)】。…

FlinkAPI开发之自定义函数UDF

案例用到的测试数据请参考文章: Flink自定义Source模拟数据流 原文链接:https://blog.csdn.net/m0_52606060/article/details/135436048 概述 用户自定义函数(user-defined function,UDF),即用户可以根据…

接口芯片选型分析 四通道差分驱动可满足ANSI TIA/EIA-422-B 和ITU V.11 的要求 低功耗,高速率,高ESD

四通道差分驱动可满足ANSI TIA/EIA-422-B 和ITU V.11 的要求 低功耗,高速率,高ESD。 其中GC26L31S可替代AM26LS31/TI,GC26L32S替代AM26LS32/TI,GC26E31S替代TI的AM26LV31E

第04章_数组

第04章_数组 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题脉络 1、数组的概述 1.1 为什么需要数组 需求分析1: 需要统计某公司50个员工的工资情况,例如计算…

第十四章 this关键字介绍和使用

文章目录 一、this是哪里二、常见的this指向2.1 默认绑定2.2 隐式绑定2.3 显示绑定2.4 构造函数绑定 三、函数的方法四、练习:相关文章: 一、this是哪里 this在英文中的含义是【这】。那么【这】是【哪】?this关键字一般存在于函数中&#x…

vue3 img图片怎么渲染

在 Vue3 中加载图片&#xff08;img&#xff09;src地址时&#xff0c;出现无法加载问题。网上很多都建议使用 require 加载相对路径&#xff0c;如下&#xff1a; <img :src"require(../assets/img/icon.jpg)"/>但是按照这种方式加载又会报错如下&#xff1a;…

简单易懂的PyTorch线性层解析:神经网络的构建基石

目录 torch.nn子模块Linear Layers详解 nn.Identity Identity 类描述 Identity 类的功能和作用 Identity 类的参数 形状 示例代码 nn.Linear Linear 类描述 Linear 类的功能和作用 Linear 类的参数 形状 变量 示例代码 nn.Bilinear Bilinear 类的功能和作用 B…

Open CV 图像处理基础:(一)Open CV 在windows环境初始化和 Java 动态库加载方式介绍

Open CV 在windows环境初始化和 Java 动态库加载方式介绍 Open CV是一个开源的计算机视觉和机器学习软件库&#xff0c;它提供了一系列的工具和程序库&#xff0c;让用户能够进行复杂的图像处理和计算机视觉任务。在Java中使用OpenCV涉及到环境初始化和动态库加载。以下是一些…

什么是消费增值?如何做到增值?

在当今的商业世界&#xff0c;消费观念正在经历一场深刻的变革。传统的消费模式中&#xff0c;消费者购买商品后&#xff0c;交易即结束&#xff0c;消费者与商品的关系仅停留在使用层面。然而&#xff0c;随着消费增值模式的出现&#xff0c;这一观念正在被颠覆。这一模式将消…

蓝牙网关在物联网领域三大应用

蓝牙网关在物联网的应用主要包括物联网室内定位、物联网数据采集、物联网连接控制三大应用领域&#xff0c;以下对三大应用领域做详细解释。 一、物联网蓝牙室内定位 蓝牙网关在室内定位的应用包括人员定位和资产设备定位两大方向。 1、人员定位 蓝牙网关安装于室内的特定地…

Fragstats景观格局指数计算入门教程

土地利用以及景观格局是当前全球环境变化研究的重要组成部分及核心内容&#xff0c;其对区域的可持续发展以及区域土地管理有非常重要的意义。通过对土地利用时空变化规律进行分析可以更好的了解土地利用变化的过程和机制&#xff0c;并且通过调整人类社会经济活动&#xff0c;…

【AI视野·今日NLP 自然语言处理论文速览 第七十一期】Fri, 5 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 5 Jan 2024 Totally 28 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers LLaMA Pro: Progressive LLaMA with Block Expansion Authors Chengyue Wu, Yukang Gan, Yixiao Ge, Zeyu Lu, …

安科瑞智慧型动态无功补偿的工业应用——安科瑞赵嘉敏

摘要&#xff1a;低压配电系统的无功补偿是电能质量治理的重要环节。在传统无功补偿中&#xff0c;响应速度较慢&#xff0c;补偿电流呈阶梯式&#xff0c;存在过补或欠补的现象&#xff0c;有时未必能到达理想的效果。为了解决这一问题&#xff0c;人们提出了一种无功补偿综合…

明基、书客、松下护眼台灯怎么样?三款热门台灯真实测评

近年来学生近视的现象越来越严重了&#xff0c;而且近视的年龄也越来越小了&#xff0c;不少还没开始上小学的孩子&#xff0c;就已经戴上了厚厚的近视眼镜。而那些高年级的学生更是近视的重灾区&#xff0c;不仅需要高强度的学习和长时间用眼&#xff0c;而且每晚都需要学习到…

cuttag和chip-seq的区别?

Cut&Tag&#xff08;Cleavage Under Targets and Tagmentation&#xff09;和ChIP-Seq&#xff08;Chromatin Immunoprecipitation Sequencing&#xff09;都是用于研究蛋白质与DNA相互作用的生物技术。它们在技术原理和应用方面有一些关键的区别。 1.ChIP-Seq测序 1.1 …

Linux 部署 AI 换脸

我使用的系统是 Ubuntu 20.04 文章实操主要分为以下几个部分 1、python 环境安装 2、下载 FaceFusion 上传服务器 3、创建 python 虚拟环境 4、下载 FaceFusion 依赖&#xff08;这里的命令执行时间会很长&#xff0c;够你睡午觉了&#xff09; 5、运行 FaceFusion 6、开…

基于SSM的基金投资交易管理网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…