一:安装
首先第一步下载安装包,官网下载地址https://jmeter.apache.org/download_jmeter.cgi,windows系统和linux用一个。注:jmeter5.4.3需要java8及以上版本。
解压压缩文件,进入bin文件夹下双击jmeterw.cmd打开jmeter界面。注带w的为无控制台的。
默认是英文的,不喜欢可以改中文,进入bin文件夹,找到jmeter.properties,用文本编辑器打开。搜索language,更改为language=zh_CN。重启jmeter。
右键添加线程组,然后设置线程数等
普通线程组只能固定压测的线程数这里推荐阶梯式线程组Stepping Thread Group,需要安装插件:
安装插件:
从官网Documentation :: JMeter-Plugins.org下载Plugins Manager
将下载好的jar包放到apache-jmeter-5.4.3\lib\ext文件夹下。
然后重新打开jmeter,依次点击如下:选项 -Plugins Manager - Available Plugins - jpgc - Standard Set。最后点击右下角的 应用 按钮,安装完成后jmeter自动重启,重启后添加线程组即可看到我们下载的组件。
有了线程组就可以创建http请求了。
首先添加信息头,再配置元件里:按照实际的请求类型配置json,还是x-www-form-urlencoded,和postman里面请求头类型差不多。如果信息头管理器放到线程组下,那么线程组下所有 HTTP 请求都会共享这些 HTTP 信息头,如果信息头管理器放到 HTTP 请求下,那么只有该请求拥有这些 HTTP 信息头。我常用的两个类型:
Content-Type | application/x-www-form-urlencoded |
---|---|
Content-type | application/json |
创建请求参数文件元件
以下字段描述内容来自:公众号 滑水的测开学习日记
「Filename」:文件名。test.dat文件名,保存参数化数据的文件目录,可选择相对或者绝对路径(建议填写相对路径(相对于bin目录),避免脚本迁移时需要修改路径)。如果直接写文件名,则该文件要放在bin目录中。对于分布式测试,主机和远程机中相应目录下应该有相同的CSV文件
「File encoding」:文件编码。er\csvtest.dat文件的编码格式,在保存时保存编码格式为UTF-8即可;
「Variable Names」:变量名。类似excel文件的文件头,起到标示作用,同时也是后续引用的标识符,建议采用有意义的英文标示;(如:有几列参数,在这里面就写几个参数名称,每个名称中间用分隔符分割,这里的 user,pwd,可以被利用变量名来引用:{pwd};
「Ignore first line」: 是否忽略首行。果csv中第一行是表头,而不是参数化用的数据,这里要选择True。
「limiter」:参数文件分隔符。默认是 “,”。用来在“Variable Names”中分隔参数,与参数文件中的分隔符保持一致即可。
「Allow quoted data?」:是否允许变量使用双引号,允许的话,变量将可以括在双引号内,并且这些变量名可以包含分隔符
「Recycle on EOF?」:是否循环读取参数文件内容;因为CSV Data Set Config一次读入一行,分割后存入若干变量中交给一个线程,如果线程数超过文本的记录行数,那么可以选择从头再次读入;
Ture:为true时,当已读取完参数文件内的测试用例数据,还需继续获取用例数据时,此时会循环读取参数文件数据(即:读取文件到结尾时,再重头读取文件);
False:为false时,若已至文件末尾,则不再继续读取测试数据;通常在“线程组线程数* 线程组循环次数>参数文件行数”时,选用false(即:读取文件到结尾时,停止读取文件);
8.「Stop thread on EOF?」:遇到文件描述符停止线程。当Recycle on EOF为False时(读取文件到结尾),停止进程,当Recycle on EOF为True时,此项无意义;
若为ture,则在读取到参数文件行末尾时,终止参数文件读取线程;
若为false,此时线程继续读取,但会请求错误,因此时读取的数据为EOF;
「Sharing mode」:线程共享模式。即参数文件的作用域,有以下几种方式:
△All threads:当前测试计划中的所有线程中的所有的线程都有效,默认;
△Current thread group:当前线程组中的线程有效;
△Current thread:当前线程有效;
创建一个参数文件。
添加http请求:高级选项里面选择java,可以避免一些端口释放报错。
创建响应断言:
创建结果树:
运行以后观察结果树:
压缩jmeter程序,这是为了将插件一起打包也可以使用官方下载的zip在主机解压以后将本地的apache-jmeter-5.4.3\lib\ext文件夹下jar包传到主机上apache-jmeter-5.4.3\lib\ext路径下。这里遇到了自己打包的zip解压以后sh文件运行没有权限的问题,推荐用官方下载的zip包直接解压。
使用rz命令或者其他如ftp软件上传到主机。
unzip apache-jmeter-5.4.3.zip /*解压*/
查询jmeter版本
jmeter.sh -v
如果遇到以下报错:
Unrecognized VM option 'MaxMetaspaceSize=256m'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
检查javahome版本是不是低于1.8,可以通过修改主机java版本解决,如果不想修改主机环境的java版本可以在启动脚本修改
忘记传插件的后果:
执行压测命令:
../jmeter.sh -n -t test.jmx -l test.jtl
-h 帮助 -> 打印出有用的信息并退出
-n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter
-t 测试文件 -> 要运行的 JMeter 测试脚本文件
-l 日志文件 -> 记录结果的文件
-r 远程执行 -> 在Jmter.properties文件中指定的所有远程服务器
-H 代理主机 -> 设置 JMeter 使用的代理主机
-P 代理端口 -> 设置 JMeter 使用的代理主机的端口号
通过jtl文件生成网页文件。
../jmeter.sh -g test.jtl -o test(输出文件夹名字)
tar zcvf test.tar.gz ./test
下载到本地。打开index.html
Tps
响应时间耗时
接下来说一下分布式压测的配置。以下内容来自于小菠萝的博客
https://www.cnblogs.com/poloyy/p/13233055.html
首先是压力机:
vim ~/jmeter/apache-jmeter-5.4.3/bin/jmeter.properties
可修改任意端口不被占用的接口
默认 false,代表需要认证
设置为 true,减少不必要的麻烦
./jmeter-server -Djava.rmi.server.hostname=压力机ip
jmeter-server.bat -Djava.rmi.server.hostname=压力机ip
· 检查防火墙是否被关闭,防火墙会影响脚本执行和测试结构收集
· 确认 server_port 的端口没有被占用以及需要对外开放,端口占用会导致压力机报错
· 关于开放端口和关闭防火墙可以参考这篇博客:https://www.cnblogs.com/poloyy/p/12213297.html
· 多个压力机之间用 , 隔开
· 不同压力机端口可以不一样,不需要全部都一致
· 如果控制机也测试则加 127.0.0.1:port (实际使用中我修改为为压力机实际ip),然后修改 server_port 和 server.rmi.port (和压力机一样步骤)
· 用于查看分布式测试过程中,每个压力机的测试结果
· 若不启用,在运行过程中,控制器是无法实时看到压力机的结果
这里会显示所有 remote_hosts 添加的压力机
点击启动后,查看压力机
Linux命令
、指定压测机启动,命令:
./jmeter -n -t /path/test.jmx -R 127.0.0.1,127.0.0.2
②、启动所有压测机,命令:
./jmeter -n -t /path/test.jmx -r
sh ./apache-jmeter-5.4.3/bin/jmeter.sh -n -t /opt/jmeter/auth/xxx.jmx -r -l /opt/jmeter/auth/xxx.jtl
注意:分布式压测时候线程组是脚本的数量和压力机数量的乘积,例如有两台压力机,设置线程组为100个则实际实现过程中线程组数量为200个。
至此,我们学会了最基础的单接口阶梯线程组分布式压力测试并查看压力测试结果。