NetCore IIS Redis JMeter 登录压力测试
近期,由于某项目验收需要,需要登录接口同时满足至少400个账号同时并发登录,于是开始编写测试代码,以满足项目业务需要。首先,安装jdk,由于本机已安装jdk8:

如果你机器上没有安装jdk,请百度自行安装一下,因为JMeter由java编写,JMeter安装:
Windows 安装 jmeter-CSDN博客
安装redis,可以百度也可以参考之前发布的文章:部署.net6 到 Windows server 2008 r2 IIS_csdn_aspnet的博客-CSDN博客
编写测试webapi登录接口代码:
1.写入redis测试账号:
/// <summary>/// 添加或移除测试账号/// </summary>/// <param name="isDel">0:添加账号 1:移除账号</param>/// <returns></returns>[HttpPost]public async Task<ActionResult> AddYhzhRedis(int isDel = 0){string sKey = "YH";if (isDel == 1){for (int i = 0; i < 500; i++){int nId = i + 1;string sYhm = "admin_" + nId;await _cache.RemoveAsync(sKey + ":" + sYhm);}return Ok(new{code = 200,success = true,msg = "移除测试账号成功!"});}Yhzh yhzh = null;for (int i = 0; i < 500; i++){int nId = i + 1;yhzh = new Yhzh();yhzh.id = nId;yhzh.yhm = "admin_" + nId;yhzh.mm = MD5Helper.MD5Encrypt32(nId + "123456");await _cache.SetAsync(sKey + ":" + yhzh.yhm, yhzh, TimeSpan.FromHours(24));var vId = await SqlSugarHelper.Db.Insertable(yhzh).ExecuteReturnBigIdentityAsync();}return Ok(new{code = 200,success = true,msg = "添加测试账号成功!"});}
代码中_cache 为注入的redis缓存接口,可自行编写或使用第三方包,MD5Helper.MD5Encrypt32 你可以在网络上找一个md5加密帮助类即可。
2.登录接口实现:
/// <summary>
/// 登录
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPost]
public async Task<ActionResult> Login([FromBody] LoginVM model)
{string sKey = "YH:";if (await _cache.GetAsync(sKey + model.yhm)){var vCacheModel = await _cache.GetAsync<Yhzh>(sKey + model.yhm);if (null == vCacheModel){return Ok(new{code = 400,success = false,msg = "登录失败,用户不存在!"});}string sAfferentPwd = MD5Helper.MD5Encrypt32(vCacheModel.id + model.mm);if (sAfferentPwd != vCacheModel.mm){return Ok(new{code = 400,success = false,msg = "登录失败,用户或密码不正确!"});}//TODO:生成新的token 存储缓存信息return Ok(new{code = 200,success = true,msg = "登录成功!"});}var vUserModel = await SqlSugarHelper.Db.Queryable<Yhzh, Yhxx, Dwxx>((zh, yh, dw) =>new JoinQueryInfos(JoinType.Left, zh.yhid == yh.id && yh.sczt == 0, JoinType.Left, zh.dwbh == dw.dwbh && dw.sczt == 0)).Where((zh, yh, dw) => zh.yhm == model.yhm || yh.lxdh == model.yhm || yh.jh == model.yhm).Where((zh, yh, dw) => zh.sczt == 0).Select((zh, yh, dw) => new YhzhxxVM{id = zh.id,yhid = zh.yhid,xm = yh.xm,yhm = zh.yhm,mm = zh.mm,lxdh = yh.lxdh,//yhtx = zh.yhtx,yhtx = yh.yhtx,dwbh = zh.dwbh,dwmc = dw.dwmc,qhbm = dw.qhbm,sfxtzh = zh.sfxtzh,zhzt = zh.zhzt,sfkdldp = zh.sfkdldp}).FirstAsync();if (null == vUserModel){return Ok(new{code = 400,success = false,msg = "登录失败,用户名不存在!"});}string sUserPwd = MD5Helper.MD5Encrypt32(vUserModel.id + model.mm);if (sUserPwd != vUserModel.mm){return Ok(new{code = 400,success = false,msg = "登录失败,用户名或密码错误!"});}Dictionary<string, string> dicUserInfo = new Dictionary<string, string>{{ "zhid",vUserModel.id.ToString()},{ "userid",vUserModel.yhid.ToString()},{ "dwbh",vUserModel.dwbh??""},{ "dwmc",vUserModel.dwmc??""},{ "qhbm",vUserModel.qhbm??""},{ "username",model.yhm??""},{ "xm",vUserModel.xm??""},{ "nickname",vUserModel.nc??""},{ "lxdh",vUserModel.lxdh??""},{ "yhtx",vUserModel.yhtx??""},{ "jsmc",""},{ "jsid",""},{ "sfxtzh",vUserModel.sfxtzh==null?"0":vUserModel.sfxtzh.ToString()},{ "logintime",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},{ "tokenExpire",DateTime.Now.AddSeconds(AppSettings.CustomToken.KeyTimeEffectiveTime).ToString("yyyy-MM-dd HH:mm:ss")},};var vUserInfo = JsonHelper.ToJson(dicUserInfo);string sToken = Guid.NewGuid().ToString("N");await _cache.SetAsync(sToken, vUserInfo, TimeSpan.FromMinutes(10));return Ok(new{code = 200,success = true,msg = "登录成功!"});}
代码中 SqlSugarHelper使用的第三方 SqlSugar包实现,此类代码如下:
/// <summary>
/// 不能是泛型类
/// </summary>
public class SqlSugarHelper
{//多库情况下使用说明://如果是固定多库可以传 new SqlSugarScope(List<ConnectionConfig>,db=>{}) 文档:多租户//如果是不固定多库 可以看文档Saas分库//用单例模式public static SqlSugarScope Db = new SqlSugarScope(new ConnectionConfig(){ConnectionString = "server=127.0.0.1;Database=db;Port=3306;Uid=mysqladmin;Pwd=20231024;Persist Security Info=True;SslMode=None;charset=utf8mb4;",//连接符字串DbType = DbType.MySql,//数据库类型IsAutoCloseConnection = true //不设成true要手动close},db =>{//(A)全局生效配置点,一般AOP和程序启动的配置扔这里面 ,所有上下文生效//调试SQL事件,可以删掉db.Aop.OnLogExecuting = (sql, pars) =>{Console.WriteLine(sql);//输出sql,查看执行sql 性能无影响//5.0.8.2 获取无参数化 SQL 对性能有影响,特别大的SQL参数多的,调试使用//UtilMethods.GetSqlString(DbType.SqlServer,sql,pars)};//多个配置就写下面//db.Ado.IsDisableMasterSlaveSeparation=true;//注意多租户 有几个设置几个//db.GetConnection(i).Aopvar vIsConnection = db.Ado.IsValidConnection(); //如果时间长,可以在连接字符串配置 连接超时时间Console.WriteLine("vIsConnection:"+ vIsConnection);});
}
打开swagger开始写入账号数据:

redis写入成功:

数据库写入成功:

启动JMeter,进入JMeter的bin目录,右键使用管理员身份运行jmeter.bat文件即可:

启动成功如下图:

修改名称,你可以使用默认名称,本测试修改为登录并发测试,在左侧登录并发测试节点右键添加线程组,如下图:

在左侧登录并发测试节点右键分别添加HTTP信息头管理器,HTTP请求默认值,CSV Data Set Config,如下图:

HTTP信息头管理,没有你可以不添加,点击添加后双击名称列单元格即可输入:

HTTP请求默认值,本次测试只填写红框内参数,IP和端口换成你自己的即可,其余默认:

CSV Data Set Config,如下图:

以上截图中 变量名称 后续会用到,csv文件内容其实就是上面代码中创建的账号信息,使用sql在数据库执行拼接登录名:
SELECT yhm FROM jc_yhzh1;
在查询结果中全选、右键- 复制为- 制表符分隔值(数据),粘贴到txt中,将txt扩展名修改为csv即可。

修改完成后,打开csv文件如下:

在左侧线程组节点右键添加HTTP请求,如下图:

配置信息如下:

请求报文中,${name}为变量,上面选择csv设置的,要一致。
在登录并发测试节点,右键添加查看结果树和聚合报告,添加即可不需要配置:


添加完成后,在线程组右键-启动:

启动后开始执行,绿色的三角变为灰色:

点击查看结果树:


两个截图请求明显登录账号不一样,说明一次600请求是正常的,返回结果如下:

点击聚合报告,异常0.00%,符合预期结果:

至此测试任务完成,将业务过程搬到正式环境代码,改写相关业务接口。
相关文章:
NetCore IIS Redis JMeter 登录压力测试
近期,由于某项目验收需要,需要登录接口同时满足至少400个账号同时并发登录,于是开始编写测试代码,以满足项目业务需要。首先,安装jdk,由于本机已安装jdk8: 如果你机器上没有安装jdk,…...
进一步了解视频美颜SDK:美颜SDK的技术原理
美颜技术在当今的数字世界中变得越来越流行,尤其是在视频直播、社交媒体和视频通话应用中。用户寻求通过美颜效果增强自己的外观,这种需求催生了众多美颜SDK(软件开发工具包)的出现。这些SDK使开发者能够轻松地将美颜功能集成到他…...
【Qt之QSetting】介绍及使用
概述 QSettings类提供了一种持久的、与平台无关的应用程序设置存储功能。 用户通常期望一个应用能在不同会话中记住其设置(窗口大小和位置,选项等)。在Windows上,这些信息通常存储在系统注册表中;在macOS和iOS上&…...
基于WebRTC构建的程序因虚拟内存不足导致闪退问题的排查以及解决办法的探究
目录 1、WebRTC简介 2、问题现象描述 3、将Windbg附加到目标进程上分析 3.1、Windbg没有附加到主程序进程上,没有感知到异常或中断 3.2、Windbg感知到了中断,中断在DebugBreak函数调用上 3.3、32位进程用户态虚拟地址和内核态虚拟地址的划分 …...
通过jdk自制https证书并配置到nginx并配置http2
生成证书 这里使用自己生成的免费证书。在${JAVA_HOME}/bin 下可以看到keytool.exe,在改目录打开cmd然后输入: keytool -genkey -v -alias lgq.com -keyalg RSA -keystore d:/zj/ssl/fastfly.com.keystore -validity 3650生成证书过程中:【你的名字】对…...
祝贺中国煤科重庆研究院和达索、百世慧PLM项目顺利结项
引言 2023年10月17日,中国煤科重庆研究院与达索系统、百世慧在重庆研究院会议室召开了产品全生命周期管理(PLM)系统结项会。中国煤科重庆研究院科技发展部副主任孙海涛、测控技术研究分院副院长于庆、重庆大学教授鄢萍、达索公司工业装备部南…...
基于springboot实现数码论坛系统设计与实现系统【项目源码+论文说明】
基于springboot实现数码论坛系统设计与实现系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把数码论坛与现在网络相结合,利用java技术建设数码论坛系统,实现数码论坛的信息化。则对于进一步提高数码论坛发展,丰富数码论坛经验能起…...
魔域开服需要什么样的配置
魔域是一个非常受玩家喜欢的游戏,是一款大型魔幻题材的网络游戏,关于魔族入侵亚特大陆的故事,玩家在游戏里扮演不同的角色捍卫大陆安全,很多玩家想要更多的体验就会选择开新服,今天就让小编来讲一讲魔域开服要什么配置…...
7个好用的PC端设计软件,设计必看!优漫动游
身为设计师的你是不是还在为到处寻找合适的设计软件而烦恼?是不是在为因为没能用上好的软件而影响自己设计生涯的事情感到焦虑?别担心,你的烦恼可能每个成熟的设计师都遇到过,但他们最终都走了过来。借助以下7个好用的PC端设计软件…...
10-动画animation
动画animation 动画-过渡和动画之间的异同-animation-name 指定要绑定到选择器的关键帧的名称,告诉系统需要执行哪个动画-animation-duration 动画指定需要多少秒或毫秒完成,告诉系统动画持续的时长-animation-timing-function 设置动画将如何完成一个周…...
【带头学C++】----- 1.基础知识 ---- 1.24 逻辑控制语句
1.24 逻辑控制语句 本节主要学习关于C逻辑控制的一些语句的用法,结合实践代码总结一下。 1.24.1 if以及if - else(条件语句) 1.if语句: if(条件){执行语句; }//一旦执行if语句,先判断()里的条件是否满足,…...
微信公众号分销商城源码系统+多元商家+收银台 带完整的搭建教程
给大家推荐一款微信公众号分销商城源码系统,这是一个全新三级分销商城,功能十分丰富。一起来看看你吧。 微信公众号分销商城的功能: 1.商品展示和推广:商家可以在商城中展示商品信息,包括商品名称、价格、库存等&#…...
排序算法:选择排序,分别用c++、java、python实现
选择排序介绍 选择排序(Selection Sort)是一种简单的比较排序算法,它的工作原理如下: 分区: 将待排序的数组分成两个部分,一个部分是已排序的子数组,另一个部分是未排序的子数组。初始时,已排序…...
支付宝支付接入流程
一、 接入准备 支付宝支付流程没有微信那么复杂,而且支付宝支持沙箱。登录支付宝开放平台控制台 点击开发工具中的沙箱 接口加密方式,我这里使用的是自定义密钥。生成密钥的方式 使用支付宝官方提供的密钥工具,唯一要注意的是支付宝密钥工具…...
管理员|顾问必看!8个Salesforce权限集的最佳实践
Salesforce中的权限一直始终是热门话题。权限集是简档的附加。它们通常具有相同的设置,用于增加用户的权限,使其超过简档提供的权限。可以将简档视为许多用户共有的基本权限集,而权限集是部分用户需要的额外权限。 本篇文章将介绍Salesforce…...
【linux进程(六)】环境变量再理解程序地址空间初认识
💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:Linux从入门到精通⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你学更多操作系统知识 🔝🔝 程序地址空间 1. 前言2. 在ba…...
10步开启SAFe敏捷发布列车
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 敏捷畅想一、培训 SAFe 项目顾问 (SPC)二、培训精益敏捷领导者三、 举办价值流研讨会并确定您的第一个敏捷发布系列四、 定义/设置 ART 和团队五、 担任重要角色六、…...
面试题之Vue和React的区别是什么?
一提到前端框架,相信大家都对Vue和React不陌生,这两个前端框架都是比较主流的,用户也都比较多,但是我们在使用这些框架的时候,是否对这两个框架之间的区别有所了解呢?接下来,让我们来一起的系统…...
Linux基础知识——概述和常用文件管理命令
Linux基础知识——概述和常用文件管理命令 文章目录 Linux基础知识——概述和常用文件管理命令概述常用的一些文件指令 概述 终端:一个terminal窗口就是以个屏幕, 远程连接了一个服务器, 每一个terminal可以连接到任何一个其他服务器上;关掉terminal相当于只是关掉…...
腾讯云创建了jenkins容器,但无法访问
1、首先,查看本机能不能ping通你的腾讯云服务器 如果ping的通那就下一步 2、查看腾讯云服务器的防火墙关了没,没关关掉、 firewall-cmd --state not running 3、那就在云服务器的控制台开放端口...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
