软件测试基础二十九 (接口测试 mock)
Mock(模拟)
一、定义
Mock是在软件开发测试阶段使用的一种技术,用于模拟对象的行为。它主要用于隔离被测试单元(如函数、类或模块)与外部依赖,使得测试更加独立、可控,并且可以在不需要真实外部依赖(如数据库、网络服务等)的情况下进行单元测试。
二、为什么需要Mock
(一)隔离外部依赖
- 解释
-
- 在软件开发中,一个模块通常会依赖于其他模块、数据库、网络服务等外部组件。例如,一个用户认证模块可能需要与数据库进行交互来验证用户凭据,或者一个网络应用程序可能需要调用外部的API来获取数据。在进行单元测试时,如果直接使用这些真实的外部依赖,会带来一些问题。
- 示例
-
- 假设我们有一个函数
get_user_info,它通过网络请求调用一个远程API来获取用户信息。如果在单元测试中直接调用这个函数,测试结果会受到网络状况、API服务器状态等因素的影响。而且,如果API的返回数据结构发生变化,也会导致测试失败。通过使用Mock,可以模拟API的返回值,使得测试聚焦于get_user_info函数本身的逻辑,而不受外部因素的干扰。
- 假设我们有一个函数
(二)提高测试速度和稳定性
- 解释
-
- 真实的外部依赖(如数据库查询、网络调用)通常比较耗时。如果在每次单元测试时都要进行真实的外部操作,会大大增加测试的时间。而且,这些外部操作可能因为各种原因(如网络故障、数据库连接问题)导致测试不稳定,出现间歇性的失败。
- 示例
-
- 考虑一个需要访问数据库来获取订单列表的函数
get_orders。如果每次测试都要真正地查询数据库,可能需要花费大量时间等待数据库响应。并且,如果数据库服务器出现故障或者负载过高,测试就会失败。使用Mock来模拟数据库返回的订单列表,可以快速地完成测试,并且保证测试结果的稳定性,只要get_orders函数的内部逻辑没有改变,测试就会通过。
- 考虑一个需要访问数据库来获取订单列表的函数
三、Mock的实现举例
(一)Python中的Mock
- unittest.mock模块
-
- 基本使用:Python标准库中的
unittest.mock模块提供了用于创建Mock对象的工具。例如,要模拟一个函数的返回值,可以使用MagicMock类。
- 基本使用:Python标准库中的
from unittest.mock import MagicMock# 创建一个MagicMock对象来模拟函数
mock_function = MagicMock()
mock_function.return_value = "Mocked result"
result = mock_function()
print(result)
-
- 在上述示例中,
MagicMock对象mock_function被创建并设置了return_value属性。当调用mock_function时,它会返回预先设置的"Mocked result",而不是执行真实的函数逻辑。 - 模拟方法调用和属性访问:
unittest.mock还可以用于模拟对象的方法调用和属性访问。
- 在上述示例中,
from unittest.mock import MagicMockclass MyClass:def my_method(self):return "Real result"# 创建MyClass的Mock对象
mock_obj = MagicMock(spec=MyClass)
# 设置my_method的返回值
mock_obj.my_method.return_value = "Mocked method result"
result = mock_obj.my_method()
print(result)
-
- 这里创建了
MyClass的Mock对象mock_obj,并通过spec=MyClass指定了它要模拟的类。然后设置了my_method的返回值,当调用mock_obj.my_method时,就会返回模拟的结果。 - 断言方法调用和参数检查:可以使用Mock对象来检查函数或方法是否被调用,以及调用时的参数是否正确。
- 这里创建了
from unittest.mock import MagicMockdef my_function(arg):print(arg)# 创建Mock对象
mock_function = MagicMock()
my_function(mock_function)
# 断言函数被调用
mock_function.assert_called_once()
# 检查调用时的参数
mock_function.assert_called_with(mock_function)
-
- 在这个例子中,
my_function被调用并传入mock_function作为参数。然后通过assert_called_once断言mock_function被调用了一次,通过assert_called_with检查调用时的参数是否符合预期。
- 在这个例子中,
四、使用Mock的最佳实践
(一)仅在单元测试中使用
- 解释
-
- Mock主要用于单元测试,用于隔离被测试单元和外部依赖。在集成测试和系统测试中,应该尽量使用真实的组件,因为这些测试的目的是测试组件之间的集成和整个系统的功能。
- 示例
-
- 在一个包含用户登录、订单处理和支付功能的电商系统测试中,单元测试用户登录功能时可以使用Mock来模拟数据库查询用户信息的操作。但在集成测试中,应该使用真实的数据库和支付网关,以确保各个功能模块之间能够正确地协同工作。
(二)合理设置Mock的行为和返回值
- 解释
-
- 在设置Mock对象的返回值和行为时,应该尽可能地贴近真实情况。如果Mock的行为与真实组件相差太大,可能会导致测试无法有效地发现潜在的问题。
- 示例
-
- 如果模拟一个数据库查询函数,返回的结果应该符合数据库中实际的数据结构和可能的返回值范围。例如,模拟一个查询用户订单列表的函数,返回的订单列表数据结构应该与真实数据库查询返回的一致,包括订单编号、金额、下单时间等字段的类型和格式。
(三)注意Mock对象的生命周期
- 解释
-
- 在测试过程中,要注意Mock对象的创建和销毁时机。如果Mock对象在多个测试用例之间共享,可能会导致测试结果相互干扰。通常,每个测试用例应该有自己独立的Mock对象,以保证测试的独立性。
- 示例
from unittest.mock import MagicMock
def test_case_1():mock_obj = MagicMock()# 设置Mock对象的行为和进行测试操作...
def test_case_2():mock_obj = MagicMock()# 设置Mock对象的行为和进行测试操作...
-
- 在使用JUnit或pytest等测试框架时,每个测试方法应该创建自己的Mock对象。例如,在Python的
pytest测试中: - 这样可以确保每个测试用例
test_case_1和test_case_2都有独立的Mock对象,不会因为共享Mock对象而产生测试结果的混淆。
- 在使用JUnit或pytest等测试框架时,每个测试方法应该创建自己的Mock对象。例如,在Python的
相关文章:
软件测试基础二十九 (接口测试 mock)
Mock(模拟) 一、定义 Mock是在软件开发测试阶段使用的一种技术,用于模拟对象的行为。它主要用于隔离被测试单元(如函数、类或模块)与外部依赖,使得测试更加独立、可控,并且可以在不需要真实外…...
Learning RAG and Ragas
说明:这是我的学习笔记,很多内容转自网络,请查阅文章末尾的参考资料。 文章目录 RAGRagas评估框架评估维度评估指标Faithfulness (忠实度)Answer Relevance (答案相关度)Context Precision (上下文精确度)Context Recall (上下文召回率)Cont…...
Java项目实战II基于微信小程序的实习记录(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在当今竞争激烈的就业市场中࿰…...
GIT将源码推送新分支
1. 创建并切换到新分支 首先,确保你在本地创建了一个新的分支并切换到该分支: git checkout -b new-branch-namenew-branch-name 是你要创建的新分支名称,替换为你需要的名称即可。 2. 确保所有更改已提交 在推送之前,确保你的…...
Python习题 250:删除空文件夹
(编码题)编写一段 Python 代码,删除指定目录的空文件夹。 参考答案: 使用 pathlib 库可以更简洁地处理文件路径。下面是一个使用 pathlib 库递归删除空文件夹的 Python 代码:from pathlib import Pathdef remove_empty_dirs(directory):# 遍历目录及其子目录for path in…...
基本数据类型:Kotlin、Dart (Flutter)、Java 和 C++ 的比较
文章目录 基本数据类型的比较整数类型浮点类型字符类型布尔类型小结 有符号和无符号整数二进制补码表示精度丢失问题结论 在编程语言中,基本数据类型是构建更复杂数据结构的基础。在本文中,我们将比较 Kotlin、Dart (Flutter)、Java 和 C 中的基本数据类…...
源码解析-Spring Eureka(更新ing)
源码解析-Spring Eureka 文章目录 源码解析-Spring Eureka前言一、从Spring.factory和注解开始二、重要的一步EurekaServerInitializerConfiguration三、初始化了什么?自动保护 四, 重新回到EurekaServerAutoConfiguration 前言 无 一、从Spring.factory和注解开始…...
python调用百度通用翻译API
文章目录 1. 简介2. 使用步骤3. api调用实现4. 编码实现 1. 简介 前段时间在做视频语音识别生成多语种字幕时,使用了百度翻译通用翻译api进行翻译。百度翻译平台经过个人认证之后,每月有200万字符的免费翻译额度。还是比较舒服的。 百度翻译开放平台是百…...
Timeline动画「硬切」的问题
1)Timeline动画「硬切」的问题 2)移动平台纹理压缩格式选择ASTC,美术出图还需遵守POT吗 3)如何去掉DOTS Unity.Entities.Graphics创建的BatchRendererGroup的UI相机回调 4)Timeline播放动画会产生位移的问题 这是第409…...
CentOS 9 配置网卡
在 CentOS 9 中配置网卡,通常涉及以下几个步骤: 1. 查看网络接口 首先,确认系统上存在的网络接口。可以使用 ip 命令或 ifconfig 命令查看网络接口的状态。 ip a 或者: ifconfig 这将列出所有可用的网络接口(例如…...
redis7.x源码分析:(2) adlist双向链表
链表是一种常用的数据结构(如果不了解,请先学习数据结构),由于c语言本身没有实现标准的链表库,所以redis自己实现了一个双向链表。 双向链表在redis内部的使用非常的多,几乎所有模块中都有用到。 下面看下它…...
KUKU FM 音频Linux平台免费下载工具
1.工具名称:kuku-dl 功能: ✅ 下载播客、故事和有声读物! ✅ 获取所有元数据和封面艺术品。 ✅ 支持字幕! 3.使用说明: 3.1. 直接镜像github源码库 👉 git clone https://github.com/bunnykek/kuku-…...
《Django 5 By Example》阅读笔记:p105-p164
《Django 5 By Example》学习第5天,p105-p164总结,总计60页。 一、技术总结 1.文章标签功能 Django自带django-taggit。 2.自定义template tags 3.roadmap功能 4.RSS功能 5.full-text搜索功能 这里使用的是Postgresql,使用pip install psycopg安…...
网络延迟对Python爬虫速度的影响分析
Python爬虫因其强大的数据处理能力和灵活性而被广泛应用于数据抓取和网络信息收集。然而,网络延迟是影响爬虫效率的重要因素之一。本文将深入探讨网络延迟对Python爬虫速度的影响,并提供相应的代码实现过程,以帮助开发者优化爬虫性能。 网络…...
微信小程序内嵌h5页面(uniapp写的),使用uni.openLocation无法打开页面问题
1.问题 微信小程序内嵌h5页面(uniapp写的),使用uni.openLocation打开地图页面后,点击该页面下方“到这里”按钮,显示无法打开。如下图: 3.解决方案 在内嵌h5中不使用uniapp的api打开地图,而在h5页面事件处理程序中去跳转新的小程序页面,在该新页面去使用微信小程序…...
创建一个简单的基于STM32的FreeRTOS应用
使用STM32CubeIDE生成。 1,使能FreeRTOS 2,选择版本 CMSIS_V1 3 设置参数USE_NEWLIB_REENTRANT 如果不设置,会在生成代码的时候提示错误 4,设置时钟TIM1作为系统时钟 5,设置Task …...
【Revit二次开发】创建Ribbon选项卡与带图标的按钮
效果图 创建一个叫做“开发的插件”的选项卡, 选项卡内有一个叫做“Hello”的图标按钮, 点击按钮后运行一个命令, 该命令弹出提示框“Hello Revit!”。 在此示例基础上,可以根据需要替换图标、文字、命令功能。 步骤 安装Revit…...
Win11 终端执行 python xxx.py 没反应
在 Win11 上写了一段 Python 代码来分析日志文件, 发现执行没反应。是在 VSCode 里的终端中执行的 python log_stats.py, 是 PowerShell; 也尝试了 cmd, 情况一样。 一开始怀疑代码写错,直到故意在代码里加打印,发现没…...
使用视频提升应用在 App Store 中的推广效果
App Store 上有485 万个应用和游戏。每个应用开发者都知道,要在如此庞大的市场中脱颖而出,吸引宝贵的用户眼球,是多么困难。 您需要在应用推广游戏中尝试一些不同的东西,那就是视频预览。这些短小的电影奇迹已经成为应用营销人员…...
对话 OpenCV 之父 Gary Bradski:灾难性遗忘和持续学习是尚未解决的两大挑战 | Open AGI Forum
作者 | Annie Xu 采访、责编 | Eric Wang 出品丨GOSIM 开源创新汇 Gary Bradski,旺盛的好奇心、敢于冒险的勇气、独到的商业视角让他成为计算视觉、自动驾驶领域举重若轻的奠基者。 Gary 曾加入 Stanley 的团队,帮助其赢得 2005 年美国穿越沙漠 DA…...
观察Taotoken在多模型自动路由下的服务可用性与容灾表现
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察Taotoken在多模型自动路由下的服务可用性与容灾表现 在构建基于大模型的应用时,服务的稳定性是保障业务连续性的基…...
Perplexity营养响应延迟超8秒?3分钟完成本地缓存+USDA API直连双模加速配置
更多请点击: https://kaifayun.com 第一章:Perplexity营养饮食查询 Perplexity 是一款基于大语言模型的实时信息检索工具,其核心优势在于能结合权威来源(如 USDA FoodData Central、PubMed、WHO 指南)对营养学问题进行…...
OpenClaw 2.7.5 Windows 一键部署教程|零配置开箱即用
前言 本地 AI 智能体技术持续迭代,私有化部署、数据安全可控、低门槛快速落地,已成为用户选型的核心考量。开源轻量化 AI 智能体 OpenClaw 2.7.5 版本完成全面优化升级,在环境适配性、服务稳定性与模型集成能力上均有显著提升,原…...
VPU与NPU协同优化:边缘AI视觉处理的算力融合实践
1. 项目概述:边缘计算时代的算力融合新范式最近和几个做嵌入式AI和边缘设备的老朋友聊天,大家不约而同地都在讨论一个话题:在资源受限的边缘端,如何把有限的算力“榨干”,让模型跑得更快、更省电。聊着聊着,…...
2025届必备的五大AI辅助论文助手推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在当下人工智能范畴里身为重要参与者的DeepSeek,它所产出的论文常常展现出严谨的…...
【Android】CloneTTS最强朗读听书引擎-可克隆一切音色
【Android】CloneTTS最强朗读听书引擎-可克隆一切音色 链接:https://pan.xunlei.com/s/VOsu4mh3O_d7zjeERkKPfcG4A1?pwddi3y# CloneTTS 是一款运行在安卓系统本地的文字转语音(TTS)原生引擎,允许用户离线克隆所需的声音并直接使用该声音来朗读书籍或长…...
国产多模态大模型:产业协同全景与实战指南
国产多模态大模型:产业协同全景与实战指南 引言 在人工智能浪潮席卷全球的背景下,国产多模态大模型正从技术探索迈向广泛的产业协同应用。与只能处理文本或图像的单一模态模型相比,多模态大模型能同时理解、关联和生成文本、图像、音频、视频…...
高效AI专著生成:20万字专著一键搞定,AI写专著工具实测推荐!
学术专著写作挑战与AI工具助力 对于初次尝试编写学术专著的研究者来说,写作过程就像是在“摸索着走过一条未知的小路”,处处都有挑战等待着他们。在选题上常常感到迷惘,难以在“有意义”与“可操作性”之间找到合适的平衡:有的研…...
NotebookLM权限颗粒度管控实战:从入门到精通的7步精准授权法(含Google内部RBAC配置模板)
更多请点击: https://intelliparadigm.com 第一章:NotebookLM权限控制设置概览 NotebookLM 是 Google 推出的基于用户自有文档构建个性化 AI 助手的实验性工具,其权限模型聚焦于数据主权与最小化访问原则。默认状态下,所有上传文…...
告别浏览器标签混乱:5分钟搭建高效Gmail桌面邮件中心
告别浏览器标签混乱:5分钟搭建高效Gmail桌面邮件中心 【免费下载链接】gmail-desktop :postbox: Gmail desktop app for macOS, Windows & Linux (formerly Gmail Desktop) 项目地址: https://gitcode.com/gh_mirrors/gm/gmail-desktop 厌倦了在浏览器标…...
