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,在很短的时间内就执行完毕了,真爽!

 

写在最后

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

 相关推荐:

 

posted @ 2020-12-09 21:02  Marydon  阅读(5925)  评论(2编辑  收藏  举报