当前位置: 首页 > news >正文

使用 JMeter 和 Docker 进行服务存根

用于性能测试的服务存根:简介
随着测试项目的复杂性不断增加,越来越多的被测系统的测试流程受到依赖系统的影响。当我说“依赖系统”时,我指的是:

不受当前开发影响的遗留系统
属于另一个组织的第三方服务
您的组织开发的系统,路线图不明确
依赖系统的存在使每个手动或自动测试项目都处于如下图所示的情况。

测试参与者 - 在图中,我展示了一个测试项目,该项目对被测系统进行压力测试,以手动和自动化的不同方式验证其质量。
被测系统 (SUT) - 由实现业务需求的异构服务和基础设施组成的复杂架构。
附加系统 - 这些服务与最终应用程序协作,但超出了项目管理范围。可能他们的一些要求尚不清楚。这些是依赖关系。
在上图中,关注箭头也很重要。这些箭头描述了系统的边界和用于交换消息/信息的接口:

红色箭头表示在测试工具(本例中为 JMeter)中运行的测试规范。
灰色箭头表示存在测试人员知之甚少的功能关系。如果您太晚才意识到依赖关系破坏了您的测试逻辑,这可能会浪费您的时间。因此,提前计划,找出依赖关系,存根它们,制定计划并继续测试。
依赖系统的存在会在整个测试项目(手动和自动测试)中产生一系列令人不快的影响:

脆弱性 - 随着不受控制的依赖项数量的增加,测试变得更加脆弱,因为当问题在于依赖项而不是 SUT 时,您可能会得到失败的测试,从而导致测试不可靠。
不稳定 - 当 SUT 启动时,依赖性可能会导致系统瘫痪,从而影响与 SUT 没有明确关联的测试结果。
耗时 - 设置测试数据可能需要数天/数周的时间,并且可能容易出错。
不可用性——测试团队可能会花时间等待依赖系统的可用性。
沮丧——事情的人性方面:
测试人员 - 您可能会因为无法有效地完成工作而感到沮丧
经理 - 您可能会感到沮丧,因为您的团队因工作受阻而浪费时间
为了消除或大大减少这些影响,一种解决方案是将 SUT 上执行的测试过程与不受控制的依赖关系解耦。解耦的一种方法是采用存根接口,其目标是复制依赖关系的行为。通过这种方式,测试过程不会像原始依赖系统那样遇到不可预测的行为。因此,测试范围现在将包括存根服务,因为它们是测试过程的一部分。因此,我们将在图表中的测试范围中添加一个新端点。

要在测试计划中创建存根接口,我们需要:

添加一个名为存根服务的新系统,该系统复制要存根的接口
根据计划的测试过程定义必须存根哪些调用
了解存根是测试套件的一部分并且包含在测试范围内
在上图中,我在测试范围中添加了一个新实体(存根服务)。存根服务在查询时的行为类似于原始依赖项,只是它使用与测试范围一致的特定消息进行响应。存根可以重现功能特性以及非功能特性,例如响应时间或慢速连接。

让我们了解消息/信息交换的流程:

红色箭头与上图具有类似的功能,但略有不同:测试团队已经使用存根和 SUT 生成了前提条件
绿色箭头 - 是存根接口,它从真实的依赖系统中再现所有可能的请求/响应的子集。您如何决定应该存根哪些请求/响应?这取决于两个因素:
测试覆盖率 - 测试团队必须确保 SUT 的质量。这个目标是通过测试覆盖率来实现的。更多的测试覆盖率需要更复杂的存根。
存根设置工作 - 测试团队负责设置存根接口并维护它们。因此,必须相应地分配资源。理解这一点很重要,因为某些存根的维护可能很复杂,并且与原始测试计划相比,工作量可能会变得非常出乎意料。
总结本节:存根可能是复杂测试项目成功的关键。

虚拟化作为服务存根的捷径
开发存根服务需要大量的规划和实施工作。有时,项目成员会采用快速而肮脏的解决方案来加速软件生命周期活动。他们假设他们需要短时间的存根使用(例如开发一项功能、测试一项功能)。快速而肮脏的解决方案很有吸引力,但它往往会:

生命周期很短,随着时间的推移无法保证再现性。
仅由一种环境使用,通常是开发它的环境。
简单的存根解决方案基于硬编码和/或参数化数据。还有基于数据模型解决方案的更复杂的存根服务。存根服务的设置变得更加复杂,有时需要适当的培训,但对于具有更广泛目标的项目,更建议获得存根服务。

在本文中,我们将描述如何使用虚拟化服务来实现存根服务。获取虚拟存根服务可以使存根与环境的其他部分隔离。此外,虚拟存根服务可以在以下情况下通过网络迁移存根服务:

各部门需要共享存根,以便他们可以在子系统开发过程中协作并使用相同的参考。
在测试(例如性能测试)期间需要改进存根服务基础设施(例如计算负载和带宽)。
可以使用虚拟化层来创建虚拟存根服务。我们将使用基于 Docker 的虚拟化,因为 Docker 可以在隔离的上下文中执行存根,仅重现所需的功能。

基于 Docker 的存根服务
Docker提供了轻松设置存根服务并具有高可靠性的可能性。正如我们在之前的文章中所描述的,在 Docker 中可以立即重现先前配置的行为。此外,虚拟化层创建了一个隔离,将存根接口作为外部服务执行。

现在是时候通过一些示例来教我们如何做到这一点了。我将介绍两个容器,以及每个容器的一个特定于存根的服务接口。所提出的示例是我自己的:它们使用自我分配的需求,与商业情况没有任何关联。

SUT:大数据,Stub:基于S3的数据源(示例1)
在本例中,我们需要为基于生成连续数据的S3存储桶的数据源设置存根。该数据可以根据速度、种类和数量来表征。此存根的潜在 SUT 目标是大数据应用程序。

我们对此示例存根的测试要求是:

存根生成定义的 kB 大小的随机字符作为 S3 对象
存根定期上传新的 S3 对象
存根将生成的 S3 对象发送到指定的存储桶
通过分析这些需求,我们可以提取添加到存根实现中的参数,以在启动时自定义存根行为:

kbSize - 生成的每个对象的 kB 大小
sheetAtMinute - 每次上传多少个对象的指示
bucket - 描述目标bucket名称

相关文章:

使用 JMeter 和 Docker 进行服务存根

用于性能测试的服务存根:简介 随着测试项目的复杂性不断增加,越来越多的被测系统的测试流程受到依赖系统的影响。当我说“依赖系统”时,我指的是: 不受当前开发影响的遗留系统 属于另一个组织的第三方服务 您的组织开发的系统&am…...

《王道计算机考研——操作系统》学习笔记总目录+思维导图

本篇文章是对《王道计算机考研——操作系统》所有知识点的笔记总结归档和计算机网络的思维导图 学习视频:王道计算机考研 操作系统 408四件套【计网、计组、操作系统、数据结构】完整课堂PPT 思维导图 (求Star~):【王道考研】计…...

多模态及图像安全的探索与思考

前言 第六届中国模式识别与计算机视觉大会(The 6th Chinese Conference on Pattern Recognition and Computer Vision, PRCV 2023)已于近期在厦门成功举办。通过参加本次会议,使我有机会接触到许多来自国内外的模式识别和计算机视觉领域的研究…...

基础算法相关笔记

排序 最好情况下: 冒泡排序 最坏时间复杂度 O ( n 2 ) O(n^2) O(n2)。 插入排序 最坏时间复杂度为 O ( n 2 ) O(n^2) O(n2),最优时间复杂度为 O ( n ) O(n) O(n)。 平均情况下: 快速排序 最坏时间复杂度为 O ( n 2 ) O(n^2) O(n2)&…...

Mac电脑无法识别移动硬盘怎么办?

很多人都喜欢在Mac电脑上办公、学习,但有时我们将移动硬盘连接Mac电脑时,却会发现电脑无法识别移动硬盘。那么,Mac电脑无法识别移动硬盘怎么办呢? Mac无法识别移动硬盘的原因 导致Mac不识别移动硬盘的原因有很多,你可…...

14Maven与Tomcat面试题

1MAVEN Maven是一个基于项目对象模型(POM)的项目管理工具,它可以帮助开发者自动化构建、依赖管理、项目报告等。Maven通过一个中央信息片段能够管理项目的构建、报告和文档等步骤,同时也能够管理项目的依赖。Maven的核心概念是POM…...

会议OA小程序【首页布局】

目录 一. Flex布局介绍 1.1 什么是Flex布局 1.2 基本概念 1.3 Flex属性 二. 会议OA首页轮播图的实现 配置 Mock工具 swiper 效果展示 三. 会议OA首页会议信息布局 index.js index.wxml index.wxss 首页整体效果展示 一. Flex布局介绍 布局的传统解决方案&#x…...

高效表达三步

一、高效表达 高效表达定主题搭架子填素材 第一: 1个核心主题,让别人秒懂你的想法 (表达要定主题) 第二: 3种经典框架,帮你快速整理表达思路 第三: 2种表达素材,让发言更具说服力…...

怎样修改ESP32的CPU主频

ESP32的主频默认设置为160mhz,但ESP32最高可以跑到240mhz, 修改方法: idf.py menuconfig --> Component config --> ESP System Settings --> CPU frequency 可以看到三个选项,80,160, 240&…...

《视觉 SLAM 十四讲》V2 第 10 讲 后端优化2 简化BA 【位姿图】

文章目录 第10讲 后端210.1 滑动窗口滤波 和 优化10.1.2 滑动窗口法 10.2 位姿图10.3 实践: 位姿图优化本讲 CMakeLists.txt 10.3.1 g2o 原生位姿图 【Code】10.3.2 李代数上的位姿优化 【Code】 习题10题1 【没推完】 LaTex 第10讲 后端2 滑动窗口优化 位姿图优化…...

【斗破年番】再遭群嘲,美杜莎怀孕之事被魔改,三方联手除萧潇?

【侵权联系删除】【文/郑尔巴金】 斗破苍穹年番第67集已经更新了。和很多人一样,小郑也去看了,只是小郑万万没有想到,我满怀期待的去看这一集,这一集却能魔改成这样。魔改成什么样了呢?下面来分析下吧! 一&…...

字节面试题——计算机网络,附答案

1.TCP 三次握手和四次挥手 相关面试题: 计算机网络常见面试题总结(上) | JavaGuide(Java面试 学习指南) 为什么要三次握手?第 2 次握手传回了 ACK,为什么还要传回 SYN?为什么要四次挥手?为什么不能把服务器发送的 ACK 和 FIN…...

Flask Web 安装bootstrap失败pip install bootstrap

失败原因:网速太慢了 把公共wifi换成手机热点,成功:) 😃 更新:开了手机热点还是报下面的错,但是把科学上网关了,就成功了,反正就是网络问题...

可视化 | python可视化相关库梳理(自用)| pandas | Matplotlib | Seaborn | Pyecharts | Plotly

文章目录 📚Plotly🐇堆叠柱状图🐇环形图🐇散点图🐇漏斗图🐇桑基图🐇金字塔图🐇气泡图🐇面积图⭐️快速作图工具:plotly.express🐇树形图&#x1f…...

黑豹程序员-架构师学习路线图-百科:Java的第二春Spring框架

文章目录 1、 Spring的发展历史2、为什么Spring能霸屏?2.1、容器的设计2.2、通过四个策略2.3、三种方式 3、学习编程设计的典范 1、 Spring的发展历史 正当SUN公司的EJB在全球开始热炒时,正当程序员纷纷转型EJB开发时,正当程序员为跑通EJB程…...

C#获取指定软件安装路径

作用 每个电脑安装的路径不一致会导致无法动态获取指定软件的安装路径,通过注册表来获取安装路径 代码 RegistryKey registryKeyPro Registry.LocalMachine.OpenSubKey("SOFTWARE\\****"); string installDir (string)(registryKeyPro.GetValue(&quo…...

统计射击比赛成绩

题目描述 给定一个射击比赛成绩单,包含多个选手若干次射击的成绩分数,请对每个选手按其最高3个分数之和进行降序排名,输出降序排名后的选手ID序列。 条件如下 ① 一个选手可以有多个射击成绩的分数,且次序不固定。 ② 如果一个选手成绩少于3个,则认为选手的所有成绩无效…...

flink的TwoPhaseCommitSinkFunction怎么做才能提供精准一次保证

背景 TwoPhaseCommitSinkFunction是flink中基于二阶段事务提交和检查点机制配合使用实现的精准一次的输出数据汇,但是想要实现精准一次的输出,实际使用中需要注意几个方面,否则不仅仅达不到精准一次输出,反而可能导致数据丢失&am…...

CMake系列讲解(入门篇)1.8 基础命令CMake-set() unset()

基础命令set() unset() 〓〓〓〓〓〓〓〓踏实学CMake总目录〓〓〓〓〓〓〓〓〓〓 8. set() unset() 在CMake中&#xff0c;set用于设置变量的值。这个变量可以为普通变量、Cache或者是环境变量。 如果提供了一个或多个 <value> 参数&#xff0c;则将 <variable> 设…...

【C++ 学习 ㉙】- 详解 C++11 的 constexpr 和 decltype 关键字

目录 一、constexpr 关键字 1.1 - constexpr 修饰普通变量 1.2 - constexpr 修饰函数 1.3 - constexpr 修饰类的构造函数 1.4 - constexpr 和 const 的区别 二、decltype 关键字 2.1 - 推导规则 2.2 - 实际应用 一、constexpr 关键字 constexpr 是 C11 新引入的关键字…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...