NetCore IIS Redis JMeter 登录压力测试

news2024/9/29 11:30:31

近期,由于某项目验收需要,需要登录接口同时满足至少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).Aop

      var 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%,符合预期结果:

至此测试任务完成,将业务过程搬到正式环境代码,改写相关业务接口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1129954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

php简单后门实现及php连接数据库

php简单后门实现 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>easybackdoor</title>…

vue项目中内嵌iframe,打包上线时候iframe地址如何写?

vue项目中内嵌iframe&#xff0c;打包上线时候iframe地址如何写 一、项目结构1.内嵌的iframe文件位置2.打包后的iframe的位置 二、代码 前提描述&#xff0c;项目是用webpack打包的&#xff0c;内嵌一个完整的js小组件 一、项目结构 1.内嵌的iframe文件位置 2.打包后的iframe的…

Centos8: 安装python2, 并设置默认版本

文章目录 原本centos上已经有python3.6了&#xff0c;因为要运行旧代码&#xff0c;需要安装python2版本。 #在CentOS 8上安装Python 2 sudo dnf install python2#设置默认Python版本 python2 sudo alternatives --set python /usr/bin/python2#设置默认Python版本 python3 sud…

互联网Java工程师面试题·Spring篇·第三弹

目录 ​编辑 4、注解 4.1、什么是基于注解的容器配置 4.2、如何在 spring 中启动注解装配&#xff1f; 4.3、Component, Controller, Repository,Service 有何区别&#xff1f; 4.4、Required 注解有什么用&#xff1f; 4.5、Autowired 注解有什么用&#xff1f; 4.6、…

第十三章 枚举类型与泛型总结

13.1 枚举类型 枚举类型是一种特殊的数据类型&#xff0c;它允许一个变量只能取预先定义好的一组离散值中的一个。在许多编程语言中&#xff0c;枚举类型通常用于表示具有一定范围内固定取值的情况&#xff0c;例如星期几、月份等。 13.1.1使用枚举类型设置常量 在Java中&am…

Ps:消除锯齿与修边

由于像素是方形的&#xff0c;在创建椭圆等带弧形的选区时容易在选区边缘产生锯齿。 Ps 中支持“消除锯齿” Anti-alias的选区工具有&#xff1a; 椭圆选框工具、套索工具、多边形套索工具、磁性套索工具、魔棒工具等。 勾选“消除锯齿”后&#xff0c;Ps 会在选区边界两侧约 1…

JoySSL:免费SSL证书的新选择

阿里云曾经提供了一年期的免费SSL证书&#xff0c;然而从下个月14号开始&#xff0c;阿里云不再提供免费的一年期SSL证书&#xff0c;而是改为68元/张/年&#xff0c;这对于很多网站建设公司需要大量基本证书来说&#xff0c;无疑是一种负担&#xff0c;又不知道该去哪里获取可…

vue首页多模块布局(标题布局)

<template><div class"box"><div class"content"><div class"box1" style"background-color: rgb(245,23,156)">第一个</div><div class"box2" style"background-color: rgb(12,233,…

关于nacos的配置获取失败及服务发现问题的排坑记录

nacos配置更新未能获取到导致启动报错 排查思路&#xff1a; 1、是否添加了nacos的启动pom依赖 参考&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><…

Redis数据类型——hash类型的应用场景

1.hash类型应用场景 redis中覆盖或者没成功都返回0 hsetnx 返回0表示不能覆盖。 2.业务场景

以太网链路聚合与交换机堆叠,集群

目录 以太网链路聚合 一.链路聚合的基本概念 二.链路聚合的配置 1.手工模式 2.LACP模式 系统优先级 接口优先级 最大活动接口数 活动链路选举 负载分担 负载分担模式 三.典型使用场景 交换机之间 交换机和服务器之间 交换机和堆叠系统 防火墙双机热备心跳线 四…

debian、ubuntu打包deb包工具,图形界面deb打包工具mkdeb

debian、ubuntu打包deb包工具&#xff0c;图形界面deb打包工具mkdeb&#xff0c;目前版本1.0 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1QX6jXNMYRybI9Cx-1N_1xw?pwd8888 md5&#xff1a; b6c6658408226a8d1a92a7cf93834e66 mkdeb_1.0-1_all.deb

修炼k8s+flink+hdfs+dlink(六:学习namespace,service)

一&#xff1a;什么是namespace&#xff1f; 你可以认为namespaces是你kubernetes集群中的虚拟化集群。在一个Kubernetes集群中可以拥有多个命名空间&#xff0c;它们在逻辑上彼此隔离。 他们可以为您和您的团队提供组织&#xff0c;安全甚至性能方面的帮助&#xff01; 二&a…

ubuntu tools

1 cloc calculate lines of your code sudo apt-get install cloccloc ./file

nodejs+vue备忘记账系统-计算机毕业设计

本文首先介绍了备忘记账系统管理技术的发展背景与发展现状&#xff0c;然后遵循软件常规开发流程&#xff0c;首先针对系统选取适用的语言和开发平台&#xff0c;目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章…

Windows电脑如何录制电脑桌面?

如果你使用的电脑是Windows系统&#xff0c;那你是不是想知道如何在Windows电脑上录制电脑桌面&#xff1f; 本文以win10为例&#xff0c;好消息是&#xff0c;Windows 10电脑自带录屏工具&#xff0c;你可以直接使用此录屏工具轻松录制视频&#xff0c;而无需下载其他第三方软…

题目 1009: [编程入门]数字的处理与判断(python详解)——练气二层后期

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f352;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; ✨…

批量合并视频、音频、文案,让你的视频更加丰富多彩

你是否曾经有过批量合并视频的需求&#xff0c;但是却苦于不知道如何下手&#xff1f;今天&#xff0c;我将为你介绍一个简单易行的方法&#xff0c;只需两个步骤&#xff0c;让你轻松实现批量合并视频。 第一步&#xff1a;下载并打开固乔智剪软件 首先&#xff0c;你需要下载…

【AI视野·今日Robot 机器人论文速览 第五十七期】Wed, 18 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Wed, 18 Oct 2023 Totally 17 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Underwater and Surface Aquatic Locomotion of Soft Biomimetic Robot Based on Bending Rolled Dielectric Elastomer Actua…

基于定容积法标准容器容积标定中的电动针阀自动化解决方案

摘要&#xff1a;在目前的六氟化硫气体精密计量中普遍采用重量法和定容法两种技术&#xff0c;本文分析了重量法中存在的问题以及定容法的优势&#xff0c;同时也指出定容法在实际应用中还存在自动化水平较低的问题。为了提高定容法精密计量过程中的自动化水平&#xff0c;本文…