一、性能测试
1、什么是性能测试?
2、性能测试中的各项性能指标
在线、并发、点击率、吞吐率、TPS、事务响应时间、资源利用率、PV(Pageview)
3、性能测试工具loadrunner
原理:自动监控客户端个服务器端之间的会话(客户端的请求和服务器的响应),把客户端的请求形成脚本,回放时模拟客户端向服务器发送请求,捕获服务器端的响应
(1)脚本生成器:录制脚本、增强脚本(检查点、事务、集合点、参数化、)、调试脚本
参数化:参数池列表:关联函数、数据库中的数据
(2)控制台:设计场景(设置虚拟用户个数、Schedule计划、Run-time Settings、集合点设置、多机联合、添加监控资源项)
(3)结果分析器:把测试结束后的数据,生成图标(Summary概要、资源图、网页细分图)
二、Jmeter概述
1、什么是Jmeter?
Jmeter是Apache组织开发的一款纯Java的桌面应用(一款软件),是开源的(允许程序员对其功能进行修改)
作用:可以实现压力测试和性能测试,支持多种协议
问题:loadrunner也是可以做压力和性能测试,为什么还要学习Jmeter
Loadrunner功能比较强大,费用昂贵
Jmeter开源免费,纯Java开发,具备完全的可移植性(实现接口测试使用Jmeter较方便)
2、Jmeter 的优点(根Loadrunner类比)
(1)能够对HTTP和FTP服务器进行压力和性能测试,也可以对任何数据进行同样的测试(通过JDBC连接数据库) (2)完全Swing和轻量组件支持
(3)完全多线程,通过多个线程并发向服务器发送请求(模拟多用户)
(4)完全开源,开源对Jmeter进行定制化的二次开发,扩展自己所需要的插件(测试开发、开发的测试框架)
3、Jmeter的缺点
(1)录制功能需要借助于第三方工具Bodboy或者浏览器进行代理录制,相对繁琐
(2)报表较少,不如Loadrunner报表齐全
(3)入门吧比较困难(术语不好理解、需要了解传输协议)
(4)大并发量是,结果数据可能不是很准确
三、Jmeter的安装和使用
1、安装:下载软件的官网
2、当前使用版本apache-jmeter-2.12.zip
3、安装方法:解压即可使用
前提:Jmeter基于Java的桌面应用,需要安装JDK(1.6版本以上)
4、启动Jmeter:在Jmeter的工具包目录下,bin目录下双击Jmeter.bat的文件
.bat文件是Windows中的批处理文件
四、主要功能模块
(1)测试计划(Test Plan),类似于Loadrunner中的场景,现在想设计一个什么场景进行测试,想得到什么结果,就需要在测试计划中进行设置、如添加虚拟用户、添加测试请求、为请求添加断言...
a.启动Jmeter后,默认有一个测试计划,测试计划用来描述一个性能测试
b.在测试计划中包含了本次性能测试相关的所有执行步骤以及报表
c.在一个测试计划中可以添加:
一个或者多个线程组(虚拟用户)
(2)工作台:Jmeter中,可以在工作台中配置HTTP代理服务器,然后将录制的脚本存入工作台中,进行初步编辑,编辑后将脚本复制到测试计划中,就可以设置虚拟用户组去执行脚本
说明:一般录制脚本是使用第三方工具进行录制,使用工作台较少
(3)线程(Threads(Users))类似于Loadrunner中的虚拟用户
a.每个测试计划设计之前,第一步就是添加线程组,线程组是任何一个测试计划的开始点,所有的控制器和取样器肯定是在某个线程组下
b.在线程组中设置虚拟用户如何执行当前测试计划,如线程(虚拟用户)个数,加载方式,执行时间等...(类似于Loadrunner控制台中的Schedule计划设置)
c.Jmeter线程组分为3类:
--setUp Thread Group:进行测试之前的初始化工作(类似于Loadrunner中的初始化init代码块)
--tearDown Thread Group:进行测试结束后的垃圾回收等清理工作(类似于Loadrunner中的结束end代码块)
--Thread Group:线程组,常用(类似于Loadrunner中的结束Action代码块)
(4)测试片段(Test Fragment)
a.测试片段是控制器上的一种特殊的线程组
b.线程组在运行Jmeter时会被执行,测试片段只有在被引用时,才会被执行
(5)取样器(Sampler)类似于Loadrunner中的请求 a.取样器(请求)指示Jmeter向一个服务器发送请求,例如:如果你想让Jmeter发送一个HTTP请求,那么就需要添加一个HTTP请求取样器
b.取样器是性能测试中向服务器发送请求并等待服务器响应的最小单元,每一个取样器(请求)都可以设置不同的属性
c.常用的取样器:
HTTP请求:web系统
FTP请求:FTP服务器
JAVA请求:java程序接口
JDBC请求:测试数据库
SOAP请求:测试邮件系统
TCP请求:测试协议
(6)逻辑控制器(Logic Controller)
a.逻辑控制器可以定义Jmeter发送请求的行为逻辑。结合Sampler(请求)使用可以模拟复杂的请求顺序,先执行哪个请求,再执行哪个请求
b.常用的逻辑控制器:
if、while、事务、交替控制器
(7)监听器(Listener)
a.监听器对Jmeter测试结果进行收集处理并且可视化展现的一系列组件,直接把Jmeter运行后的数据以不同的形式显示出来
b.常用的监听器:
图形结果
查看结果树
表格查看结果
聚合表格
(8)配置元件(config Element)
a.维护sampler取样器需要的配置信息,并根据实际的需求修改请求的内容
b.常用的配置元件:
CSV date set config:设置参数化
(9)定时器(Timer),类似于loadrunner中的思考时间
a.设置定时器的目的是:为了更真实的模拟虚拟用户的行为,控制每个线程(虚拟用户)之间的请求时间间隔,减少服务器的压力
(10)断言(Assertions)类似于loadrunner中的检查点
a.对比返回的响应数据与预期数据,用来判断请求是否成功,性能测试的前提是得确保请求能够执行成功
(11)前置处理器(per processors)
a.用来修改请求的设置,在请求执行之前执行
b.比如HTML、URL重写修饰符才可以实现URL重写(类似重定向),当URL中有类似的Usersession的信息时,可以通过前置处理器填充发出请求的实际UserSession
如:原来的URL:http://localhost:8080/web01
假设URL提交时需要提交一个usersessionid,那么通过前置处理器,URL重写后,变为:
http: //localhost:8080/web01?
sessionid=xxxxxx
(12)后置处理器(post processors)
a.用于对取样器(请求)后得到服务器端响应数据进行处理,如获取响应中的动态数据
b.一般用来提取响应数据中特点的数据,使用正则表达式进行匹配
正则表达式:使用特殊的符号表示指定的字符
如:“.” 表示字符 +表示一个或多个字符
五、Jmeter基本使用
(1)测试计划,是Jmeter使用的起点,是其他配置元件的容器,每个测试场景/脚本都必须包含在一个测试计划中,必须有一个测试计划
名称:可以根据需求修改测试计划的名称 注释:对当前测试计划的描述 用户定义的变量:实现参数化时使用,在该位置设置的变量是全局的,在整个计划中都可以使用 独立运行每个线程组:勾选,所有的线程组都是顺序执行的说明:一般不勾选该项,让所有线程组并发执行
5)函数测试模式:勾选后,会有详细的请求记录
说明:由于比较耗费资源,会影响客户端(测试机)的性能,一般不勾选
6)Add directory or jar to classpath: 向类路径中添加目录以及jar包
类路径:%JmeterHome%\lib
%JmeterHome%=Jmeter解压的路径
directory:路径
jar:代码
(2)Vuser及场景的设计
在Jmeter中设计一个场景的基本思路:在测试计划中添加一个线程组,在线程组中设置Jmeter的场景(虚拟用户如何运行测试) 添加线程组的方式:右击测试计划->添加->Threads(Users)->线程组a.名称:线程组的名称
b.注释:线程组的注释
c.当取样器(请求)执行出错后的设置:
继续:出错以后继续运行其他请求
d.线程(虚拟用户)属性:
--线程数:当前需要多少虚拟用户执行测试。
--Ramp up period(in seconds):每个线程与每个线程之间的间隔时间
--循环次数:请求的重复执行次数
永远:一直循环执行请求
不选择永远:输入循环次数
e)调度器:控制Jmeter测试计划的启动时间、持续执行时间
(3)请求(录制脚本)
使用Badboy录制脚本a.下载并安装Badbody根据
下载地址:
http://www.badboy.com.au
下载文件:BadboyInstaller-2.1.2.exe版本
安装方式:双击安装文件下一步下一步执行
启动方式:在开始菜单栏双击Badboy图标
2)开始录制(录制lr自带的webtours系统)
a.在地址栏输入被测系统的URL地址
b.点击向右的箭头打开被测系统(默认打开Badboy工具就是录制的状态)
c.按照需求操作被测系统
注意:录制时必须等待当前请求执行完后,再操作被测系统发送下一个请求
d.录制完代码后点击Record红点按钮,停止录制
e.可以在Badboy中点击回放按钮,查看请求是否能够执行成功
f.保存脚本为Jmeter的脚本格式:
File->Export to Jmeter,晚间后缀为.jmx
g.在Jmeter中打开使用Badboy录制好的代码:File->open->选择.jmx的脚本文件
练习:使用Badboy录制webtours系统的登录+购票+退出业务流程,使用Jmeter打开并运行查看运行结果
六、Jmeter的关联技术
(1)Jmeter也有类似于Loadrunner的关联技术,区别在于Jmeter的关联是基于正则表达式的(使用正则表达式匹配需要的内容)
(2)关联步骤:在需要获取响应内容的请求上右击->后置处理器->正则表达式提取器:
a.名称:给正则表达式命名
b.解释:对本次正则表达式的注释
c.Apply to:使用默认
d.要检查的响应字段:在哪个部分获取指定的内容,选择主体
e.引用名称:变量名称,把获取到的响应内容保存到变量中
f.正则表达式:前面一部分内容(正则表达式)后面一部分内容
如:name="userSession" value="(.*)"/>
g.模板:使用$$引起来,如果正则表达式能够匹配多个值,可以使用$1$、$2$来表示需要取数据,表示将匹配到的第几个值赋值给变量,数值从1开始
h.匹配的数量(0代表随机):-1表示所有,其余正整数表示对于第几个匹配上的内容,一般使用0随机
i.使用变量中的值,格式为:${变量名称}
练习:把webtoursbuy代码的航班使用关联获取到,替换到提交航班请求中
一、Jmeter中的检查点
1、Jmeter和Loadrunner一样,都有检查点功能,因为使用工具进行测试时,必须保证请求执行是成功的,测试才有意义
2、Jmeter的检查点是断言,断言可以判断不同类型的结果,常用响应断言,使用响应断言来判断请求提交后服务器端的响应是否正确
3、添加响应断言的步骤:
在需要检查的请求上右击,选择添加->断言->响应断言
a.在响应断言界面上添加要测试的模式:把需要检查的文本字符串添加到要测试的模式
b.可以断言结果中查看断言执行的结果,也可以在查看结果树中查看断言结果
c.如果添加断言结果:在请求右击选择添加->监听器->断言结果
二、Jmeter中的参数化(3种方式)
方式一:使用Test Plan测试计划界面的用户自定义变量
1、在Test Plan中,在用户定义的变量中点击“添加”按钮,添加需要的变量及变量的值
2、在脚本中需要使用变量的地方,使用${变量名称}的格式,把常量替换为变量
练习:把webtours参数化方式一.jmx脚本中的用户名、密码、起飞城市、到达城市、乘客个数实现参数化
方式二:使用函数助手对话框的__CSVRead函数实现参数化
方法1:
a.打开函数助手:选项->函数助手->选择__CSVRead函数
b.本地生成一个参数文件,保存脚本需要使用的参数,如:user.txt
内容如:不需要列名,光标直接放在最后一行数据之后,不需要回车
Tom,123
jojo,bean
c.文件准备好后,在函数助手中参数文件路径后指定参数文件的路径,如:
C:\user.txt
d.再指定读取文件中的哪一列数据,如:0,序号从0开始,0表示文件中的第一列
${__CSVRead(c:\user.txt,0)}:当前参数名称表示从C盘的user.txt文件中读取第1列数据
方法2:
打开被测系统请求
1....
2.....返回Usersession(在该请求上添加后置处理器,获取usersession)
输入用户名密码登录请求${uid}
1...
2..返回welcome ,jojo(在该请求上添加响应断言,检查登录是否成功)
点击Flights按钮请求
提交城市请求${__Random(1,5,nump)}
提交航班请求${nump}
提交订单请求${nump},返回?Coach Class tickets from(在该请求上添加响应断言,判断提交订单是否成功,判断:${num}Coach Class tickts from)
退出请求
方式三:使用配置元件中的CSV Data Set Config进行参数设置,实现原理:从文件主管读取数据实现参数化
a.添加步骤:在线程组上右击鼠标选择添加->配置元件->CSV Data Set Config参数配置:
--Filename:C:\user.txt,文件名称,指参数化时读取数据的文件名称,从哪个文件读取数据使用在请求中
--File encoding:UFT-8,文件编码,默认编码方式为ANSI,最好指定一下编码
--Variable Names:un,ps,参数名称,从文件中读取数据后保存到该变量中,多个变量使用,(逗号)分割
--Delimiter:,(逗号),分隔符,分割列与列
--Allow quoted data:是否允许引用数据,默认为FALSE,表示在引用参数文件中的数据时,文件中是什么值,就传递什么值到参数中
--Recycle on EOF:结束后是否循环,默认为TRUE
--Stop thread on EOF:读取数据时读到参数文件末尾是,是否停止线程
--Sharing mode:共享模式
All threads:选择后,Test Plan测试计划中所有的线程共享CSV文件中的数据,所有的线程按照顺序方式取CSV文件中不同的记录,第一个线程取第一行数据。第二个线程取第二个数据....
Current thread group:选择后,Test plan中所有线程共享CSV文件中的数据,在当线程组中,即舍有线程组A、线程组B,A组内的线程A1到An,B组内的线程B1到Bn,取值情况为,A1取第一行数据,A2取第二行数据....,B1和A1取一样的数据,B2和A2取一样的数据
Current thread group:选择后,每个线程各自独立地使用CSV文件中的数据,假设设置了2个线程,则线程1取第一行数据,线程2也去第一行数据
注意:如果在线程组界面中选择了循环,读取CSV数据时,线程1第一次循环取第一行数据,第二次取第二行数据
方法2:使用函数助手里的__random进行参数化
添加步骤:在Jmeter中点击选项菜单栏->函数助手对话框->选择_Random函数
a.设定随机数的最小值:1
b.设定随机数的最大值:5
c.设置随机数保存的变量名称:nump(把随机出的数据保存到nump变量中)
d.点击“生成”按钮,生成参数名称
e.在需要使用参数的请求 中,把常量替换为参数名称:
第一次使用${__Random(1,5,nump)}
第二次使用:${nump}
第三次使用:${nump}..
三、Jmeter的思考时间(定时器)
1、Jmeter中的定时器如果设置后,那么每个取样器(请求)执行之前都会等待固定的时间
2、如果在Jmeter中添加了多个定时器,那么每个取样器(请求)执行之前会等待多个定时器叠加的时间
3、如果要控制某一个取样器(请求)的等待时间,就在该取样器上添加定时器
4、添加步骤:在线程组上右击->添加->定时器->固定定时器(时间是ms毫秒)
四、Jmeter的集合点
1、在Jmeter中石油Synchronizing Timer实现集合点功能,来模拟多用户并发执行测试,也就是说多用户在同一时刻执行某一个操作
2、添加步骤:右击测试计划->添加->定时器->Synchronizing Timer
C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin
五、Jmeter JDBC脚本案例
1、创建JDBC连接
在测试计划上右击选择添加->线程组
b.在线程组上右击选择 添加->JDBC
Connection Configuration
--Variable Name:mysql,
JDBC创建连接池的名称,再添加JDBC request时需要使用该名称
--DataBaseURL:jdbc:mysql://localhost:3307/jmeter
localhost:连接哪台计算机上的数据库,就写哪台计算机的IP地址
3307:数据库的端口号,mysql的端口默认是3306
jmeter:连接数据库的哪个库
jdbc:mysql://主机名:端口号/数据库名
--JDBC Driver class:
-- org.gjl.mm.mysql.Driver
--username:被连接的数据库登录用户名
--passwd:密码
c.添加JDBC取样器:在线程上右击选择“添加”->sampker->JDBC request ->Variable Name:mysql,跟JDBC connection configuration中的变量名称一致
--在JDBC Request界面写SQL语句
select * from user;
d.在测试计划中添加连接数据库的驱动:
点击“浏览”找到下载好的驱动路径
C:\Users\zhangxs\Desktop\新建文件夹\driver\mysql-connector-java-5.1.7-bin.jar
操作数据库的步骤
1、连接数据库,在cmd中
>>mysql -u root -p
>>
2、创建jmeter数据库
>>create database jmeter;
3、切换到jmeter数据库中
>>use jmeter;
4、在jmeter库中创建表
>>create table user(name varchar(20),passwd varchar(20));
5、在user表中插入数据
>>insert into user values(tom01,111);