• jmeter之准确并发



    我刚开始也是走了很多弯路,网上也没有具体的教程。
    通过自己的发掘,终于尝试的发现了一种方法,可能不是很专业,有什么错误的地方,还需大家提出,我也跟着学习学习。
    下面以实战的方式,为大家演练!
    1 如下图,找到了一个接口,现在想让这个接口并发为50,持续一分钟
    线程组设置如图

     

     

    注意如果你这样设置了,就去跑的话,你会发现并发很大,根本不是50并发
    为什么会这样呢
    这里我把线程组里面的几个参数给大家理理
    1 线程组:我们直接可以理解为多少个用户—— 一般和你的并发数相等
    2 Ramp-ups时间:规定时间的跑完所有请求
    3 循环次数:线程组循环多少次——你设置线程组为50,循环10次,就会有500个请求
    如图上我所设置的,Ramp-up时间为1,他就会1s内,跑完所有所有请求。
    然而我设置的循环次数为——永久
    所有请求=循环次数线程数 :所以这个数是无穷大的
    我们JMter就会1s内能跑多少就跑多少
    *
    那我们怎么办呢
    **2 下面为大家说一下,我走过的第一个弯路,我的设置如下

     

    根据我上面所说的:
    这样设置的话,它是不是会在(Ramp-up时间)60s跑完(线程组)50*循环次数(60)个请求,这样是不是50并发/s
    理想状态这种方法是可以的,但是你可以吧线程组设置成1,并发60s试试,你会发现JMeter根本不会听你的,他几秒就跑完了,说明这种方法是不准确的。
    3 准确的吞吐量定时器
    通过自己的尝试,发现了这个准确的吞吐量定时器,顾名思义,这个就是控制吞吐量的

     

    像以上图这样设置的情况下,我们无法控制并发,但是能控制时间
    准确的吞吐量定时器 能控制并发,添加在接口下面,如图

     

    4 查看是否达到效果

     

    达到了效果,这里jmeter会有一点偏差,我个人觉得是正常的,因为JMter也是软件,你要他准确控制它1s为多少并发,没有一点偏差,我觉得不太现实。当然少数并发还是可以控制住的。你可以试试10并发,压60s,结果还是准确的。

    因为项目的原因,假设我们要实现如下要求:从数据库的用户表里获取用户信息,并作为参数全部传递给登录请求,分别完成登录操作。

     

    01

    Jmeter连接数据库

     

    1、添加JDBC Connection Configuration

     

    (右键测试计划-->配置元件-->JDBC Connection Configuration)

     

    2、配置数据库连接信息,其中

     

    DataBase URL: 

     

    jdbc:mysql://192.168.88.130:3306/dataname?useUnicode=true&characterEncoding=utf-8

     

    1)192.168.88.130:3306为数据库的地址和端口号;dataname为数据库名

     

    2)useUnicode=true&characterEncoding=utf-8 指定字符的编码解码格式utf-8

     

    JDBC Driver Class : 

     

    com.mysql.jdbc.Driver 此为mysql数据库的驱动

     

    Username: 数据库的登录用户名

     

    Password: 数据库的密码

     

     
    3、导入mysql驱动包

     

    下载好mysql的驱动包(mysql-connector-java-5.1.7-bin.jar),

     

    放到jmeter的lib目录下

     

    选中测试计划,添加mysql驱动包

     

     

    02

    添加Jdbc请求

     

    添加jdbc请求并设置变量

     
    1、添加线程组-->右键线程组-->添加jdbc request,并做好设置

     

     
    2、添加Debug PostProcessor用于查看变量phone值的获取,添加查看结果树并运行;得到以下结果。
     
    说明jmeter发起的jdbc请求及变量设置正常

     

     

     

     

    03

    循环读取库的用户信息

     

    实现循环读取库的用户信息,并传递到下一个登录请求

     

    接下来就要思考怎么将查库得到的用户手机号,作为参数传递给下一个登录请求。

     

    这里需要引用到 ForEach控制器

     

    1、添加ForEach控制器(右键线程组-->逻辑控制器-->ForEach控制器),并先尝试如下设置

     

     

    输入变量的前缀:phone; 

     

    从之前的jdbc request设置的变量得知,我们要取的值为phone_1、phone_2、phone_3......,所以这里输入phone

     

    Start index for loop:0;

     

    变量循环启动的索引,第一个元素起始索引+1

     

    End index for loop:6; 

     

    变量循环结束的索引。

     

    所以这里是取值phone_1、phone_2、...、phone_6

     

    输出的变量名称:t_phone; 

     

    用于替换循环下的请求的变量

     

    2、在ForEach控制器下添加登录请求,并进行变量引用

     

     

    3、运行后,查看结果,成功从库里获取了前6个用户手机号,并分别成功登录

     

     

    以上这种处理需要自行查库获知总共有多少个用户,再去设置ForEach控制器的End index for loop值(设置为用户总数),就可以将库里所有用户进行参数传值登录了;

     

    问题:能不能jmeter自动去获知数据库表的用户数,然后去循环取值进行登录呢?

     

    当然可以,先用jdbc request查出用户数,再直接对ForEach控制器的End index for loop值进行设置就ok了

     

    实操:

     

    a、添加一个jdbc请求,查询用户表的用户总数,并设置变量count

     

     

    b、设置ForEach控制器的End index for loop值

     

     

    c、运行,查看结果成功

     

     

    本文由柠檬班土豆老师原创,转载需注明出处!

  • 相关阅读:
    Spring如何处理线程并发问题?
    什么是spring?
    如何通过sql语句完成分页?
    哪一个List实现了最快插入?
    请说出作用域public,private,protected,以及不写时的区别?
    使用什么命令查看用过的命令列表?
    静态变量和实例变量的区别?
    使用什么命令查看磁盘使用空间? 空闲空间呢?
    什么是 Mybatis?
    是否可以继承String类?
  • 原文地址:https://www.cnblogs.com/fcc-123/p/11096456.html
Copyright © 2020-2023  润新知