性能测试
应用:负载测试,压力测试,并发测试,(非性能测试:但是jmeter能做接口测试)
负载测试:
在一定的软件,硬件和网络环境下,通过运行一种或者多种业务在不同虚拟机用户数量情况下,测试服务器的性能指标是否在用户的要求范围内,用于确定系统所能承载的最大用户数,最大有效用户数,以及不同用户数下的系统响应时间及服务器的资源利用率(其中最大用户数是测试系统是否出error时的用户数,而最大有效用户数视公司规定在某服务器利用率下用户数(包括cpu利用率,磁盘利用率,网络资源利用率,内存利用率))
压力测试:
在一定的软件,硬件和网络条件下,通过模拟大量的虚拟用户向服务器产生负载,是服务器资源处于极限状态下长时间持续运行,以测试服务器在高负载情况下能否稳定工作。(即测试在某有效用户数下长时间运行,系统是否不出error)
并发测试:
主要指当测试多用户并发访问同一个应用、模块、数据时是否产生隐藏的并发问题,如内存泄漏、线程锁、资源争用问题。
三者的区别:
负载测试测试系统最大登录用户数,压力测试系统稳定性,并发测试用户同时访问某模块时系统的稳定性
接口测试:
使用POST或者GET的方式查看返回参数是否正确(可用jmeter,loadrunner,postman等等)
性能测试工具:Jmeter,LoadRunner(不讲)
jmeter和loadrunner区别:
jmeter:开源免费,界面操作差,网上学习成本高,安装简易,安装包小(几十m)
loadrunner:收费(十多万),操作性好,学习成本低,安装复杂,安装包大(3-4G)
jmetet环境搭建:
jmeter:jmeter4.0版本,傻瓜式安装,点击jmeter-4.0\bin目录下jmeter.bat或者ApacheJMeter.jar
jdk:jmeter4.0要求jdk1.8或者版本8以上
jmeter录制脚本工具:badboy,jmeter代理录制
- badboy:傻瓜式安装
jmeter代理录制
jmeter使用环境部署:WebTours和phpwind
-
WebTours环境搭建:
strawberry-perl:傻瓜式安装
WebTours:解压直接放在某目录下,打开WebTours主目录下StartServer开启服务
phpwind环境搭建:直接将文件夹置于\xampp\htdocs下,上网安装服务
jmeter使用操作:
录脚本:
打开badboy开始录制脚本,如上图所示红圆点为正在录制状态(其中在红圆点附近一栏有暂停播放快进等功能键),点击右侧绿色箭头键可进入某网站。当我们开始录制脚本时,红圆点为按下状态显示正在录制,我们就可以在网页栏输入你想要测试的网站,点击绿色箭头键就可以访问网站,这时候你就可以对网站进行操作,你的操作将会被录制成脚本。操作完成后,左边script栏会出现你的操作且被转换为http请求。录制好脚本后就可以导出至jmx文件类型供jmeter使用。
调试脚本:
好的,你现在已经录制好脚本了,可以开始用所录制好的脚本进行性能测试了。但是在此之前,你还需要先学习jmeter调试脚本的基本知识。
现在,你首先要打开jmeter,导入你所录制的脚本
现在脚本有了,我们就先学习jmeter的线程组,循环控制器,监听器,定时器,参数化,断言,http默认值参数,事务控制器吧
线程组:
线程数:即虚拟用户数,模拟N个虚拟用户
ramp-up period:启动时间,即完全启动所有线程数所用总时间,若是线程数很大,启动时间很多会造成服务器压力过大
循环次数:指每一线程完整运行一个脚本的次数,(PS:运行一整个线程组的总次数是线程数 * 线程组循环次数* 脚本循环次数)。可以点击永远,一般配合调度器使用
调度器:
持续时间:指运行线程组总时间
启动延迟:经过多少秒才运行线程组
循环控制器
我们可以通过添加循环控制器来控制jmeter循环脚本的次数,但是用badboy录制的脚本有问题,第一次使用脚本的时候线程组的循环次数和请求循环次数不统一,需要先把步骤设置为简单控制器再设置为循环控制器。而循环时候取值为。
监听器
主要是记录脚本运行时候各项情况。
查看结果树:记录每一步运行情况(取样器结果,请求,响应参数)
用表格看结果:以表格的形式记录每一步运行的情况
断言结果:记录每次断言后的结果
聚合报告:以表格统计每一个请求各项数据
定时器:
我们主要用2个定时器,一是思考时间(固定定时器),二是集合点(Synchronizing Timer)
思考时间:如图,就是在发帖该步骤进行前设置一个等待(等待时间以毫秒计算),主要用于模拟用户的实际使用场景
集合点:因为每个线程开启时间不同,到达每个请求的时候均不同。故让每个线程到了某一步的时候开始等待,等其他线程再一起启动。number of simulated users to group by:等待的线程数;timeout in milliseconds:等待的毫秒数,如果超过时间即时等不到足够的线程组脚本也会走下去。该项主要用于并发测试
参数化:
目前我们所学到的参数化主要有两种,一是使用csv数据文件设置,二是使用正则表达式提取器,三是使用函数助手。
-
csv数据文件设置(右键添加——配置元件——csv数据文件设置)
-
如图:
文件名:可用绝对路径,也可以用相对路径
文件编码:utf-8
变量名称:不管
忽略首行:忽略CSV文件的第一行,仅当变量名称不为空时才使用,如果变量名称为空,则第一行必须包含标题。
分隔符:,
是否允许带引号:true
遇到文件结束符再次循环:Flase
遇到文件结束符停止线程:flase
线程共享模式:该csv在打开几次(或说使用几次)
一般我们按这样设置就可以循环使用csv数据,在舒勇csv数据的时候,将在请求参数改成${你的参数}
若想了解更深请看官方文档
-
-
正则表达式提取器(右键添加——后置处理器——正则表达提取器)
-
有时候我们在请求参数的时候,他需要一些在前面步骤的响应参数来作为该步骤的请求参数,这个时候我们就可以从结果树判断该响应参数的位置,在该步骤下设置一个正则表达式。
引用名称:就是你提取的响应参数设置参数化,使得他能在其他步骤直接调用
正则表达式:我在响应参数里面要找到AAABBBCCC,我要用BBB,那么我就用(.*?)代替BBB,以AAA和CCC作为路标找BBB
模板:1,假如我有多个(.*?),我要用第一个,就用1选择第一个括号
匹配数字:如果我在相应数据里面找2个AAA(.*?)CCC,而我要的是第二个,就可以填2
-
-
函数助手(抬头选项——函数助手对话框)
- 目前我们使用函数助手对话框可实现一些简单功能,如计数,计算时间。详细请看官方文档。
断言(右键断言——响应断言):
- 断言主要是比较该http请求的响应参数与预期响应参数作比较,但是要记得预期写响相应参数的时候要参考响应参数
Http默认值(右键添加——配置元件):
该项主要可以设置默认的IP地址以及默认的编码UTF-8
事务控制器(右键添加——逻辑控制器)
该控制器主要用于打包某几项http请求为一个件里面,generate parent sample可以为设置被打爆的http请求要不要独立显示,该项在特殊场合有很大的作用。
现在我们有了脚本也学习了jmeter的基础知识(线程组,循环控制器,监听器,定时器,参数化,断言,http默认值参数,事务控制器),现在我们就可以用脚本和所学到的基础知识调试脚本,进行性能测试了。
性能测试实操
负载测试:测试最大用户数
当我们录制好脚本后,我们在脚本中插入监听器聚合报告,设置循环测试三次,总共测试三次。我们通过从小到大的顺序往上调整线程组数,当该线程数在测试的聚合报告中刚好出现error,那么该次数就作为最大用户数。
- ps:负载测试的时候要注意线程组启动时间,要注意避免一开始的压力过大;我们在线程组设置3次是为了避免线程组某些启动过快某些启动过慢造成实际最大用户数有出入;测试三次是为了更准确测试最大用户数,避免恰巧某一次测试没报错导致误判最大用户数的情形
压力测试:测试有效用户数
当我们要根据公司的规定测试最大用户数的时候,公司也会让我们测试最大有效用户数(公司一般会让给我们相关数据如有效cpu占用率,网络占用率等等,而这些我们可以通过软件Spotlight for windows监控)。当我们测出来最大有效用户数后,我们就可以根据公司给定的压力时间进行测试。这个时候我们就可以在线程组设置循环次数设置为永远,调度器设置为XXXXX秒。
PS:要注意准备充足数据,不然时间还未到,数据就跑完了
并发测试:
并发测试很简单,只要测试一个集合点,测试在等待多少个用户一起启动的时候会出现error,记录下该用户那就完成了并发测试了。
性能能测试改善:
分布式负载(联机负载)测试:
在使用Jmeter进行性能测试时,如果并发数比较大(比如最近项目需要支持1000并发),单台电脑的配置(CPU和内存)可能无法支持,这个时候可以使用分布式负载。分布式负载主要有三部分,一是控制机,二是负载机,三是服务器。
控制机(controller):存放jmeter脚本的机器(发号施令)
负载机(agent):被连接并用于运行脚本的机器,负责产生负载(不需要脚本仅负责执行)
服务器(the server):被用于测试的机器(被执行)
-
分布式部署
负载机:1.安装jdk1.8或者8以上版本。2.设置环境变量。3.获取本机IP地址
控制机:1,改配置文件:修改jmeter的bin目录下的jmeter.properties,在properties中找到remote_hosts=....,添加远程负载机的ip和端口(端口默认1099,IP不包括控制机,如果修改该端口需要在负载机配置文件中修改server_prot=xxx),多个负载机之间用英文逗号隔开。修改配置后重启jmeter,修改后的配置即生效。
服务器:开启服务即可。
-
操作:
负载机(m):运行jmeter.server.bat
-
控制机:启动jmeter,在选择菜单run中的remote start运行负载机(可以逐个运行,也可以全部一起运行);选择脚本,设置线程数为n,最终服务器承受的线程数=负载机个数*线程数n
-
注意:
- 1.如你是用的是4.0以及以后版本的jmeter,那可能会报找不到rmi_keystore.jks文件的错误
-
* 这个时候需要你修改bin目录下jmeter.properties配置文件,将server.rmi.ssl.disable=XXX,这个XXX要改成true
* ![](https://upload-images.jianshu.io/upload_images/12191514-3ca95879c922b0ea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
* 2.如果控制机无法连接负载机,那就先ping一下,看看网络是否相同,如果相同那就先看看是否开了杀毒软件或者防火墙,如果开启了就关闭再重启连接(一般来说负载机关了防火墙就能被连接,控制机关防火墙就可以接收报告)
* 3.运行脚本的时候,要保证使用脚本调用的参数名和提取数据的路径(路径可使用相对路径)要相同
* 4.要根据实际系统的业务先确认所有的负载机是否能用同一份数据,如果数据要保持唯一性(如注册),那么各个负载机数据就不能用同一份,如果没有唯一性,那么就可以用同一份
非GUI模式运行:
讲非GUI模式运行的时候我们先来看看GUI和非GUI两者的区别:
gui:界面会消耗很多资源,并且运行的结果是保存在Jmeter运行的内存中。当时间一长,内存增长到一定程度,就会报错,甚至假死。
非gui:实时的将运行log文件保存到本地文件中,不会撑爆内存。并且对机器的资源占用也较少。
好,上面的的说的很清楚为什么要用非GUI,就是因为非GUI占用资源少嘛!
-
操作步骤
1.打开命令窗口,进入存放脚本的目录:
-
2.输入命令:jmeter -n -t lookgoods.jmx -l lookgoods_res.jtl -r -X
- PS:其中-n指非GUI模式运行;-t指要执行的脚本文件XXX,-l指定保存测试统计结果的jtl文件XXX;-r指在jmeter.properties文件内定义的所有远程主机上运行测试(这样就可以进行负载测试),-X指在非GUI模式运行时,运行完测试自动退出远程主机,即断开连接。生成的jtl测试结果文件和脚本在同一目录下
注意:
- 若你们需要改变文件的存储位置,可以再命令 jmeter -n -t lookgoods.jmx -l lookgoods_res.jtl -r -X的lookgoods_res.jtl前面加地址(相对路径或者绝对路径)
系统资源监控改进
在实际操作中,我们可能会使用window自带的cup监视器,也可能会用其他的cup监视器如Spotlight。但是window自带的监视器功能不够完善,用其他的会占用内存,这个时候就可以远程监控cpu。 有能力的可以去了解一下