使用 pytest-mock 进行 Python 高级单元测试与模拟
一、单元测试与模拟的意义
在软件开发中,单元测试用于验证代码逻辑的正确性。但实际项目中,代码常依赖外部服务(如数据库、API、文件系统)。直接测试这些依赖会导致:
- 测试速度变慢
- 测试结果不可控
- 产生副作用(如真实发送邮件)
模拟(Mocking) 技术通过创建虚拟对象替代真实依赖,使测试聚焦于当前单元的逻辑。
二、环境安装
使用 pytest 和 pytest-mock 插件:
pip install pytest pytest-mock
三、基础用法示例
场景:邮件发送服务
假设我们有一个邮件发送类 EmailSender:
# email_sender.py
class EmailSender:def send(self, to, subject, body):# 真实发送邮件的逻辑return True
测试时不应实际发送邮件。使用 pytest-mock 模拟 send 方法:
# test_email_sender.py
def test_send_email(mocker):mock_send = mocker.patch("email_sender.EmailSender.send")sender = EmailSender()result = sender.send("user@example.com", "Hello", "Test email")mock_send.assert_called_once_with("user@example.com", "Hell相关文章:
使用 pytest-mock 进行 Python 高级单元测试与模拟
一、单元测试与模拟的意义 在软件开发中,单元测试用于验证代码逻辑的正确性。但实际项目中,代码常依赖外部服务(如数据库、API、文件系统)。直接测试这些依赖会导致: 测试速度变慢测试结果不可控产生副作用(如真实发送邮件)模拟(Mocking) 技术通过创建虚拟对象替代真…...
lowagie(itext)老版本手绘PDF,包含页码、水印、图片、复选框、复杂行列合并等。
入口类:exportPdf package xcsy.qms.webapi.service;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.common.utils.StringUtils; import com.ibm.icu.text.RuleBasedNumberFormat; import com.lowa…...
《Linux 指令集:开启极客世界的钥匙_01》
一、命令行基础 (一)命令行提示符解析 当前用户:显示当前登录的用户名。例如,当前用户为 “ubuntu_user”,则在命令行提示符中会显示该用户名。 连接符:通常是 “”,用于分隔用户名和计算机名…...
【Android】用 chrome://inspect/#devices 调试H5页面
通常做Android开发的过程中,不可避免的需要遇到去与H5交互,甚至有时候需要去调试H5的信息。 这里分享一下Android工程里如何调试H5页面信息: 直接在浏览器地址栏输入 : chrome://inspect/#devices 直接连接手机usb,打开开发者模式…...
Deepseek 实战全攻略,领航科技应用的深度探索之旅
想玩转 Deepseek?这攻略别错过!先带你了解它的基本原理,教你搭建运行环境。接着给出自然语言处理、智能客服等应用场景的实操方法与代码。还分享模型微调、优化技巧,结合案例加深理解,让你全面掌握,探索科技…...
《论区块链技术及应用》审题技巧 - 系统架构设计师
区块链技术及应用论题写作框架 一、考点概述 本论题“区块链技术及应用”主要考察软件测试工程师对区块链技术的理解及其在软件项目中的实际应用能力。论题涵盖了多个关键方面,首先要求考生对区块链技术有全面的认识,包括但不限于其作为分布式记账技术…...
ROS2 强化学习:案例与代码实战
一、引言 在机器人技术不断发展的今天,强化学习(RL)作为一种强大的机器学习范式,为机器人的智能决策和自主控制提供了新的途径。ROS2(Robot Operating System 2)作为新一代机器人操作系统,具有…...
【Python模块】——pymysql
pymysql是python操作mysql的标准库,可以通过pip install快速导入pymysql包操作数据库 使用pymysql操作mysql 简单demo import pymysql connect pymysql.connect(host"localhost",port3306,user"root",password"root",database&quo…...
【我的Android进阶之旅】Android Studio SDK Update Site 国内的腾讯云镜像配置指南
一、腾讯云的镜像 https://mirrors.cloud.tencent.com/AndroidSDK/ 二、 打开 Android Studio的SDK Manager 路径:Tools–>SDK Manager 在右侧找到 SDK Update Sites 列表,添加如下链接,像下面一样,一个一个添加 将下面几个链接都加上去 https:...
springboot实现多文件上传
springboot实现多文件上传 代码 package com.sh.system.controller;import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PostMap…...
Webpack打包优化
在使用 Webpack 打包项目时,随着项目规模的扩大,构建时间和打包产物的体积可能会逐渐增加。为了提高构建性能和减小打包产物的体积,可以采取以下几种 Webpack 打包优化 的方法。 1. 使用 mode 配置 Webpack 通过 mode 配置来指定构建模式。…...
浅谈HTTP及HTTPS协议
1.什么是HTTP? HTTP全称是超文本传输协议,是一种基于TCP协议的应用非常广泛的应用层协议。 1.1常见应用场景 一.浏览器与服务器之间的交互。 二.手机和服务器之间通信。 三。多个服务器之间的通信。 2.HTTP请求详解 2.1请求报文格式 我们首先看一下…...
GTID的基本概念
1.1 GTID的基本概念 1.1.1 GTID的作用 GTID的全称为Global Transaction Identifier,是MySQL的一个强大的特性。MySQL会为每一个DML/DDL操作都增加一个唯一标记,叫作GTID(每个事务一个GTID)。这个标记在整个复制环境中都是唯一的…...
.NET Core MVC IHttpActionResult 设置Headers
最近碰到调用我的方法要求返回一个代码值,但是要求是不放在返回实体里,而是放在返回的Headers上 本来返回我是直接用 return Json(res) 这种封装的方法特别简单,但是没有发现设置headers的地方 查询过之后不得已换了个返回 //原来方式 //…...
数据结构与算法面试专题——桶排序
引入 桶排序,顾名思义,会用到“桶”,核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。 桶排序…...
深度学习奠基作 AlexNet 论文阅读笔记(2025.2.25)
文章目录 训练数据集数据预处理神经网络模型模型训练正则化技术模型性能其他补充 训练数据集 模型主要使用2010年和2012年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)提供的 ImageNet 的子集进行训练,这些子集包含120万张图像。最终ÿ…...
MongoDB 数据库简介
MongoDB 数据库简介 引言 随着互联网技术的飞速发展,数据已经成为企业的重要资产。为了高效地管理和处理这些数据,数据库技术应运而生。MongoDB作为一种流行的NoSQL数据库,因其灵活的数据模型和高效的数据处理能力,受到了广泛的关注。本文将为您详细介绍MongoDB的基本概念…...
Transformer LLaMA
一、Transformer Transformer:一种基于自注意力机制的神经网络结构,通过并行计算和多层特征抽取,有效解决了长序列依赖问题,实现了在自然语言处理等领域的突破。 Transformer 架构摆脱了RNNs,完全依靠 Attention的优…...
【DeepSeek开源:会带来多大的影响】
DeepSeek 开源,震撼登场对云计算行业的冲击 巨头云厂商的新机遇 DeepSeek 开源后,为云计算行业带来了巨大的变革,尤其是为巨头云厂商创造了新的发展机遇。以阿里云为例,它作为云计算行业的领军者,与 DeepSeek 的合作…...
Redis7——基础篇(七)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二)Redis(三)Redis&#x…...
别再手搓代码了!用Webots 2023b快速搭建你的第一个机器人仿真环境(附官方Demo实操)
别再手搓代码了!用Webots 2023b快速搭建你的第一个机器人仿真环境(附官方Demo实操) 第一次打开Webots时,那个布满按钮的界面和复杂的场景树确实容易让人望而生畏。但别急着关掉软件——你可能不知道,这个看似复杂的仿真…...
魔兽争霸3现代难题终结者:WarcraftHelper一站式解决方案
魔兽争霸3现代难题终结者:WarcraftHelper一站式解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代电脑上的各…...
APP Inventor蓝牙APP制作:从零到一打造专属遥控器
1. 为什么选择APP Inventor制作蓝牙遥控器 最近在折腾一台自制的蓝牙小车,发现市面上的通用蓝牙调试工具根本不够用。要么功能太简单,要么界面丑得没法看。作为一个对用户体验有强迫症的人,我决定自己动手做一个专属遥控APP。经过一番调研&am…...
Z-Image-Turbo-rinaiqiao-huiyewunv多场景落地:AI绘画教育课程实验平台搭建实践
Z-Image-Turbo-rinaiqiao-huiyewunv多场景落地:AI绘画教育课程实验平台搭建实践 1. 项目背景与核心价值 在教育数字化转型的浪潮中,AI绘画技术正成为艺术教育创新的重要驱动力。Z-Image Turbo (辉夜大小姐-日奈娇)作为一款专为二次元人物绘图优化的工具…...
C语言完美演绎7-15
/* 范例:7-15 */#include <string.h>#include <stdio.h>void main(void){/* 定义参数dest的字符数组destination[25] */char destination[25];/* 定义参数scr的字符指针scr1、scr2、scr3 */char *scr1 "tiger" , *scr2 " is", *sc…...
Web前端事件循环:从浏览器进程模型到异步任务调度实战
1. 浏览器进程模型:理解前端运行的底层环境 浏览器远比我们想象的要复杂得多。每次打开一个网页,背后其实运行着一整套精密的进程和线程协作系统。想象一下,这就像一家餐厅的运作:浏览器进程是前台接待,负责接待顾客&a…...
MiniCPM-V-2_6金融风控应用:票据图像识别+伪造特征检测实战部署
MiniCPM-V-2_6金融风控应用:票据图像识别伪造特征检测实战部署 1. 引言:金融风控中的票据识别挑战 在金融行业日常运营中,票据处理是一项繁重但至关重要的工作。银行、保险公司、企业财务部门每天都需要处理大量的支票、汇票、发票等金融票…...
KP09 Encoder使用教程
注意:请不要同时将两个typec口接入数据线。 2026.3.22更新 汉化版VIAL改键软件,链接:VIAL汉化版——VIAL-JL – yoonas blog 2026.3.23更新 组合键设置 默认功能 1、默认键位 键盘有九个按键,两个旋钮,旋钮可以按下。上…...
Kali Linux下用stegpy解密XCTF MISC题:从安装到拿到flag的完整复盘
Kali Linux下用stegpy解密XCTF MISC题:从安装到拿到flag的完整复盘 在CTF竞赛中,MISC(杂项)类题目往往考验选手的综合能力,其中隐写术(Steganography)是常见考点。本文将详细复盘如何在Kali Lin…...
uniapp安卓文件选择进阶:实现多选、类型过滤与大小限制的完整方案
1. 为什么需要进阶文件选择功能? 在移动应用开发中,文件选择是最基础但最容易被忽视的功能之一。我见过太多应用因为文件选择体验差而被用户吐槽:要么只能单选,要么选完才发现格式不对,要么上传时才发现文件太大。这些…...
