元件:多个类似功能组件的容器(类似于类)。 常见的元件类型有: 1.取样器:发送请求。类似于自动化中的业务测试语句 2.逻辑控制器:控制元件执行顺序。类似于自动化中的逻辑控制语句 3.前置处理器:对发送的请求参数进行预处理。类似于自动化中的参数化 4.后置处理器:对收到的响应数据进行处理。类似于自动化中获得对应的测试结果 5.断言 6.定时器:等待一定时间。类似于自动化中的sleep语句 7.测试片段:封装的脚本,供其他脚本调用。类似于自动化中封装的函数 8.配置元件:测试前的环境及数据配置。类似于自动化中的初始化动作 9.监听器:查看测试的结果。类似于自动化中的日志和报告 组件:实现独立的某个功能(类似于方法)
在JMeter中,元件的作用域是靠测试计划的树形结构中元件的父子关系来确定的。
提示: 核心是取样器,其他组件都是以取样器为核心运行的,组件添加的位置不同,生效的取样器也不同。
按照jmeter测试计划的树形结构来定义作用域(有点儿类型python的缩进)
1.取样器:是jmeter的核心,不作用于其他的组件,元件不和其他元件相互作用,因此不存在作用域的问题; 2.逻辑控制器:元件只对其子节点中的取样器和逻辑控制器作用; 3.其他六大元件:除取样器和逻辑控制器元件外,如果是某个取样器的子节点,则该元件对其父子节点起作用; 4.如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等); 提示:以上元件中还没开始学习,暂时理解jmeter这种树形结构结构影响作用域即可。
1.配置元件(config elements) 2.前置处理程序(Per-processors) 3.定时器(timers) 4.取样器(Sampler) 5.后置处理程序(Post-processors) 6.断言(Assertions) 7.监听器(Listeners) 提示: 1.前置处理器、后置处理器、断言等元件功能对取样器起作用(如果在它们的作用域内没有任何取样器,则不会被执行) 2.如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序依次执行
需求:使用JMeter访问百度首页接口,并查看请求和响应信息
操作步骤
1.启动JMeter 2.在‘测试计划’下添加‘线程组’ 3.在‘线程组’下添加‘HTTP请求’取样器 4.填写‘HTTP请求’的相关请求数据 5.在‘线程组’下添加‘察看结果树’监听器 6.点击‘启动’按钮运行,并查看结果
线 程 组 HTTP取样器 察看结果树 提示:无论哪个案例基本都需要以上三个组件,在这里先讲解下以上组件。
说明:线程组是控制JMeter将用于执行测试的线程数,也可以把一个线程理解为一个测试用户。
2.1.1 添加线程组
位置:右键点击‘测试计划’ --> 添加 --> 线程(用户) --> 线程组
2.1.2 线程组的特点
模拟多人操作 线程组可以添加多个,多个线程组可以并行或串行 取样器(请求)和逻辑控制器必须依赖线程组才能使用 线程组下可以添加其他元件下组件
模拟多人操作
程组可以添加多个,多个线程组可以并行或串行
如下图,“独立运行每个线程组”勾选,则所有的线程组按照添加顺序串行执行;
如果未勾选,则并行执行(先后顺序无法保证)
2.1.3 线程组分类
普通线程组 普通的、常用的线程组,可以看做一个虚拟用户组,线程组中的每一个线程都可以理解为一个虚拟用户 setUp线程组 一种特殊类型的线程组,可用于执行预测试操作 tearDown线程组 一种特殊类型的线程组,可用于执行测试后工作
2.1.4 线程组参数详解
2.1.5 取样器错误后要执行的动作
继续:如果取样器里的执行出现错误失败的时候,请求不会停止,继续执行。 启动下一进程循环: 忽略错误,线程当前循环错误,执行下一个循环。 停止线程: 只限当前线程停止,不影响其他线程执行 停止测试: 当前执行的线程全部执行完毕后结束 立即停止测试: 立刻停止
2.1.6 线程组属性
线程数:需要模拟的虚拟用户数。 ramp-up time:模拟的虚拟用户数全部启动所需要的时间。 目的:为了模拟性能测试的场景,更接近用户的使用习惯(用户慢慢接入系统) 循环次数: 设置为固定次数n时:脚本运行时发送请求的次数为n 设置循环次数为“永远”时,脚本会一直运行下去,不停止 调度器: 一般与循环次数为“永远”的设置配合使用 持续时间设置为n时:脚本的请求发送的时间为n秒 延迟启动设置为n时:脚本的请求发送在等待n秒后再进行 延迟创建线程直到需要:当启动线程发送请求时,才分配资源;如果暂未启动该线程,则不分配。如果不勾选,在jmeter点击运行时立即分配(使用不多,了解即可,无法观察效果) 线程数m和循环次数n的关系: 如果同时配置,实际发送的HTTP请求数应该为m*n 虽然发送请求的次数相同,但是不能相互替换 线程数:代表并发用户数,体现服务器的负载量 循环次数:代表执行时间
2.1.7 调度器配置
持续时间(秒):设置脚本压测持续时间
启动延迟(秒):启动延迟时间
位置: 选中线程组->右键->添加->取样器->HTTP请求
作用: 向服务器发送http及https请求
协议:向目标服务器发送HTTP请求时的协议,可以是http或者是https ,默认值为http 服务器名称或IP :HTTP请求发送的目标服务器名称或IP地址。 端口号:目标服务器的端口号,默认值为80 。 方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。 路径:目标URL路径(不包括服务器地址和端口) Content encoding :内容的编码方式,默认值为iso8859 同请求一起发送参数:GET请求时url中附带参数可以通过此方式添加 消息体数据:POST/PUT请求JSON数据存放地
案例1:发送请求时:协议未填写,则默认为HTTP协议 端口未填写,则默认为80端口 将GET请求参数放在路径中填写
案例2:发送请求时: 协议选择HTTPS, 端口号为443 将GET请求参数放在下面的参数列表中进行填写
案例3:发送POSt请求,将参数内容放入到消息体数据中,在发送时参数会添加到请求体中发送
位置: 选中测试计划/线程组->右键->添加->监听器->察看结果树 作用: 查看请求请求和响应结果
取样结果:查看响应信息头信息、响应状态码 请求:查看请求相关信息(url、方法、参数) 响应:查看响应信息
用户定义的变量用户参数
CSV Data Set Config
函数
配置方法1:配置元件中配置
添加路径:测试计划——线程组——配置元件——用户定义的变量参数设置:
参数名:参数值
在HTTP取样器中应用:${参数名}
线程组下配置的用户定义的变量,在线程组下生效,与测试计划中配置的变量冲突时,以线程组下的为准
配置方法2:在测试计划中配置(全局生效)
添加方式:测试计划 --> 线程组--> 配置元件 --> 用户定义的变量
2.1 场景
请求:https://www.baidu.com
要求:使用用户定义的变量配置被测系统的协议、域名和端口
2.2 操作步骤
添加线程组
添加用户定义的变量
添加HTTP请求
添加查看结果树
用户定义的变量
HTTP请求设置
添加方式:测试计划 --> 线程组--> 前置处理器 --> 用户参数
使用用户定义的变量时,不同的用户在访问时,读取的参数值完全相同,如果希望每个用户在访问时的 变量不同,可以使用用户参数。
3.1 场景
请求:https://www.baidu.com
要求:第一次请求附带参数:name="张三"&age=28;第二次请求附带参数:name="李四"&age=30
3.2 操作步骤
1. 添加线程组 2. 添加用户参数 3. 添加HTTP请求 4. 添加查看结果树
线程组设置
线程数设置: 2
用户参数设置
HTTP请求设置
参数化格式:${参数名}
运行结果
添加方式:测试计划 --> 线程组--> 配置元件 --> CSV 数据文件设置
4.1 场景
请求:https://www.baidu.com
要求:循环3次,每次请求时附带参数username,password,code的值不相同
操作步骤
1. 定义CSV数据文件 2. 添加线程组 3. 添加CSV 数据文件设置 4. 添加HTTP请求 5. 添加查看结果树
4.1.1、定义CSV数据文件
4.1.2、线程组设置
4.1.3、配置CSV数据文件设置
添加位置:线程组——配置元件——CSV数据文件设置
参数配置:
4.1.4、HTTP请求设置
4.1.5、查看结果树
4.2 参数详解(CSV 数据文件设置)
文件名:CSV文件路径 文件编码:文件编译字符编码,一般设置UTF-8 变量名称:多个变量时,使用英文逗号分隔 忽略首行:True为忽略,False为不忽略,默认值:False 分隔符:如文件中使用的是逗号分隔,则填写逗号;如使用的是制表符,则填写\t; 是否允许带引号: CSV文件中的内容是否允许带引号 遇到文件结束符再次循环:当读取文件到结尾时,是否再从头读取文件,False=当读取文件到结尾时,停止读取文件 遇到文件结束符停止线程:当“遇到文件结束符再次循环”一项为False时起效;True:当读取文件到结尾时,停止进程 线程共享模式:共享模式一般默认即可 所有线程:该文件在所有线程之间共享,所有线程循环取值,线程一取第一行,线程二取下一行 当前线程组:各个线程组分别循环取值 当前线程:每个文件分别为每个线程打开
计数函数,一般做执行次数统计使用;
位置:在菜单中选择--> 选项 --> 函数助手对话框
5.1 函数助手
在HTTP取样器中,应用counter函数生成的函数字符串,就可以读取counter函数生成的数值。 如果counter参数设置为:TRUE,则每个用户分别从1开始计算,每循环一次加1 如果counter参数设置为:FALSE,则所有用户公用一个计数器,每发送一个请求时,取值加1
参数设置
TRUE,每个用户有自己的计数器;
FALSE,使用全局计数器
Name of variable in which to store the result (optional):用于存储结果的变量名(可选)
生成-复制
在HTTP取样器中,应用counter函数生成的函数字符串,就可以读取counter函数生成的数值。 如果counter参数设置为:TRUE,则每个用户分别从1开始计算,每循环一次加1 如果counter参数设置为:FALSE,则所有用户公用一个计数器,每发送一个请求时,取值加1
5.2 参数化调用
5.3 运行结果
CSV的作用域是针对线程的,只有两种情况: 对所有线程组中的线程生效 父节点是测试计划,并且线程共享模式是“所有线程”时,对所有线程组中的线程生效 对当前线程组中的线程生效 父节点是某个线程组时,只会对当前线程组生效 用户定义的变量作用域针对的是测试计划 无论用户定义的变量组件放在哪里,他都会针对整个测试计划生效
总结回顾 jmeter的元件和组件 元件类型: 线程组:模拟用户 取样器:发送请求 前置处理器:在取样器之前执行,对请求中的参数进行预处理(例如:赋值) —— 相当于postman的前置请求 后置处理器:在取样器之后执行,对响应中的结果进行处理(例如:提交响应字段)—— 相当于postman的test 定时器:等待sleep 监听器:日志、查看结果 配置元件:定义参数 断言:对于结果进行检查 测试片段:类似于定义的类,不单独运行,只供其他脚本调用 元件的执行顺序: 写脚本的顺序:定义参数 —— 对请求参数进行赋值 —— 发送请求 —— 收响应 —— 提取响应中的字段 —— 断言响应中的字段 —— 观察运行结果 元件执行顺序:配置元件 —— 前置处理器 —— 取样器 —— 后置处理器 —— 断言 —— 监听器 如果一个作用域下,有多个相同的元件时(例如:多个取样器),按照从上到下的顺序 执行 Jmeter基本组件 线程组 分类:普通线程组(可以并行或者串行执行)、setup线程组(先执行)、teardown线程组(后执行) 参数: 线程数、ranm-up time、运行次数、运行时间、延迟时间 HTTP请求 参数:协议、域名/IP、端口、请求方法、URL路径、编码格式、参数查看结果树 Jmeter参数化 用户定义的变量:每个用户每次读取的变量值都完全相同 用户参数:不同用户读取的变量值不同,但是同一用户在多次循环时读取的变量值是一致的 CSV数据文件:不同用户读取的变量值不同,同一用户在多次循环时读取的变量值也不同 函数:每次执行读取的变量值都不同,不需要提前定义数据(适用于对数量值无明确要求,只要求不同) 配置: 设置:每种不同 引用:${参数名}
断言:让程序判断预期结果和实际结果是否一致。
提示:JMeter断言是在请求的返回层面增加一层判断机制;因为请求成功了,并不代表结果一定正确,因此需要检测机制提高测试准确性。
响应断言 JSON断言 持续时间断言(Duration Assertion)
添加方式:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 断言 --> 响应断言
场景
请求:https://www.baidu.com
检查:让程序检查响应数据中是否包含“百度一下,你就知道”
操作步骤
添加线程组
添加HTTP请求
添加响应断言
添加断言结果
添加查看结果树
响应断言
Apply to:适用范围 Main sample and sub-samples: 作用于父节点取样器及对应子节点取样器; Main sample only: 仅作用于父节点取样器; Sub-samples only: 仅作用于子节点取样器; JMeter Variable: 作用于jmeter变量(输入框内可输入jmeter的变量名称); 测试字段:要检查的项 响应文本: 来自服务器的响应文本,即主体,不包括任何HTTP头 响应代码: 响应的状态码,例如:200 响应信息: 响应的信息,例如:OK Response Headers: 响应头部 Request Headers: 请求头部 Request Data: 请求数据 URL样本:响应的URL Document(text): 响应的整个文档忽略状态:忽略返回的响应状态码 模式匹配规则 包括:文本包含指定的正则表达式 匹配:整个文本匹配指定的正则表达式 Equals:整个返回结果的文本等于指定的字符串(区分大小写) Substring:返回结果的文本包含指定字符串(区分大小写) 否:取反 或者:如果存在多个测试模式,勾选代表逻辑或(只要有一个模式匹配,则断言就是OK),不勾选代表逻辑与(所有都 必须匹配,断言才是OK) 注意:Equals和Substring模式是普通字符串,而不是正则表达式 测试模式 即填写你指定的结果(可填写多个),按钮【添加】、【删除】是进行指定内容的管理
该组件用来对JSON文档进行验证,验证步骤如下:
首先解析JSON数据,如果数据不是JSON,则验证失败。
使用Jayway JsonPath 1.2.0中的语法搜索指定的路径。如果找不到路径,就会失败。
如果在文档中找到JSON路径,并且要求对期望值进行验证,那么它将执行验证操作。
添加方式
测试计划 --> 线程组--> HTTP请求 --> (右键添加) 断言 --> JSON断言
场景
请求:http://www.weather.com.cn/data/sk/101010100.html
检查:让程序检查响应的JSON数据中,city对应的内容是否为“北京”
操作步骤
添加线程组
添加HTTP请求
添加JSON断言
添加断言结果
添加查看结果树
JSON断言
Assert JSON Path exists:用于断言的JSON元素的路径 Additionally assert value:如果您想要用某个值生成断言,请选择复选框 Match as regular expression:如果需要使用正则表达式,请选择复选框 Expected Value:期望值,用于断言的值或用于匹配的正则表达式的值 Expect null:如果希望为空,请选择复选框 Invert assertion (will fail if above conditions met):反转断言(如果满足以上条件则失败)
添加方式:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 断言 --> 断言持续时间
场景
请求:https://www.jd.com
检查:让程序检查响应时间是否大于500毫秒
操作步骤
添加线程组
添加HTTP请求
添加断言持续时间
添加断言结果
添加查看结果树
断言持续时间
持续时间(毫秒):在将每个响应标记为失败之前允许的最大毫秒数
当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。 JMeter可以通过“后置处理器”中的一些组件来处理关联。
常用的关联方法: 正则表达式提取器 XPath提取器 JSON提取器
添加方式:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 后置处理器 --> 正则表达式提取器
请求:http://www.itcast.cn/ ,获取网页的title值
请求:https://www.baidu.com/ ,把获取到的title作为请求参数
正则表达式介绍:百度一下,你就知道 百度一下,你就知道 .*? . 是通配符,可以代表任意字符(除换行回车) * 代表前面的字符出现0次或者多次 .* 匹配规则:找到左边界值后,往右查找有边界,找到最后面的右边界,中间的所有数据都被记录下来 ? 代表非贪婪匹配,找到左边界后,往右查找匹配右边界,只要有匹配的右边界就停止继续查找;再次查找左边界和右边界 左边界(.*?)右边界:可以提取出想要获取的数据内容
添加线程组
添加HTTP请求
添加正则表达式提取器
添加HTTP请求-百度
添加查看结果树
正则表达式提取器
HTTP请求设置(百度)
引用名称:下一个请求要引用的参数名称,如填写title,则可用${title}引用它 正则表达式 () 括起来的部分就是要提取的。 . 匹配任何字符串,通配符 + 一次或多次。 ? 不要太贪婪,在找到第一个匹配项后停止。 模板:用$$引用起来,如果在正则表达式中有多个正则表达式,则可以是$2$$3$等等,表示解析到的第几个值给title。如:$1$表示解析到的第1个值 匹配数字:0代表随机取值,-1代表全部取值,1代表取第一个值 缺省值:如果参数没有取得到值,那默认给一个值让它取。
添加方式:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 后置处理器 --> XPath提取器
请求:http://www.itcast.cn/ ,获取网页的title值
请求:https://www.baidu.com/ ,把获取到的title作为请求参数
1、添加线程组
2、添加HTTP请求——传智播客首页
3、添加xpath提取器
勾选Use Tidy
填写引用名称:参数名
Xpath路径
4、添加HTTP请求——百度首页
引用xpath提取器中定义的参数名:${参数名} 5、添加查看结果树
正则表达式提取器
Use Tidy (tolerant parser):如果勾选此项,则使用Tidy将HTML响应解析为XHTML。当需要处理的页面是HTML格式时,必须选中该选项,当需要处理的页面是XML或XHTML格式(例如,RSS返回)时,取消选中该选项。 引用名称:存放提取出的值的参数 XPath Query:用于提取值的XPath表达式 匹配数字:如果XPath路径查询导致许多结果,则可以选择提取哪个作为变量 0:表示随机 -1:表示提取所有结果(默认值),它们将被命名为<变量名>_N(其中N从1到结果的个数) X:表示提取第X个结果。如果这个x大于匹配项的数量,则不返回任何内容。将使用默认值 缺省值:参数的默认值
添加方式:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 后置处理器 --> JSON提取器
请求获取天气的接口,http://www.weather.com.cn/data/sk/101010100.html
获取返回结果中的城市名称
请求:https://www.baidu.com/s?wd=北京 ,把获取到的城市名称作为请求参数
1、添加线程组 2、添加HTTP请求——天气 3、添加JSON提取器 参数名 JSON路径 4、添加HTTP请求——百度, 应用JSON提取器中定义的参数名 5、添加查看结果树
JSON提取器
Names of created variables:存放提取出的值的参数
JSON Path Expressions:JSON路径表达式
当有依赖关系的两个请求(一个请求的入参是另一个请求返回的数据),放入到不同的线程组中时,就不能使用提取器保存的变量来传递参数值,而是要使用Jmeter属性来传递。
函数实现: 1. setProperty函数:将值保存成jmeter属性 2. property函数:在其他线程组中使用property函数读取属性 备注:setProperty函数需要通过BeanShell取样器来执行(BeanShell取样器作用:执行函数和java脚本)
线程组1:请求获取天气的接口,http://www.weather.com.cn/data/sk/101010100.html
获取返回结果中的城市名称
线程组2:请求:https://www.baidu.com/s?wd=北京 ,把获取到的城市名称作为请求参数
添加线程组1
添加HTTP请求-天气
添加JSON提取器
添加BeanShell取样器(将JSON提取器提取的值保存为Jmeter属性)
(填写setProperty函数( 函数助手)——将提取器提取出来的值赋值给Jmeter属性)
添加线程组2,添加HTTP请求-百度(读取Jmeter属性)
引用前面返回的城市信息(使用property函数( 函数助手)——将Jmeter属性值读取出来)
添加查看结果树
在没有接口文档的旧项目当中,快速录制web页面产生的http接口请求,帮助编写接口测试脚本
代理服务器的原理主要拦截和转发请求与响应数据。
1. 开启操作系统的浏览器代理
开启后,windows操作系统中所有的http请求都会发送给设置的代理服务器。如果这个代理服务器没有启动,那么会提示网络连接错误。
保存后,访问页面会提示
2. 在jmeter当中添加非测试元件HTTP代理服务器,并进行配置
在jmeter当中添加HTTP代理服务器:测试计划(右键)->非测试元件->HTTP代理服务器
配置代理服务器的参数
State: 1.设置端口:代理服务程序端口程序 2.启动按钮 Test Plan Creation: 1.目标控制器:录制的脚本放到那个容器 2.分组: 1).不对样本分组:对所有录制的取样器不分组。 2).在组间添加分组:在取样器分组之间添加以名为 "---"的控制器。 3).每个组放入一个新的控制器:每个分组放到一个新的简单控制器下。 4).只存入每个组的第一个样本:只要每个分组的第一个请求会被录制。 5).Put each group in a new transaction controller: (每个分组创建一个事务控制器,那个分组的所有取样器都保存在控制器下。) Requests Filtering: 包含模式:url匹配正则表达式,包含此项 如:.*localhost.* 排除模式:url匹配正则表达式,不包含此项 如:.*.css .*.jpg .*.jpeg .*.png .*.js
注意事项:
jmeter的代理服务器组件配置中,配置的端口必须和windows的浏览器代理的端口号保持一致
3. 启动代理服务器,开始录制
先点击启动
等待一段时间后,会弹出一个证书确认窗口,这个证书用于抓取https接口请求。
后续如果需要抓取https的请求时,需要按照这个窗口的提示添加证书到操作系统当中
最后的效果:
在浏览器页面中进行操作,成功后,就能在jmeter当中看到抓取到的接口请求了。
访问TPSHOP商城主页
回到jmeter查看录制结果
Cookie管理器:
管理cookie:自动将cookie信息添加到后续的所有请求中。
登录及后续的相关操作时,需要提前添加HTTP Cookie管理器
回顾: 一、断言 1、响应断言 使用范围:HTTP消息的任何格式的响应 1.1、参数配置 需要断言的字段:文本内容、响应码、响应头、请求URL、请求头、请求体 断言的方式:等于/包含、非、或、和 需要断言的数据(预期结果) 1.2、Json断言 使用范围:响应消息为JSON格式的响应 参数配置: JSON路径:$.开头 需要断言的数据(预期结果) 1.3、断言持续时间 使用范围:对请求的响应时间进行断言 参数配置: 预期响应时间(单位:ms):当时间响应时间超过该值时会报错 二、关联 1、线程组内的关联(通过后置处理器实现): 1.1、正则表达式提取器 使用范围:适用于任何格式的响应数据 参数配置: 参数名:提取出来的数据要保存的变量名 正则表达式:左边界(.*?)右边界 模板:$1$(代表提取正则表达式中第1个括号的内容) 值:-1(返回全部的值),n(返回列表中第n个匹配上的值) 引用: 在后续请求中引用提取器中定义的参数名:${参数名} 1.2、xpath提取器 使用范围:适用于HTML格式的响应数据 参数配置: 参数名:提取出的数据要保存的变量名 xpath路径:定位某个页面元素的路径 值:-1(返回全部的值),n(返回列表中第n个匹配上的值) 引用: 在后续请求中引用提取器中定义的参数名:${参数名} 1.3、JSON提取器 使用范围:适用于JSON格式的响应数据 参数配置: 参数名:提取出的数据要保存的变量名 JSON路径:定义到JSON字符串中某个值的路径 引用: 在后续请求中引用提取器中定义的参数名:${参数名} 2、线程组间的关联(Jmeter属性): 步骤(案例:天气接口,百度搜索-天气接口返回的城市信息): 2.1、添加线程组1,添加HTTP请求——天气接口的请求 2.2、使用提取器(正则表达式/xpath/JSON提取器)提取出天气接口中的城市数据 2.3、添加Bean Shell取样器(写入setProperty函数,将提取出城市数据赋值给Jmeter属性) 2.4、添加线程组2,添加HTTP请求——百度接口的请求 引用Jmeter属性中保存的城市数据(property函数读取) 2.5、添加查看结果树 三、脚本录制 录制步骤: 1、在测试计划中添加非测试元件中的HTTP代理服务器 2、配置HTTP代理服务器 Jmeter代理的端口 配置目标控制器:选择一个线程组,将脚本录制到该线程组中 filter过滤:正向/反向 3、配置PC机中的代理设置。 配置IP(Jmeter的IP-本机IP) port(第2步中配置的Jmeter代理的端口) <-loopback> 4、启动HTTP代理服务器的配置 5、进入浏览器进行操作,HTTP请求会自动记录在Jmeter中 HTTP Cookie管理器: 自动记录请求中的登录状态 当录制登录及后续相关的所有操作时,在录制的脚本运行时,需要添加HTTP Cookie管理器,脚本才能正确运行。
连接tpshop商城数据库获取商品名包含:小米手机5 的商品id
启动tpshop数据库服务器
库名:tpshop2.0
表名:tp_goods
商品id字段:goods_id 商品名字段:goods_name
添加MySQL驱动jar包
在测试计划面板点击“浏览…“按钮,将你的JDBC驱动添加进来
配置数据库连接信息
添加方式:测试计划 --> 线程组--> (右键添加) 配置元件 --> JDBC Connection Configuration
主要参数:
Variable Name: mysql数据库连接池名称(JDBC请求时要引用) Database URL: jdbc:mysql://localhost:3306/tpshop2.0 jdbc:mysql:(MySQL固定格式) //127.0.0.1:(数据库ip地址) 3306:(MySQL默认端口,如改变,请如实填写) books:要连接的数据库名称 JDBC DRIVER class: com.mysql.jdbc.Driver(MySQL驱动包位置固定格式) Username: root(连接数据库用户名,如实填写) Password:(MySQL数据库密码,如实填写,如果密码为空不写)
添加线程组
添加 JDBC Connection Configuration
添加 JDBC request
添加查看结果树
JDBC request设置
主要参数:
Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字保持一致 Query:填写的sql语句未尾不要加“;” Parameter values:参数值 Parameter types:参数类型 Variable names:保存sql语句返回结果的变量名 Result variable name:创建一个对象变量,保存所有返回的结果 Query timeout:查询超时时间 Handle result set:定义如何处理由callable statements语句返回的结果
运行结果
编写JDBC脚本步骤(搜索指定商品,在返回结果中检查是否包含指定商品的ID的详情URL):
1、添加JDBC Request请求
JDBC连接池名称:必须与“JDBC连接池”中的连接名一致
要执行的sql语句
Variable Name中:写明要保存的数据的参数名
2、添加HTTP请求 —— 搜索请求
参数为中文时,将参数写到下方参数位置,并勾选上“编码”
3、添加响应断言:
在响应断言中配置要检查的数据内容。
注意:应用JDBC Request查询出的结果时,需要加上索引(因为JDBC查询的结果保存为一个列表)
逻辑控制器可以按照设定的逻辑控制取样器的执行顺序
如果(If)控制器
循环控制器
ForEach控制器
If控制器用来控制它下面的测试元素是否运行
添加方式:测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> 如果(If)控制器
需求
使用‘用户定义的变量’定义一个变量name,name的值可以是‘baidu’或‘itcast’
根据name的变量值实现对应网站的访问
操作步骤
添加线程组
用户定义的变量
添加If控制器,判断name是否等于baidu
添加HTTP请求,用来访问百度
添加If控制器,判断name是否等于itcast
添加HTTP请求,用来访问传智播客
添加查看结果树
If控制器
第一种配置方法:
第二种配置方法:
勾选上Interpret Condition as Variable Expression,判断条件需用使用jexl3函数。
(使用这个函数来进行判定时,Jmeter自身的执行效果要高一些)
通过设置循环次数,来实现循环发送请求
添加方式:测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> 循环控制器
循环访问百度10次
操作步骤
添加线程组
添加循环控制器
添加HTTP请求
添加查看结果树
循环控制器
思考:线程组属性可以控制循环次数,那么循环控制器有什么用?
线程组属性控制组内所有取样器的执行次数,而循环控制器可以控制组内部分取样器的循环次数,后者控制精度更高
ForEach控制器一般和用户自定义变量或者正则表达式提取器一起使用,其在用户自定义变量或者从正则表达式提取器的返回结果中读取一系列相关的变量。 该控制器下的取样器都会被执行一次或多次,每次读取不同的变值。
添加方式:测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> ForEach控制器
有一组关键字 [hello,python,测试],使用用户定义的变量存储
要依次取出关键字,并在百度搜索,例如:百度安全验证
操作步骤
添加线程组
用户定义的变量
添加ForEach控制器
添加HTTP请求
添加查看结果树
用户定义的变量
ForEach控制器
HTTP请求
访问传智播客首页http://www.itcast.cn,获取首页中的地址信息,并全部保存下来
要依次取出关键字,并在百度搜索,例如:https://www.baidu.com/s?wd=地址1
操作步骤
添加线程组
添加HTTP请求1 (传智播客)
添加正则表达式提取器
添加ForEach控制器
添加HTTP请求2(百度)
添加查看结果树
与正则表达式配合使用:
1、添加HTTP请求——itcast首页
2、添加正则表达式提取器,提取出itcast响应中所有的地址相关的数据,并保存为参数area(列表数据)
3、添加ForEach控制器,循环提取area列表中的每一个地址信息
4、在ForEach控制器下添加一个HTTP请求——百度,引用ForEach控制器中定义的变量${word},作为 参数
5、添加查看结果树
提示:在Jmeter中叫做同步定时器,在其他软件中又叫集合点。
思考?
如何模拟多个用户同时抢一个红包?
如何测试电商网站中的抢购活动、秒杀活动?
SyncTimer的目的是阻塞线程,直到阻塞了n个线程,然后立即释放它们。
同步定时器相当于一个储蓄池,累积一定的请求,当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起并发,所以可以用来做大数据量的并发请求。
添加方式:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 定时器 --> Synchronizing Timer
场景
模拟100个用户同时访问百度首页,统计高并发情况下运行情况
操作步骤
操作截图
问题: 当用户数不能整除集合点组件的一组用户数属性时,如果超时时间是 0,会导致程序挂起,怎么避免挂起?
实现:
方案1: 点击 stop 强行终止,但是不建议
方案2: 修改一组用户数,能够做到整除(治标不治本)
方案3: 修改超时时间,不设置为 0,即便一组用户数填充不满,只要超时,也会执行(建议)
常数吞吐量定时器可以让JMeter以指定数字的吞吐量(以每分钟的样本数为单位,而不是每秒)执行。 吞吐量计算的范围可以为指定为当前线程、当前线程组、所有线程组。
添加方式:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 定时器 --> Constant Throughput Timer
一个用户以 20QPS (20 次/s) 的频率访问百度首页,持续一段时间,统计运行情况
操作步骤
添加线程组,循环次数设置成永远
添加HTTP请求
添加常数吞吐定时器
添加查看结果树
添加监听器-聚合报告
操作截图
查看聚合报告的 Throughput 字段,实际值围绕设置的QPS值上下波动
注意:常数吞吐量定时器只是帮忙达到性能测试的负载(压力)要求,本身不代表性能有bug/无bug
对于bug的分析需要通过响应时间来判断
在使用JMeter进行性能测试时,如果并发数比较大(比如项目需要支持10000并发),单台电脑的(CPU和内存)可能无法支持,这时 可以使用JMeter提供的分布式测试的功能。
1. JMeter分布式测试时,选择其中一台作为控制机(Controller),其它机器做为代理机(Agent)。 2. 执行时,控制机会把脚本发送到每台代理机上,代理机拿到脚本后就开始执行,代理机执行时不需要启动JMeter界面,可以理解它是通过命令行模式执行的。 3. 执行完成后,代理机会把结果回传给控制机,控制机会收集所有代理机的信息并汇总。
分布式相关注意事项: 1、测试机上所有的防火墙关闭 2、所有的控制机、代理机、被测系统都在同一个子网中 3、所有的控制机和代理机上安装的Jmeter和JDK的版本必须完全一样。 4、要关闭Jmeter中的RMI SSL开关
分布式配置与运行: 配置 代理机(Jmeter.property) server_port :代理机启动的端口,不冲突即可 server.rmi.ssl.disable=true 控制机 remote_hosts: 代理机的IP:port,如果有多个代理机用','分隔 server.rmi.ssl.disable=true 运行: 代理机 进入bin目录下,执行jmeter_server.bat 控制机: 进入bin目录下,执行jmeter.bat 启动时,点击“运行”——“远程启动所有”控制代理机的运行
1.Agent机上需要安装JMeter 2.修改服务端口 -注意:非必须。如果是在同一台机器上演示需要使用不同的端口,多台机器可以不修改 -打开bin/jmeter.properties文件,修改`server_port`,比如:`server_port=2001` 3. 将RMI SSL设置为禁用 - 打开bin/jmeter.properties文件,修改为:server.rmi.ssl.disable=true 4. 运行Agent上的jmeter-server.bat文件,启动JMeter
1. 修改JMeter的bin目录下jmeter.properties配置文件,修改`remote_hosts` - 示例:`remote_hosts=192.168.182.100:1099,192.168.182.101:1099` - IP和Port是Agent机的IP以及自定义的端口,多台Agent之间用","隔开 2. 将RMI SSL设置为禁用 - 打开bin/jmeter.properties文件,修改为:server.rmi.ssl.disable=true 3.启动JMeter 4.选择菜单:运行-->远程启动/远程全部启动
一台控制机和两台执行机,做分布式;要求控制机启动,两台执行机执行,反馈结果;
实现步骤
1.配置代理机一,并启动 2.配置代理机二,并启动 3.配置控制机,并启动 4.添加线程组 5.添加HTTP请求 6.添加聚合报告
1.修改完端口要重启JMeter 2.控制机和代理机最好分开,由于控制机需要发送信息给代理机并且会接受代理机回传的测试数据,所以控制机自身会有消耗 3.参数文件:如果使用csv进行参数化,那么需要把参数文件在每台slave上拷一份且路径需要设置成一样的; 4.每台机器上安装的JMeter版本和插件最好都一致,否则会出一些意外的问题;
位置: 测试计划->右键->监听器->聚合报告
1.Label:每个请求的名称(勾选:在标签中包含组名称,显示线程组名-取样器名) 2.#样本:各请求发出的数量 3.平均值:平均响应时间(单位:毫秒)。默认是单个Request的平均响应时间 4.中位数:中位数,50% <= 时间 5. 90%百分比:90% <= 时间 6. 95%百分比:95% <= 时间 7. 99%百分比:99% <= 时间 8.最小值:最小响应时间 9.最大值:最大响应时间 10.异常%:请求的错误率 = 错误请求的数量/请求的总数 11.吞吐量:吞吐量。默认情况下表示每秒完成的请求数,一般认为它为TPS。 12.接收 KB/sec:每秒从服务器端接收到的千字节数 13.发送 KB/sec:每秒向服务器发送的千字节数
重点关心的性能指标: 响应时间 观察当前的最大最小值的波动范围 如果波动范围不大,以平均响应时间作为最终的性能响应时间结果 如果波动范围很大,以90%(经验)的响应时间作为最终性能响应时间结果 错误率 吞吐量
JMeter支持生成HTML测试报告,以便从测试计划中获得图表和统计信息。
步骤: 1、在bin目下执行上述命令 2、等待脚本执行完成后,进行report文件夹下,打开index.html,可以看到性能测试的详细数据 统计 jmeter -n -t [jmx file] -l [result file] -e -o [html report folder] eg: jmeter -n -t hello.jmx -l result.jtl -e -o ./report 参数描述: -n:非GUI模式执行JMeter -t [jmx file]:测试计划保存的路径及.jmx文件名,路径可以是相对路径也可以是绝对路径 -l [result file]:保存生成测试结果的文件,jtl文件格式 -e:测试结束后,生成测试报告 -o [html report folder]:存放生成测试报告的路径,路径可以是相对路径也可以是绝对路径 注意:result.jtl和report会自动生成,如果在执行命令时result.jtl和report已存在,必须用先删除,否则在运行命令时就会报错
打开index.html,就可以看到页面左侧有三个菜单:
Test and Report information
Source file 生成报告的源文件 Start Time 开始时间 End Time 结束时间
APDEX (应用性能指标)
计算每笔交易APDEX的容忍和满足阈值基于可配置的值,范围在 0-1 之间,1表示达到所有用户均满意 T(Toleration threshold):容忍或满意阈值 F(Frustration threshold):失败阈值
Requests Summary(请求总结)
成功与失败的请求占比,KO指失败率,OK指成功率
它包括Over Time(时间变化) 、Throughput(吞吐量) 、Response Times(响应时间)
PV:(Page View)即页面访问量,每打开一次页面PV计数+1,刷新页面也是。PV只统计页面访问次数。UV(Unique Visitor),唯一访问用户数,用来衡量真实访问网站的用户数量。
一般用UV统计用户活跃数,用PV统计用户访问页面的频率
并发数计算: (1)普通的计算方式: TPS = 总的请求数 / 总的时间 问题:对于同一天的时间内,不同的时间段,请求速率会有波动,这样计算会被平均掉,无法测试负载高的情况 (2)二八原则: 核心:80%的请求数会集中在20%的时间内完成 TPS = 总的请求数 *80% / 总的时间 * 20 注意:二八原则的计算方法会比平均的计算方式更准确 (3)按照每天的具体业务数据进行计算(稳定性测试TPS) 当获取每天的具体业务统计数据时,就可以统计出业务请求集中的时间段作为有效业务时间;并统计有效业务时间内的总请求数 TPS = 有效业务时间的总请求数 * 80% / 有效业务时间 * 20% (4)模拟用户峰值业务操作的并发量:(压力测试TPS) 获取每天的交易峰值的时间段,及这个时间段内的所有请求的数量 TPS = 峰值时间内的请求数/峰值时间段 * 系数 系数可以是:2、3、6、10,由项目组自己觉得要达成的性能指标
计算公式:TPS= 总请求数 / 总时间
按照需求所示,在2019年第32周,有4.13万的浏览量,那么总请求数,我们可以认为估算为4.13万(1次浏览都至少对应1个请求) 总请求数 = 4.13 万请求数 = 41300 请求数 总时间:由于不知道每个请求的具体时间,我们按照普通方法,我们可以按照一周的时间进行计算总时间 = 1天 = 1 * 24 小时 = 24 * 3600 秒 套入公式可得: TPS = 41300请求数/24*3600秒 = 0.48请求数/秒 结论:按照普通计算方法,我们在测试环境对相同的系统进行性能测试时,每秒能够发送0.48请求就可以满足线上的需要。
二八原则就是指80%的请求在20%的时间内完成
计算公式 : TPS = 总请求数 80**% / (总时间20%)
按照公式进行计算 TPS = 41300 * 0.8请求数 / 24*3600*0.2秒 = 1.91 请求数/秒 结论:按照二八原则计算,在测试环境我们的TPS只要能达到1.91请求数每秒就能满足线上需要。二八原则的估算结果会比平均值的计算方法更能满足用户需求。
业务数据:有的公司会统计一定时间内的所有业务数据,我们可以根据这个业务数据曲线图,统计出最多请求的数量和时间比例。
曲线图看趋势
直方图看数据和趋势
计算模拟用户正常业务操作(稳定性测试)的并发量:
根据这些数据统计图,可以得出结论:
大部分订单在8点-24点之间,因此系统的有效工作时长为16个小时 从订单数量统计,8-24点之间的订单占一天总订单的98%左右(40474个)
结合二八原则计算公式 : TPS = 总请求数 80**% / (总时间20%)
需要在测试环境模拟用户正常业务操作(稳定性测试)的并发量为: TPS = 40474 * 0.8请求数 / 16*3600*0.2秒 = 2.81 请求数/秒
计算模拟用户峰值业务操作(压力测试)的并发量:
根据这些数据统计图,可以得出结论:
订单最高峰在在21点-22点之间,一小时的订单总数大约为8853个 计
算压力测试的并发数:TPS = 峰值请求数/峰值时间 * 系数
需要在测试环境模拟用户峰值业务操作(压力测试)的并发量为: TPS = 8853 请求数 / 3600秒 * 3(系数) = 7.38 请求数/秒
练习
基于需求: 稳定性分析 有效的交易时间为10:00-14:00,17:00-24:00,一共为7个小时 有效的请求数:100e/300 稳定性TPS = 100e/300 * 80% / (11*3600*20%) 压力分析 峰值的交易时间为19:00-20:00,一共为1个小时 有效的请求数:20e/300 峰值TPS = 20e/300/3600 * 系数
说明:下载jmeter插件管理工具包(可以用此包下载jmeter插件)
1.下载包管理工具jar包 2.将包管理工具jar包添加到jmeter中 3.下载性能测试常用组件
下载: https://jmeter-plugins.org/install/nstall/
将jar包添加到jmeter中
提示:存放到jmeter安装目录 lib\ext\目录下
1.Concurrency Thread Group 线程组 2.Transactions per Second 每秒事务数 3.Bytes Throughput Over Time 吞吐量 4.PerfMon Metrics Collector 性能指标收集器
说明:阶梯线程组
添加方式:测试计划 --> 线程(用户)--> Concurrency Thread Group
参数: 重点: Target Concurrency:目标并发(线程数) Ramp Up Time:加速时间 Ramp-Up Steps Count:加速步骤计数 Hold Target Rate Time:运行时间 Time Unit:时间单位(分钟或者秒) 了解: Thread Iterations Limit:线程迭代次数限制(循环次数) Log Threads Status into File:将线程状态记录到文件中(将线程启动和线程停止事件保存为日志文件)
说明:每秒完成事务数 场景:统计业务成功率
添加方式:测试计划 --> 线程组--> 监听器-->Transactions per Second
提示:需要配合事务控制器完成,如果不使用事务控制器,默认1个请求为1个事务
说明:查看服务器吞吐流量 单位/字节
添加方式:测试计划 --> 线程组--> 监听器-->Bytes Throughput Over Time
说明:用来监控服务端的性能的工具,包括cpu、内存、磁盘、网络等性能数据
添加方法:线程组->监听器->jp@gc - PerfMon Metrics Collector
注意:使用之前需要在服务器端安装监听服务程序并启动
监控服务器服务程序:
下载安装包ServerAgent-2.2.3.zip,链接地址:GitHub - undera/perfmon-agent: Server metrics fetching agent, based on SIGAR
解压ServerAgent-2.2.3.zip
启动,如果是windows运行startAgent.bat,如果是linux运行startAgent.sh
启动这个工具后,jmeter的插件jp@gc - PerfMon Metrics Collector就可以收集服务端的资源使用率,并在jmeter中查看了