zoukankan      html  css  js  c++  java
  • JMeter java模拟多用户高并发请求测试(json,form表单)

    1.情景展示

      在实际开发过程中,需要进行测试的时候,往往需要进行压力测试,或者高并发情况下,同时对一张表数据进行修改、读取操作,程序会不会出现多个用户取出的数据一致,或者修改次数与实际请求数不一致等问题。

    2.分析

      如果在项目中写多线程模拟并发请求,并不是很好,还需要自己写代码,来回修修改改;

      有一个工具就可以很好的模拟出高并发请求,供我们直接使用:JMeter,开源、免费;

      使用前提:JAVA运行环境

    3.JMeter下载及安装

      下载

      下载地址见文末推荐。

      这里需要注意的是:

      点击“Download Releases” ,出现的当前永远最新版本,红框里会标注:当前版本运行的java最低版本;

      Linux系统下载*.tgz文件,windows系统下载*.zip文件;

      至于想要下载历史版本,不知道在哪里藏着。

      安装

      下载成功后,解压到想要存放的位置,比如:D盘

      和tomcat一样,只要你配置了JAVA_HOME环境变量,它就能运行(只要java版本号>=JMeter的最低要求,启动就不存在闪退的情况)。

      如何查看当前环境下配置的jdk版本?见文末推荐。

      双击运行jmeter.bat文件即可。

      此时,会启动两个程序;

      使用java编写的图形界面

      这俩是同一个程序,关闭其中任何一个,另一个也会跟着关闭。

      下面,切入正题。

    4.模拟多用户高并发请求(json请求)

      第一步:创建线程组;

      选中TestPlan,右键,Add,添加线程组。

      设置线程组参数。

      这里配置为:10个线程,同时启动,循环1次。

      第二步:新增http请求默认值;

      新增http请求默认值,所有的请求都会使用设置的默认值;

      设置协议为http,IP为localhost,端口为8080,项目访问路径(请求上下文)设置为/,请求字符集设置为UTF-8;

      大家根据自己的实际需要进行配置,嫌费事的可以是不添加http默认请求配置,在请求单独配置也是没有问题的。

      第三步:配置请求头

      设置请求头为application/json,目的是:告诉服务器,我发送的json数据。

      Content-Type:application/json

      以上信息复制到剪贴板,选择:Add From Clipboard,即可自动将以上内容填充进去。

      也可以自己手动配置,点击底部“Add”,会增加一栏,双击进去,输入内容即可。

      需要说明的是:如果想要发送JSON请求

      这一步不能省略,否则,服务器会将请求数据当做"text/plain"来识别。 

      第四步:添加Http请求

      必须选中“Thread Group”,才能添加“HTTP Request”

     

      我这里需要将请求方式改为POST,请求地址,字符集;

      选择“Body Data”,添加即将请求的JSON数据。

      第五步:添加监听器;

      这里添加三种:聚合报告、图形结果、用表格查看结果,区别在于结果展现形式不同。

      第六步:执行,并查看结果;

      红框里,是我们所建立的所有配置;

      点击菜单栏的绿三角,就会立刻发送请求;

      这个提示的意思是:在执行(发送请求)之前,是否进行保存的友好提示;

      选择No,是不影响请求的执行哒。

      执行结束后,看三个监听器的返回结果。

      一般情况下,我们还会查看服务器的返回结果,所以,再添加一个监听器:结果树。

      切换到结果树视图,选中返回类型为JSON,选中其中一个请求,Response Body里面将会是格式化后的JSON数据(当然了,这是要取决于服务器返回给咱的是什么格式的数据)

      这里接收到的中文是乱码,也不知道是什么情况。

       

      第七步:清空监听记录,重新请求;

      再次请求时,这些监听器的记录是一直叠加的;

      如果想要清空这些监听器的记录的话,点击“clear”,只清空当前选中的监听器;点击“Clear All”会清空所有添加的监听记录。

      这种方式更快捷

      注意:

      到此为止,我们只是模拟了一个用户,而不是多个用户,换言之,其实是同一个用户的并发请求。

      第八步:多用户并发JSON请求;

      同样地,选中“Thread Group”,新建一个http请求

      红框里,可以换个名字,方便区分;

      其它配置基本一样,除了请求的json数据改一下就可以啦。

      清空记录,发送请求,查看结果

      此时,每个请求都并发了10次,相当于每个用户同时发送了10条请求。

      如果想要模拟10个不同的用户并发,我们可以创建10个HttpRequest,确保每个请求里面的数据都不一样,线程修改成:1

      这样,就确保了10个用户并发请求,且每个用户只请求1次。

      第九步:保存当前配置文件。

      按快捷键:Ctrl+S

    4.模拟多用户高并发请求(form表单请求)

      第一步:创建线程组;

      同上

      第二步:新增http请求默认值;

      同上   

      第三步:添加数据源;  

      新建一个文本文件,名字随意,比如:config.txt;

      目的:该文件用于配置用户信息(其实就是请求参数);

      里面数据每行有两个值,userIduserToken,中间用逗号隔开,我这里设置了两个用户的信息。

     

      第三步:新建Csv Data Set Config设置;

      目的:引用上面的数据源文件。

      Csv Data Set Config中引用配置文件config.txt,并定义变量名为userIduserToken(名称随意,只要一会和下面保持一致就可以啦)

      第四步:选中“Thread Group”,新建一个http请求;

      同上

      在请求中引用配置文件中的变量:

      在填写参数Value的地方不要将值写死,而是写为${变量名}这种格式,我这里想要引用配置文件中userToken的值,所以写为${userToken}

     

      至此,配置完毕,我们不用再像并发json那样配置多个请求,才能模拟出不同用户的并发。因为我们在配置文件config.txt,几行记录就代表几个用户。

      第五步:测试

      方法同上。

    2020-12-10

    5.多用户并发JSON请求(动态配置多个用户)

      今天又研究了一下,其实,json请求参数也可以配置成类似于form表单请求那样;

      与form请求不一致的地方在于:我们需要确定好发请求的框架,

      比如,请求入参长这个样子:

      我们不改key(key的名称固定),只把对应的value改成动态获取就可以啦。

      下面,一起来看下吧:

      第一步:配置数据源

      新建一个文本文件,名称随意,比如:还叫config.txt。

      确定好,设置几个动态变量的值,我只需要“PartyCode”和“Code”这两个key对应的值是变化的,从这个文本文件取值;

      第一行,可以设置参数名称,让JMeter获取变量名字时,从第一行取(可以不加);

      一行代表一个用户所对应的参数,多个用户需要配置多个请求数据源,行末不要有多余字符;

      同一行数据,多个参数之间使用逗号隔开,不要有多余字符;

      如果key所对应的value是字符串的话,需要我们在配置数据的时候手动加上英文状态下的双引号(字符串,必须加);

      如果不加,在发送数据的时候也是不会加的,换句话说,通过变量取参数值的方式,数据会保持完全一致,并不会进行参数值格式检验;

      举个例子:

      明明是字符串,却不主动加双引号;

      字符串加上了双引号

      第二步:创建csv数据配置

      1.导入文件:点击浏览,选择刚才的数据源配置文件;

      2.文件字符集:设置成UTF-8;

      3.变量名称:定义参数名称,会通过该名字获取对应的数据,多个变量之间使用逗号隔开;

      需要注意的是:变量的数量需要与每一行的实际的value数量保持一致(有几个逗号,就配几个变量名称)

      4.忽略第一行:这个默认值是false,意思是,把第一行也当成数据源。

      注意:其实,第三和第四项设置是结合使用的。

      5.1 假如,我们在配置文件(数据源文件)里的第一行添加了变量名,那么,我可以第三项不填,第四项设为false(实际上我这里也加上了);

      如果不想用数据源文件,那我需要在第三项重新配置变量名称,第四项改为true;

      5.2 当我们没有在配置文件添加变量名称时,换句话说就是:第一行就是数据源,那我们就在第三项配置变量名,再把第四项改为true;

      第三步:新建请求配置

      如果,你是按照我的操作步骤来的,那么线程组下面就会多出两个请求配置

      首先,禁用之前的请求配置;

      选中请求,右键,禁用

      之所以禁用,是因为:方便查看运行结果。 

      其次,新建请求(方法,上面有)

      在需要动态引用数据的地方,通过el表达式${变量名},此时就不能再加双引号啦,加上就被当成字符串啦!

      第四步:运行并检验执行结果。

      模拟两个用户的并发请求(共10次)  

     

      我们会发现:

      通过这种动态配置数据的方式,从配置文件取出来的数据并不是按保存时的顺序取的,换句话说,就是随机的,这样,更加接近真是请求。

    6.修改内存配置

      2020-12-14

      今天应实际需求,有7738条数据完成远程调用,所以我就想到了使用JMeter来完成,后台开启多线程异步请求,mysql数据库表创建索引,避免锁表情况的发生。

      然鹅,当我开启7738个线程的时候,报错:内存溢出;

      所以,只能修改原有的内存参数配置:

      JMeter_HOME/bin/jmeter.bat文件,选中,右键编辑,Ctrl+"F搜索:HEAP,找到:

      if not defined HEAP,在它的上面添加参数:

    ::在这里添加/修改内存
    set HEAP=-Xms512m -Xmx1024m  

      事实证明,虽然可以同时开启7000多个线程,但是执行起来,内存还是不够,所以,我把-Xmx的值改成了2048m,在很短的时间内就执行完毕了,真爽!

    写在最后

      哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

     相关推荐:

  • 相关阅读:
    38.进程及同步异步的概念理解
    37.图灵接口及电脑语音聊天
    36.HTTP协议
    35.百度云语音识别接口使用及PyAudio语音识别模块安装
    34.TCP非阻塞连接及套接字异常处理丶端口扫描脚本
    33.TCP协议概念/scapy模块doos攻击
    32.网络编程TCP/UDP服务
    python递归函数实现阶乘函数
    用户不在sudoers文件中怎么办,ziheng is not in the sudoers file解决方法
    SecureCRT连接阿里云ECS服务器,经常掉线的解决方案
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/14110839.html
Copyright © 2011-2022 走看看