一、主流性能测试工具
1、Loadrunner
是一种工业级标准性能测试负载工具,可以模拟上万用户实施测试,并在测试时可实时实时检测应用服务器及服务器硬件各种数据,来确认和查找存在的瓶颈。
支持多协议:Web(http/html)、Windows Sockets、FTP、ODBC、MS SQL Server等
采用C语言编写
优点:
---多用户(支持用户以万为单位)
---详细的分析报表(以秒为单位)
---支持IP欺骗功能
缺点:
---收费
---体积庞大(安装包单位GB)
---无法定制功能
2、Jmeter
是apache组织开发的基于java的开源软件,用于对系统做功能测试和性能测试
优点:
1、开源免费
2、小巧(安装包50M左右)
3、丰富的学习资料和扩展组件
缺点:
1、不支持IP欺骗
2、分析和报表能力相对于LR欠缺精度
二、JMeter功能概要
JDK常用文件目录介绍
Bin目录:存放可执行文件和配置文件
docs目录:jmeter的api文档,用于开发扩展组件
printable_docs:用户帮助手册
lib目录:存放jmeter依赖的jar包和用户扩展所依赖的jar包
三、元件的基本介绍
1、元件:多个类似功能组件的容器(类似于类)
取样器:发送请求
逻辑控制器:控制语句的执行顺序
前置处理器:对请求参数进行预处理
后置处理器:对响应结果进行提取
断言:检查接口的返回结果是否与预期结果一致
定时器:设置等待
测试片段:封装一段代码,供其他脚本调用
配置元件:测试数据的初始化配置
监听器:查看jmeter脚本的运行结果
2、组件的基本介绍
组件:实现独立的某个功能(类似于方法)
四、元件的作用域和执行顺序
1、元件的作用域
是靠测试计划的树形结构中元件的父子关系来确定的
提示:所有的组件都是以取样器为核心来运行的。组件添加的位置不同,生效的取样器也不同。
2、作用域的原则:
取样器:核心,不和其他元件相互作用,没有作用域
逻辑控制器:只对其子节点中的取样器和逻辑控制器起作用
其他元件:
如果是某个取样器的子节点,则该元件只对其父节点起作用
如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)
3、元件的执行顺序
同一个作用域下不同类型元件
a、配置元件
b、前置处理程序
c、定时器
d、取样器
e、后置处理程序
f、断言
g、监听器
同一个作用域下多个相同类型元件:
按照在测试计划中从上到下的顺序一次执行
正确顺序:
定时器1-请求1-定时器1-定时器2-请求2-定时器1-定时器3-请求3
五、jmeter使用示例
第一个案例:使用jmeter访问百度首页接口,并查看请求和响应信息
步骤:
1、启动jmeter
2、在“测试计划”下添加“线程组”
3、在“线程组”下添加“HTTP请求”取样器
4、填写“HTTP请求”的相关请求数据
5、在“线程组”下添加“察看结果数”监听器
6、点击启动按钮运行,并查看结果
六、线程组
1、作用:线程组就是控制jmeter用于执行测试的一组用户
特点:
模拟多人操作;
线程组可以添加多个,多个线程组可以并行或串行
取样器(请求)和逻辑控制器必须依赖线程组才能使用
线程组下可以添加其他元件下组件
2、线程组分类
线程组:普通的、常用的线程组,可以看做一个虚拟用户组,线程组中的每一个线程都可以理解为一个虚拟用户
setUp线程组:一种特殊类型的线程组,可用于执行预测试操作
tearDown线程组:一种特殊类型的线程组,可用于执行测试后工作
3、案例分析
使用1个线程组,添加http请求访问
--配置线程数为2,循环次数为3时,运行观察结果
--配置线程数为3,循环次数为2,运行观察结果
分析:
--线程数代表虚拟用户数,用户数越多,负载越大
--循环次数代表运行时间,次数越多,运行时间越长
七、HTTP请求
八、查看结果树
作用:查看http请求的请求和响应结果
组成:
1、取样结果:查看响应信息头信息、响应状态码
2、请求:查看请求相关信息(url、方法、参数)
3、响应:查看响应信息
九、参数化
参数化测试:把测试数据组织起来,用不同的测试数据调用相同的测试方法。
jmeter中常用的参数化方式:
1、用户定义的变量-----全局变量
位置:测试计划--线程组--配置元件--用户定义的变量
例如:定义被测系统的协议、域名、端口号
使用的时候:${变量名}
局限性:每次取值(无论是否相同的用户)都是固定值
2、用户参数-----为每个用户分配不同的参数值
为什么使用用户参数:性能测试时有多个用户同时请求,每个用户在登录请求时需要使用不同的用户名密码进行登录。
作用:针对同一组参数,当不同的用户来访问时,可以获取到不同的值
位置:测试计划---线程组---前置处理器---用户参数
记得设置线程数为n(表示模拟的用户数)
局限性:同一个用户在多次循环时,取到相同的值
3、CSV Data Set Config----文件方式参数化
为什么要使用csv数据文件参数化?
性能测试时有多个用户登录,登录后循环添加商品,每次添加时商品的参数不能相同,该怎么做?
作用:让不同用户在多次循环时,可以取到不同的值
位置:测试计划---线程组---配置元件---csv数据文件设置
局限性:需要手动进行测试数据的设置
4、函数----随机数据
性能测试时,如果模拟1000个用户,每个用户循环执行10万次添加商品操作,请求参数要求不同,该怎么做?
函数(_counter)
位置:工具---函数助手对话框---counter
性能测试时,如果模拟1000个用户,每个用户循环执行10万次添加商品操作,请求参数要求不同。
设置:TRUE,每个用户有自己的计数器;FALSE,使用全局计数器
使用:生成--复制
局限性:输入数据有特定的业务要求时无法使用(如登录)
5、数据库
十、断言
断言:让程序自动判断预期结果和实际结果是否一致
提示:
---jmeter在请求的返回层面有个自动判断机制(响应状态码)
---但是请求成功了,并不代表结果一定正确,因此需要检测机制提高测试准确性
jmeter中常用断言:
--响应断言
--json断言
--持续时间断言(Duration Assertion)
1、响应断言
作用:对http请求的任意格式的响应结果进行断言
位置:测试计划--线程组--http请求--(右键添加)断言--响应断言
参数配置详细介绍:
测试字段:要检查的项(实际结果)
--响应文本:来自服务器的响应文本,即主体
--响应代码:响应的状态吗,例如:200
--响应信息:响应的信息,例如ok
--响应头
--请求头
--请求数据
--URL样本:请求url
--文档(文本):响应的整个文档
--忽略状态:忽略返回的响应状态吗
模式匹配规则:比较方式
--包括:文本包含指定的正则表达式
--匹配:整个文本匹配指定的正则表达式
--相等:整个返回结果的文本等于指定的字符串(区分大小写),重点使用
--字符串:返回结果的文本包含指定字符串(区分大小写),重点使用
--否:取反
--或者:如果存在多个测试模式,勾选代表逻辑或(只要有一个模式匹配,则断言就是OK),不勾选代表逻辑与(所有都必须匹配,断言才是OK)
测试模式:预期结果
2、JSON断言
作用:对http请求的json格式的响应结果进行断言
位置:测试计划--线程组--http请求--右键添加断言--json断言
Assert JSON Path exists:$.weather.city 例子
3、断言持续时间
作用:检查http请求的响应时间是否超出要求范围
位置:测试计划--线程组--http请求--右键添加断言---断言持续时间
参数介绍:
--持续时间(毫秒):http请求允许的最大响应时间(单位:毫秒)。超过则认为失败
十一、jmeter 关联
关联:当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。
jmeter中常用的关联方法:
1、正则表达式提取器
正则表达式:就是一个公式,或者说一套规则,使用这套规则可以从任意字符串中提取出想要的数据内容。
公式格式:左边界(.*?)右边界,可以提取出想要获取的内容
2、XPath提取器
作用:针对html格式的响应结果数据进行提取
位置:测试计划--线程组--http请求--右键添加后置处理器--XPath提取器
3、JSON提取器
作用:针对json格式的响应结果数据进行提取
位置:测试计划--线程组--http请求--右键添加后置处理器--json提取器
json表达式:$.
十二、jmeter属性
当有关联关系的两个请求在同一个线程组中时,可以使用三种提取器的变量来实现数据传递。
当有关联关系的两个请求在不同线程组中时,如何进行数据传递呢?
1、jmeter属性的配置函数;
_setProperty函数:将值保存程jmeter属性
_property函数:在其他线程组中使用property函数读取属性
2、jmeter属性的函数执行:
_setProperty函数执行(保存jmeter属性):需要通过BeanShell取样器来执行
3、操作步骤
1、添加线程组1
2、添加http请求--天气
3、添加json提取器
4、添加BeanShell取样器(将json提取器提取的值保存为jmeter属性)
5、添加线程组2
6、添加http请求--百度(读取jmeter属性)
7、添加查看结果树
十三、jmeter录制脚本
有api文档时,可以根据api文档的定义来编写http接口测试脚本,那没有api文档时?
jmeter录制脚本:在没有接口文档的旧项目当中,快速录制web页面产生的http接口请求,帮助编写接口测试脚本。
录制原理:jmeter作为代理服务器来拦截和转发请求与响应数据
操作步骤:
1、添加http代理服务器,并进行配置
测试计划(右键)---非测试元件---http代理服务器
配置代理服务器的参数
2、开启windows操作操作的浏览器代理
十四、jmeter直连数据库
1、直连数据库的使用场景
--用作请求的参数化,例如登录的用户名
--用作结果的断言
--清理垃圾数据,例如添加商品编号不能重复
--准备测试数据,例如通过数据库来准备大量(几十万条)的性能测试数据
2、直连数据库的关键配置
添加mysql驱动jar包
--方式一:在测试计划面板点击“浏览”按钮,将JDBC驱动添加进来
--方式二:将mysql驱动jar包放入到lib/ext目录下,重启jmeter
配置数据库连接信息:
添加方式:
测试计划--线程组--邮件添加配置元件--JDBC Connection Configuration
添加JDBC请求:
添加方式:
测试计划--线程组--取样器---JDBC Request
十五、jmeter逻辑控制器
可以按照设定的逻辑控制取样器的执行顺序
jmeter中常用的逻辑控制器:
1、如果(if)控制器
if控制器用来控制它下面的测试元素是否运行
位置:测试计划--线程组--右键添加逻辑控制器--if控制器
参数介绍:
--js语法形式
--函数形式(推荐)
案例1:
使用用户定义的变量定义一个变量name,name的值等于baiduh或者tao
根据值的不同访问不同的网站
步骤:
1、添加线程组
2、用户定义的变量
3、添加if控制器,判断name是否等于baidu,用js语法是"${name}"=="baidu"
4、添加http请求,访问百度
5、添加if控制器,判断name是否等于淘宝,用函数先用函数助手,填写值"${name}"=="baidu",点击生成,拷贝到if控制器里面
6、添加http请求,访问淘宝
7、添加查看结果树
2、循环控制器
作用:通过设置循环次数,来实现循环发送请求
位置:测试计划--线程组--右键添加逻辑控制器--循环控制器
案例:
百度循环10次
1、添加线程组
2、添加循环控制器
3、添加http请求
4、查看结果树
思考:线程组属性可以控制循环次数,那么循环控制器有什么用?
不同点:线程组的循环次数对线程组下的所有http请求有效,循环控制器的循环次数对子节点下的http请求有效
关联:循环控制器次数为M,线程组循环次数为N
--循环控制器下的请求运行:M*N次
--线程组下,非循环控制器下的请求运行:N次
3、foreach控制器
案例:
1、有一组关键字【hello,python,测试】,使用用户定义的变量存储
2、要依次取出关键字,并在百度搜索
步骤:
1、添加线程组
2、添加用户定义的变量,命名规范:前缀_编号
3、添加控制器
4、添加http请求
5、查看结果树
十六、jmeter定时器--同步定时器
同步定时器:阻塞线程(累计一定的请求),当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起释放,瞬间产生很大的压力。
位置:测试计划--线程组--http请求--右键添加定时器--Synchroning Timer
案例:模拟100个用户同时访问百度首页,统计各种高并发情况下运行情况