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;
目的:该文件用于配置用户信息(其实就是请求参数);
里面数据每行有两个值,userId和userToken,中间用逗号隔开,我这里设置了两个用户的信息。
第三步:新建Csv Data Set Config设置;
目的:引用上面的数据源文件。
Csv Data Set Config中引用配置文件config.txt,并定义变量名为userId和userToken(名称随意,只要一会和下面保持一致就可以啦);
第四步:选中“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,在很短的时间内就执行完毕了,真爽!