结合unittest和pytest进行虚拟数据库测试
使用 pytest 和 MagicMock 模拟数据库操作,并测试假设的 create_user 函数,将用户添加到数据库中。
代码实现
from datetime import date
from typing import List, Optional
from unittest.mock import MagicMock
from pydantic import BaseModel, Field, EmailStr
from sqlalchemy.orm import Session# 假设的枚举类
class GenderType:DEFAULT = "DEFAULT"MALE = "MALE"FEMALE = "FEMALE"# 假设的 Employment 和 CustomerInfo 类
class Employment(BaseModel):company: strposition: strclass CustomerInfo(BaseModel):merchant_id: intloyalty_points: int# UserBase 类
class UserBase(BaseModel):nickname: str = Field(..., description="微信用户昵称")avatar_url: Optional[str] = Field(None, description="微信用户头像URL")# User 类
class User(UserBase):id: int = Field(..., description="用户ID")union_id: Optional[str] = Field(None, description="微信用户唯一标识")name: Optional[str] = Field(None, description="用户真实姓名")gender: Optional[GenderType] = Field(GenderType.DEFAULT,description="用户性别,DEFAULT: 默认,MALE: 男,FEMALE: 女",)mobile: Optional[str] = Field(None, description="用户手机号")birthdate: Optional[date] = Field(None, description="用户生日")email: Optional[EmailStr] = Field(None, description="用户邮箱")address: Optional[str] = Field(None, description="用户地址")employments: Optional[List[Employment]] = Field(None, description="在不同商户中,用户作为员工所拥有的员工组信息")customers: Optional[List[CustomerInfo]] = Field(None, description="在不同商户中,用户作为顾客所拥有的信息")class Config:orm_mode = True# 假设的 create_user 函数
def create_user(db: Session, user_data: UserBase) -> User:# 模拟创建用户user = User(id=1, # 假设生成的用户IDnickname=user_data.nickname,avatar_url=user_data.avatar_url,union_id="mock_union_id",name="Mock User",gender=GenderType.DEFAULT,mobile="1234567890",birthdate=date(1990, 1, 1),email="mock@example.com",address="Mock Address",employments=[Employment(company="Mock Company", position="Mock Position")],customers=[CustomerInfo(merchant_id=1, loyalty_points=100)],)db.add(user)db.commit()return user# 测试代码
def test_create_user():# 创建一个模拟的数据库会话db = MagicMock(spec=Session)# 创建测试数据user_data = UserBase(nickname="test_user", avatar_url="https://example.com/avatar.jpg")# 调用 create_user 函数user = create_user(db, user_data)# 断言 db.add 被调用了一次,并且传入的参数是模拟的 user 对象db.add.assert_called_once_with(user)# 断言 db.commit 被调用了一次db.commit.assert_called_once()# 断言返回的 user 对象有正确的属性assert user.id == 1assert user.nickname == "test_user"assert user.avatar_url == "https://example.com/avatar.jpg"assert user.union_id == "mock_union_id"assert user.name == "Mock User"assert user.gender == GenderType.DEFAULTassert user.mobile == "1234567890"assert user.birthdate == date(1990, 1, 1)assert user.email == "mock@example.com"assert user.address == "Mock Address"assert len(user.employments) == 1assert user.employments[0].company == "Mock Company"assert user.employments[0].position == "Mock Position"assert len(user.customers) == 1assert user.customers[0].merchant_id == 1assert user.customers[0].loyalty_points == 100
解释
-
UserBase和User类: 这些类是基于你提供的代码实现的,包含用户的字段和配置。 -
create_user函数: 这是一个假设的函数,它接受一个数据库会话 (db) 和用户数据 (UserBase),并创建一个User对象,将其添加到数据库中。 -
test_create_user函数: 这是测试函数,我们在这里测试create_user函数的行为。
• 首先创建一个模拟的数据库会话db。
• 然后创建测试数据user_data。
• 调用create_user函数,并传入模拟的db和测试数据。
• 使用assert_called_once_with来验证db.add和db.commit是否被正确调用。
• 使用assert来验证返回的user对象具有正确的属性。
运行测试
-
将上述代码保存为一个 Python 文件(例如
test_user.py)。 -
确保已安装
pytest。如果未安装,可以使用以下命令安装:pip install pytest -
在终端中运行以下命令来执行测试:
pytest test_user.py
预期输出
如果测试通过,会看到类似以下的输出:
============================= test session starts =============================
platform darwin -- Python 3.x.x, pytest-7.x.x, pluggy-1.x.x
rootdir: /path/to/your/project
collected 1 itemtest_user.py . [100%]============================== 1 passed in 0.01s ==============================
相关文章:
结合unittest和pytest进行虚拟数据库测试
使用 pytest 和 MagicMock 模拟数据库操作,并测试假设的 create_user 函数,将用户添加到数据库中。 代码实现 from datetime import date from typing import List, Optional from unittest.mock import MagicMock from pydantic import BaseModel, Fi…...
Spring Boot 监听器(Listeners)详细教程
Spring Boot 监听器(Listeners)详细教程 目录 Spring Boot 监听器概述监听器核心概念最佳使用场景实现步骤高级配置详细使用场景总结 1. Spring Boot 监听器概述 Spring Boot 监听器(Listeners)基于 Spring Framework 的事件机制…...
工具介绍《githack》以及Git 命令行
一、Githack 工具介绍 Githack 是一个用于检测和利用网站 .git 目录泄露漏洞的安全工具。当网站错误配置导致 .git 目录可公开访问时,攻击者可通过该工具下载 .git 中的版本控制文件,并重建完整的项目源代码。 核心用途 检测 .git 目录泄露漏洞。从泄…...
【hello git】git rebase、git merge、git stash、git cherry-pick
目录 一、git merge:保留了原有分支的提交结构 二、git rebase:提交分支更加整洁 三、git stash 四、git cherry-pick 共同点:将 一个分支的提交 合并到 到另一个上分支上去 一、git merge:保留了原有分支的提交结构 现有一个模型…...
MR的环形缓冲区(底层)
MapReduce的大致流程: 1、HDFS读取数据; 2、按照规则进行分片,形成若干个spilt; 3、进行Map 4、打上分区标签(patition) 5、数据入环形缓冲区(KVbuffer) 6、原地排序ÿ…...
下载Hugging Face模型的几种方式
1.网页下载 直接访问Hugging Face模型页面,点击“File and versions”选项卡,选择所需的文件进行下载。 2.使用huggingface-cli 首先,安装huggingface_hub: pip install huggingface_hub 然后,使用以下命令下载模型࿱…...
Java 第十一章 GUI编程(2)
目录 GUI 事件处理 基本思路 添加事件监听器 对话框 实例 GUI 事件处理 对于采用了图形用户界面的程序来说,事件控制是非常重要的;到目前为止, 我们编写的图形用户界面程序都仅仅只是完成了界面,而没有任何实际的功能&…...
Redis数据结构深度解析:从String到Stream的奇幻之旅(一)
Redis系列文章 《半小时掌握Redis核心操作:从零开始的实战指南》-CSDN博客 Redis数据结构深度解析:从String到Stream的奇幻之旅(一)-CSDN博客 Redis数据结构深度解析:从String到Stream的奇幻之旅(二&…...
7V 至 30V 的超宽 VIN 输入范围,转换效率高达 96%的WD5030
WD5030 具备 7V 至 30V 的超宽 VIN 输入范围,这一特性使其能够适应多种不同电压等级的供电环境,无论是在工业设备中常见的较高电压输入,还是在一些便携式设备经过初步升压后的电压,WD5030 都能轻松应对,极大地拓展了应…...
【Git原理与使用一】Git概念与基本操作
文章目录 1. Git 的概念2. Git 的安装3. Git 的认识3.1 创建本地仓库3.2 配置Git3.3 认识工作区、暂存区、版本库 4. Git 的基本操作4.1、认识几个指令1)git add 添加命令2)git commit 提交命令3)git log 查看日志命令4)git cat-f…...
kettle工具使用从入门到精通(一)
安装 可以从链接: 官网(下载链接在Pentaho.pdf文件里)或者网络上查找对应的版本安装 Kettle (PDI) 版本与 JDK 版本对应关系 Kettle (PDI) 版本支持的 JDK 版本备注PDI 9.x 及以上JDK 11 或更高版本推荐使用 OpenJDK 或 Oracle JDK 11。PDI 8.xJDK 8 …...
Java 实现 Oracle 的 MONTHS_BETWEEN 函数
介绍 因为系统迁移, 有一些函数要转成 Java 版本, Oracle 的 官方介绍 - MONTHS_BETWEEN MONTHS_BETWEEN returns number of months between dates date1 and date2. The month and the last day of the month are defined by the parameter NLS_CALENDAR. If date1 is late…...
windows下使用msys2编译ffmpeg
三种方法: 1、在msys2中使用gcc编译 2、在msys2中使用visual studio编译(有环境变量) 3、在msys2中使用visual studio编译(无环境变量) 我的环境: 1、msys2-x86_64-20250221 2、vs2015 3、ffmpeg-7.1…...
Vivado常用的时序约束方法
1,create_clock :创建时钟约束 create_clock -period 20.000 -name sys_clk [get_ports sys_clk 该约束含义是创建一个时钟周期20ns的时钟,时钟名字为sys_clk。注意:如果是差分时钟,只需要约束差分时钟的P端,N端不用约束。 2,set_clock_uncertainty:设置时钟不确定性 s…...
力扣HOT100之哈希:1. 两数之和
这道题之前刷代码随想录的时候已经刷过好几遍了,看到就直接秒了。这道题主要是通过unordered_map<int, int>来建立哈希表,其中键用来保存向量中的元素,而对应的值则为元素的下标。遍历整个向量,当遍历到nums[i]时࿰…...
如何在rust中解析 windows 的 lnk文件(快捷方式)
一、从标题二开始看😁 这些天在使用rust写一个pc端应用程序,需要解析lnk文件获取lnk的图标以及原程序地址,之前并没有过pc端应用程序开发的经验, 所以在广大的互联网上游荡了两天。额🥺 今天找到了这个库 lnk_parse很…...
豆包大模型 MarsCode AI 刷题专栏 001
001.找单独的数 难度:易 问题描述 在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上…...
python语言总结(持续更新)
本文主要是总结各函数,简单的函数不会给予示例,如果在平日遇到一些新类型将会添加 基础知识 输入与输出 print([要输出的内容])输出函数 input([提示内容]如果输入提示内容会在交互界面显示,用以提示用户)输入函数 注释 # 单行注释符&…...
leetcode15 三数之和
1.哈希法 为了避免重复 class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {set<vector<int>> temple;//使用 set 来存储符合条件的三元组,避免重复vector<vector<int>> out;//存放最终输…...
深入探讨AI-Ops架构 第一讲 - 运维的进化历程以及未来发展趋势
首先,让我们一起回顾运维的进化之路,然后再深入探讨AI-Ops架构的细节。 运维的进化历程 1. AI 大范围普及前的运维状态 (传统运维) 在AI技术尚未广泛渗透到运维领域之前,我们称之为传统运维,其主要特点是: 人工驱动…...
从零开始:如何在Windows电脑上完美使用Switch手柄的完整教程
从零开始:如何在Windows电脑上完美使用Switch手柄的完整教程 【免费下载链接】JoyCon-Driver A vJoy feeder for the Nintendo Switch JoyCons and Pro Controller 项目地址: https://gitcode.com/gh_mirrors/jo/JoyCon-Driver 你是否曾经想过在Windows电脑上…...
TC12.0 BMIDE实战:从零构建企业专属业务数据模型
1. 为什么企业需要定制业务数据模型 第一次接触Teamcenter的BMIDE工具时,我和很多技术管理员一样有个疑问:既然系统已经内置了标准数据模型,为什么还要大费周章地自定义?直到参与了一个汽车零部件企业的项目才真正明白。这家企业使…...
PSIM 9.0 手把手教学:从零搭建直流电机双闭环调速模型(附完整代码与波形分析)
PSIM 9.0 手把手教学:从零搭建直流电机双闭环调速模型(附完整代码与波形分析) 在电力电子与电机控制领域,仿真技术已成为工程师和研究人员不可或缺的工具。PSIM作为一款专业的电力电子仿真软件,以其高效的仿真速度和直…...
别再复制官网代码了!Vue + Ant Design 图标与分隔符的本地化实战(附避坑指南)
Vue Ant Design 图标与分隔符的本地化实战指南 在Vue项目中使用Ant Design Vue组件库时,很多开发者习惯直接从官网复制示例代码。然而,这种"拿来主义"常常导致项目运行时出现图标不显示、样式依赖CDN资源等问题。本文将带你从零开始ÿ…...
从零到一:构建与解析XTS测试环境的实战指南
1. 环境准备:搭建XTS测试环境的基础条件 第一次接触XTS测试环境搭建时,我完全被各种术语搞晕了。后来才发现,只要把基础环境准备好,后面的工作就会顺利很多。就像盖房子要先打地基一样,搭建XTS测试环境也需要先准备好几…...
AI智能体安全沙箱agentguard:为LLM代码执行筑起防火墙
1. 项目概述与核心价值 最近在开源社区里,一个名为 A386official/agentguard 的项目引起了我的注意。乍一看这个标题,你可能会联想到网络安全、代理防护或者某种守护进程。没错,这个项目正是为了解决一个在AI应用开发,特别是基于…...
基于OpenTelemetry构建企业级可观测性:从设计到生产实践
1. 项目概述:从“黑盒”到“白盒”的工程实践在分布式系统、微服务架构乃至复杂的单体应用开发中,我们常常面临一个共同的困境:系统内部的状态如同一个“黑盒”。当线上服务出现响应缓慢、内存泄漏或偶发性错误时,传统的日志&…...
基于sagents框架的AI智能体开发:从核心原理到实战应用
1. 项目概述:一个面向开发者的AI智能体构建框架最近在AI应用开发圈子里,一个名为sagents的开源项目开始引起不少同行的注意。如果你正在寻找一个能帮你快速构建、测试和部署AI智能体(Agent)的框架,而不是从零开始造轮子…...
CloudBase-MCP:基于MCP协议桥接本地应用与云服务的实践指南
1. 项目概述:一个连接云与本地应用的“智能接线员”如果你正在开发一个应用,需要让它在本地服务器上运行,同时又想无缝地调用云上的各种能力——比如对象存储、数据库、AI模型或者消息队列,你会怎么做?传统的方式可能是…...
在Python项目中管理多个Taotoken API Key实现访问控制
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Python项目中管理多个Taotoken API Key实现访问控制 在开发基于大语言模型的应用程序时,一个常见的需求是为不同的功…...
