录制脚本
jmeter下载安装略过不谈,上步骤:
1.在测试计划新建-threads-线程组
2.在工作台新建-非测试原件-http代理服务器,设置端口和包含网址 不包含网址
3.在手机/浏览器,设置代理服务器网络和端口(自己百度)
4.点击http代理服务器的启动,就可以开始录制脚本了。
HTTP代理服务器的设置如下:
编辑脚本
1.添加断言
1.apply to 指定断言作用范围
2.响应文本
响应代码 code(200、300)
响应信息 (msg )
3.参数化数据,导入txt文件
4.设置循环次数和持续时间
5.添加察看结果数
6.开始运行脚本
7.查看结果
8.分析数据
jmeter③添加beanshell脚本断言返回的json内容
step1.
对http请求添加beanshell断言
step2.
导入json解析包,并存入jmeter安装路径的lib文件夹
step3.
根据接口文档编写对应的beanshell脚本
e.g:
import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;String resp=new String(ResponseData);JSONObject jsonObject=JSON.parseObject(resp);int ret=jsonObject.getIntValue("ret");int errorCode=jsonObject.getIntValue("error_code");String msg = jsonObject.getString("msg");//long serverTime=jsonObject.getString("server_time");Object data = "";if(jsonObject.containsKey("data")){Object dataObject=jsonObject.get("data");if(dataObject instanceof JSONObject){data= jsonObject.getJSONObject("data");}else if(dataObject instanceof JSONArray){data=jsonObject.getJSONArray("data");}}else{Failure=true;FailureMessage="返回结果中没有data数据";}if((ret==0)&&(errorCode==0)&&(msg=="")&&(data.toString()!="")){Failure=false;}else if(ret==1){Failure=true;FailureMessage="ret返回为1,没有活动配置";}else if(errorCode==500){Failure=true;FailureMessage="errorCode=500,没有活动配置";}else{Failure=true;FailureMessage="msg、data返回有误";}
验证是否是json语句-用于json断言
public class TestFast {public static void main(String[]args){String resp="";int length=resp.length();int flag=-1;if(length>2){int i=0;// 从第1位的字符开始找,是不是{,如果不是,查看下一个,找到第n个,还不是,就报错while(i<3){if(resp.charAt(i)==123){flag=0;break;}else{i++;}}if(flag==0){System.out.println("this is a json");}else{System.out.println("this is not a json");}//不是,就判断失败,给出结论}else {System.out.println("the response is not a json,the length is 0 or 1,or 2(not {})");}}}
性能测试全过程review
前情提要:1.会一点点jmeter的脚本录制和编辑,完全没实际操作过压测,review一下第一次实践。
2.压测使用的是HTTP请求,且未加密;
3.压测的10个接口没有数据关联和数据要求,就是数据随便输入随便设置;
4.review会省略一些基本知识的解释,比如jmeter的断言/参数化/内置参数、linux基本操作、为什么监控这些数据、基础的计算机网络知识等等
一、.接到任务,拿到道具:
①接口文档
②压测地址
③压测客户机云地址(因为自用的PC机器性能不佳,所以使用的腾讯云部署上面的机器)
④提测邮件/需求
二、.分析提测需求:
性能指标如下,其实很奇怪啊,如果接口响应时间5s,用户早就流失了吧?
监控的指标需要有:(日活跃用于设置并发数量,理论30w日活的休闲游戏,单个接口并发200-300线程的数据需要达到对应标准TPS>500,响应时间<1s,CPU消耗80%,内存消耗<80%,不同项目的需求会有出入),TPS,响应时间,服务器CPU占用,服务器Memory占用
准备测试工具:jmeter(因为只会这个),xshell(用于在腾讯云的跑脚本的ubuntu机器上执行脚本,登陆的时候还要用Authenticator来获取密码)
三、针对接口文档,编写测试脚本
1.接口文档如下(这里只po一个接口):
2.针对接口文档,编写jmeter脚本
步骤如下:添加线程组--在线程组上添加samples-http请求-编辑http请求的数据-针对http请求添加Beanshell断言+响应断言(这里提供两种方式断言,任选一种即可)-针对线程组增加监听器-察看结果数+聚合报告(这里提供两种报告,前者用来查看报错信息,后者用来查看压测结果)-设置并发数据
添加线程组:
添加HTTP请求,根据接口文档编辑请求内容:
添加Beanshell断言和响应断言(由于接口比较简单,所以任选其一即可,建议选择响应断言,比较简单方便):
编辑beanshell断言内容:
import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;String resp=new String(ResponseData);if(resp.equals("")||resp==null){Failure=true;FailureMessage="resp是空的";}else if(resp.startsWith("<")){Failure=true;FailureMessage="resp以
注:这里使用的fastJson来解析json返回,所以需要事先导入fastjson的jar包,导入jar包的步骤很简单,就是把jar包放入jmeter安装路径的lib目录下
添加响应断言,编辑响应断言:
注:这里的响应断言和上面的beanshell实现的是同一个东西,响应断言会更简单,不用自己BBBBB写一大堆。
这里写beanshell主要是因为,当前项目没有用到,但是事实上其他项目会用的比较多,所以想练练_(:з」∠)_。
有的项目使用加密的数据包,我们在请求的时候,需要对数据加密;在断言的时候,要对数据解密;有的项目验证接口之间有数据关联,就导致我们前后的数据需要做关联,用beanshell语句来连接(beanshell preProcessor/beanshell postProcessor/beanshell断言等等)
添加察看结果数、聚合报告
注:这里的察看结果数和聚合报告,需要存两个不同的文件,因为存储方式不同,存相同路径的话,会都覆盖成聚合报告
设置并发数量,并发200线程,持续5min压测
四、执行压测
如果自己的PC性能OK的,直接自己windows跑了。
如果自己PC不行的,要在linux客户机上跑的,就xshell连接上客户机,然后进入jmeter的bin目录,上传测试脚本,输入语句执行。
客户机操作:1.安装jdk 2.上传jmeter(脚本有用jar包的,要在lib里面存入jar包)3.进入jmeter的目录,执行脚本
cd /data/test/apache-jmeter-3.1/bin
rz -e 上传 test.jmx文件
java -jar ApacheJMeter.jar -n -t 压测脚本.jmx -l 结果文件.jtl
sz 结果文件.jtl 导出结果文件到本地
五、 分析结果
1.分析聚合报告:
前面编辑脚本:并发200线程,持续5分钟----得到结果:请求总数142w,平均响应时间47ms,错误率0.00%,TPS 4105
响应时间47ms,响应很快,TPS 4105事务处理能力优越,错误率低于0.01%。说明脚本执行情况很好,此时需要查看服务器的CPU和memory使用情况,确定是否继续加压。
这里服务器性能监控,没有需要自己去捣鼓,直接找运维要zabbix账号上去瞄瞄就可以了,主要查看CPU load,CPU使用情况,memory使用情况。如果发现CPU或者聚合报告的内容异常,可以查看network traffic里面的数据流量( 每秒流量=每秒请求数*请求大小)。
这里看到,CPU利用率max值是80%,CPU负载的max值是7(意思是当前每核处理的请求数量,服务器是4核的,数值8+就算满载)。
加压看看TPS有没有增加(这个时候CPU接近满载,加压的话过载的可能性很高)。这里加压到300并发看了下,TPS是差不多了,错误率为0,就不贴图了。
CPU接近满载,并发数增加的情况下,TPS稳定,结果基本可以确定了。
这里的memory占用就不贴图了,基本维持在400mb。
六、出具报告
提测内容是看30w日活的时候的各个数据,这里策略是加压200时查看各项数据,加压200,CPU占用80%+,memory占用<80%,TPS>500,响应时间<5s,测试通过。
性能测试结果分析
上次测试的内容,今天需要添加一个接口压测。
测试结果如下:
压测的执行时间5分钟,总共发送5w请求,单个请求响应时间是308ms,这里请求设置的connect时间5s,响应时间10s。
并发50线程时,TPS峰值只有150,比其他接口要弱10倍左右,且错误率大于0.01%;
这里本来只关注了tps不合格的问题,已经错误率。master说,这个响应时间太长,而且流量每秒3.4MB,带宽消耗很大。
最后运维确定说是带宽跑满了,问了带宽,30Mbps;
master说难怪了 早就跑满了。。。。
妈个鸡 不懂