03. JMeter进行HTTP接口测试的技术要点
03. JMeter进行HTTP接口测试的技术要点
1. 参数化
参数化
- 本质
- 使用参数的形式来替代脚本中固定的测试数据
- 实现方式
- 定义变量(最基础)
- 函数方式(灵活,业务场景使用)
- 定义文件(所有测试数据都是固定的情况下)
- 数据库方式(灵活,业务场景使用)
- 本质
为什么要使用参数化?
- 如果要访问某一个请求10次,要求每次请求发送不同的参数值,该如何做?
参数化测试
- 把测试数据组织起来,用不同的测试数据调用相同的测试方法。
JMeter中常见的参数化方式
- 用户定义的变量
- 用户参数
- CSV Data Set Config
- 函数
1. 用户定义的变量
作用 (什么时候使用用户定义的变量)
- 定义全局变量
位置
- 测试计划 --> 线程组 --> 配置元件 --> 用户定义的变量
使用“用户定义的变量”进行参数化的步骤?
- 添加线程组
- 添加用户定义的变量**。格式:变量名 – 变量值**
- 添加HTTP请求,引用定义的变量名。格式:${变量名}
- 添加查看结果树
演示
请求:https://www.baidu.com:443
要求:使用用户定义的变量配置被测系统的协议、域名和端口
操作步骤:
添加线程组
添加用户定义的变量
添加HTTP请求
添加查看结果树
2. 用户参数
为什么要使用用户参数?
- 性能测试时有多个用户同时请求,每个用户在登录请求时需要使用不同的用户名和密码进行登录,该怎么做?
作用
- 针对同一组参数,当不同的用户来访问时,可以获取到不同的值(针对同一组参数,当不同的用户来访问时,可以获取到不同的值)
位置
- 测试计划 --> 线程组 --> 前置处理器 --> 用户参数
使用“用户参数”进行参数化的步骤?
- 添加线程组,设置线程数为n(表示模拟的用户数)
- 添加用户参数
- 第一列添加多个变量名
- 后续每一列为一组用户的数据
- 添加HTTP请求,引用定义的变量名。格式:${变量名}
- 添加查看结果树
演示
- 请求: https://www.baidu.com
- 要求:第一个用户请求附带参数:name=“张三”&age=28; 第二个用户请求附带参数:name="李四 "&age=30
- 步骤
- 添加线程组,线程数设置为2
- 添加用户参数
- 添加HTTP请求
- 添加查看结果树
- 用户参数保证每个虚拟用户取值不同,无法保证用户每次循环参数不同
3. CSV数据文件设置
为什么要使用CSV数据文件参数化?
- 性能测试时有多个用户登录,登录后循环添加商品,每次添加时商品的参数不能相同,该怎么做?
作用
- 让不同用户在多次循环时,可以取到不同的值(当不同的用户或者同一个用户多次循环时,都可以获取到不同的值)
位置
- 测试计划 --> 线程组--> 配置元件 --> CSV 数据文件设置
步骤
定义CSV数据文件
添加线程组
添加CSV数据文件设置
添加HTTP请求,引用定义的变量名。格式:${变量名}
添加查看结果树
演练
请求
- https://www.baidu.com
要求
- 循环请求3次,每次请求时附带参数username,password,code的值不相同
步骤
定义CSV数据文件
添加线程组,设置循环次数为3
添加CSV数据文件设置
添加HTTP请求
添加查看结果树
4. 函数( __counter)
- 为什么要使用函数参数化?
- 性能测试时,如果模拟1000个用户,每个用户循环执行10万次添加商品操作,请求参数要求不同,该怎么做?
- 作用
- 计数函数,一般做执行次数统计使用(自动生成不重复的数据,让每个用户每次循环都能取到不同的数据,且不需要提前定义)
- 位置
- 在菜单中选择--> 工具 --> 函数助手对话框
步骤
添加线程组,设置虚拟用户数和循环次数
生成 __counter函数
添加HTTP请求,使用__counter函数。格式:$
添加查看结果树
设置
- TRUE,每个用户有自己的计数器;
- FALSE,使用全局计数器
- Name of variable in which to store the result (optional): 用于存储结果的变量名(可选)
使用
- 生成-复制
练习
请求
- 访问百度首页 http://www.baidu.com/S?num=1
要求:每个用户每次循环执行该脚本都可以使用不同的值
操作步骤:
添加线程组,设置虚拟用户数和循环次数
生成 __counter函数
添加HTTP请求,使用 __counter函数
添加查看结果树
还可以使用 配置原件 -> 计数器
5. 小节
什么是参数化?
- 把测试数据组织起来,用不同的测试数据调用相同的测试方法。
4种参数化方式有何不同?如何选择适当的方式?
用户定义的变量
- 作用:定义全局变量
- 局限性:每次取值(无论是否相同的用户)都是固定值
用户参数
- 作用:保证不同的用户针对同一组参数,可以取到不同的值
- 局限性:同一个用户在多次循环时取到相同的值
CSV数据文件设置:
- 作用:保证不同的用户及同一用户多次循环时,都可以取到不同的值
- 局限性:需要手动进行测试数据的设置
函数/配置原件 -> 计数器
作用:保证不同的用户及多次循环时,都可以取到不同的值,不需要提前设置
局限性:输入数据有特定的业务要求时无法使用(如:登录时的用户名密码)
2. 断言
- 为什么要使用JMeter断言?
- 手工执行测试用例时可以肉眼观察结果,使用工具代替手工执行用例时,如何判断用例是否通过?
- 断言
- 让程序自动判断预期结果和实际结果是否一致
- 提示
- JMeter在请求的返回层面有个自动判断机制(自动判断响应状态码)
- 但是请求成功了,并不代表结果一定正确,因此需要检测机制提高测试准确性。
- JMeter中常用断言
- 响应断言
- JSON断言
- 持续时间断言(Duration Assertion)
1. 响应断言
作用
- 对HTTP请求的任意格式的响应结果进行断言(任意HTTP请求的响应结果,都可以使用响应断言)
位置
- 测试计划 --> 线程组--> HTTP请求 --> (右键添加) 断言 --> 响应断言
步骤
- 添加线程组
- 添加HTTP请求
- 添加响应断言
- 测试字段:要检查的项(实际结果)
- 模式匹配规则:比较方式
- 测试模式:预期结果
- 添加查看结果树
参数配置详细介绍
测试字段 - 要检查的项(实际结果)
- 响应文本: 来自服务器的响应文本,即主体
- 响应代码: 响应的状态码,例如:200
- 响应信息: 响应的信息,例如:OK
- Response Headers: 响应头部
- Request Headers: 请求头部
- Request Data: 请求数据
- URL样本: 请求URL
- Document(text): 响应的整个文档
- 忽略状态:忽略返回的响应状态码
模式匹配规则 - 比较方式
- 包括:文本包含指定的正则表达式
匹配:整个文本匹配指定的正则表达式
Equals:整个返回结果的文本等于指定的字符串(区分大小写)
Substring:返回结果的文本包含指定字符串(区分大小写)
否:取反
或者:如果存在多个测试模式,勾选代表逻辑或(只要有一个模式匹配,则断言就是OK),不勾选代表逻辑与(所有都必须匹配,断 言才是OK)
注意:Equals和Substring模式是普通字符串,而包括和匹配模式是正则表达式
测试模式 - 预期结果
- 即填写你指定的结果(可填写多个),按钮【添加】、【删除】是进行指定内容的管理
演练
请求
- https://www.baidu.com
需求
- 让程序检查响应数据中是否包含“百度一下,你就知道”
步骤
添加线程组
添加HTTP请求
添加响应断言
添加查看结果树
2. JSON断言
作用
- 对HTTP请求的JSON格式的响应结果进行断言(对HTTP请求的响应结果为JSON格式时,可以使用JSON断言)
位置
- 测试计划 --> 线程组--> HTTP请求 --> (右键添加) 断言 --> JSON断言
使用“JSON断言”的操作步骤?
- 添加线程组
- 添加HTTP请求
- 添加JSON断言
- 填写Assert JSON Path exists(实际结果-json路径)格式:$.xxx.yyy
- 勾选Additionally assert value填写Expected Value(期望结果)
- 添加查看结果树
参数介绍
- Assert JSON Path exists:用于断言的JSON元素的路径(实际结果)格式:$.xxx.yyy
- Additionally assert value:如果您想要用某个值生成断言(等于固定的值),请选择复选框
- Match as regular expression:使用正则表达式断言
- Expected Value:期望值(期望结果)
- Expect null:如果希望为空,请选择复选框
- Invert assertion (will fail if above conditions met):反转断言(如果满足以上条件则失败)
演练
请求
- http://www.weather.com.cn/data/sk/101010100.html
检查
- 让程序检查响应的JSON数据中,city对应的内容是否为“北京”
操作步骤
- 添加线程组
- 添加HTTP请求
- 添加JSON断言
- 添加查看结果树
3. 断言持续时间
作用
- 检查HTTP请求的响应时间是否超出要求范围(测试HTTP请求的响应时间是否满足要求时,可以使用断言持续时间)
位置
测试计划 --> 线程组--> HTTP请求 --> (右键添加) 断言 --> 断言持续时间
使用“断言持续时间”的操作步骤?
- 添加线程组添加HTTP请求
- 添加断言持续时间
- 填写持续时间(允许的最大响应时间,单位:ms)
- 添加查看结果树
参数介绍
- 持续时间(毫秒):HTTP请求允许的最大响应时间(单位:毫秒)。 超过则认为失败
练习
- 请求
- https://www.jd.com
- 检查
- 让程序检查响应时间是否大于100毫秒
- 操作步骤
- 添加线程组
- 添加HTTP请求
- 添加断言持续时间
- 添加查看结果树
- 请求
4. 小节
- 什么是断言?
- 让程序自动判断预期结果和实际结果是否一致。
- 3种断言方式有何不同?如何选择适当的方式?
- 响应断言:
- 场景:可以针对任意格式的响应数据进行断言
- JSON断言:
- 场景:当响应数据为JSON格式时,优先使用JSON断言
- 断言持续时间:
- 场景:检查HTTP请求的响应时间是否满足要求时,使用断言持续时间
- 响应断言:
- 提示
- Jmeter会自动判断响应状态码(如果状态码为4xx/5xx,判定为失败)
3. 关联(提取器)
案例脚本实现:选择商品加入购物车
关联
- 当请求之间有依赖关系,比如一个请求的入参是另一个请求返 回的数据,这时候就需要用到关联处理。
JMeter中常用的关联方法
- 正则表达式提取器
- XPath提取器
- JSON提取器
1. 正则表达式提取器
作用
- 针对任意格式的响应数据进行提取(任意格式的响应数据,都可以使用正则表达式提取器进行提取)
正则表达式介绍
- 正则表达式: 就是一个公式,或者说一套规则,使用这套规则可以从任意字符串中提取出想要的数据内容
- 在线校验工具:https://www.osgeo.cn/app/sb207
公式格式: 左边界(匹配符号)右边界: 可以提取出想要获取的数据内容 . : 是通配符,可以代表任意字符(除换行回车) * : 代表前面的字符出现0次或者多次 .* : 匹配规则: 找到左边界值后,往右查找有边界,找到最后面的右边界,中间的所有数据都被记录下来 ? : 代表非贪焚匹配,找到左边界后,往右查找匹配右边界,只要有匹配的右边界就停止再继续查找(再次查找左边界和右边界) 案例一: 公式格式: 左边界(."?)右边界 <title>百度一下,你就知道</title><title>百度一下,你就知道</title> <title>(.*?)</title> 案例二: 原始文本: 021-1234-1234 022-1234-1235 023-1234-1236 024-1234-1237 要求: 匹配出城市号、地区号、个人号码三组 正则表达式匹配: (.*?)-(.*?)-(.*?)\n 结论: 通过一个正则表达式可以提取出多组数据,每组数据设置对应的左边界和右边界即可每一组数据都可以有一个或者多个值
位置
测试计划 --> 线程组--> HTTP请求 --> (右键添加) 后置处理器 --> 正则表达式提取器
使用“正则表达式提取器”的操作步骤?
- 添加线程组
- 添加HTTP请求-A
- 添加正则表达式提取器
- 引用名称:存放提取出的值的参数名称,如填写title
- 正则表达式:左边界(.*?)右边界 多个值的话用,分割
- 模板:用**$$**引用起来,表示解析出第几个()的值
- 匹配数字:1表示第1个值,-1表示所有取值,取值是使用参数名_索引(从1开始)
- 添加HTTP请求-B
- 引用正则表达式中的引用名称。如:用**${title}**引用它
- 添加查看结果树
参数介绍
- 引用名称:存放提取出的值的参数名称,供下一个请求引用,如填写title,则可用${title}引用它
- 正则表达式: 左边界
(.*?)
右边界*()
:括起来的部分就是要提取的。- . :匹配任何字符串。
*
:0次或多次。- ? :非贪婪模式,在找到第一个匹配项后停止。
- 模板:
用$$引用起来,如果在正则表达式中有多个提取值用
,分割,则可以是$2$$3$等等,表示解析到的第几个值给title。如:$1$表示解析到的第1个
- 匹配数字:0代表随机取值,-1代表全部取值,1代表取第一个值
- 缺省值:如果参数没有取得到值,那默认给一个值让它取。
演练
请求:http://www.taobao.cn/ ,获取网页的title值
请求:http://www.baidu.com/ ,把获取到的title作为请求参数
操作步骤:
添加线程组
添加HTTP请求-传智播客
添加正则表达式提取器
添加HTTP请求-百度
添加查看结果树
调试取样器
路径:线程组 -> 添加取样器 -> Debug sampler
作用:打印调试信息
- 匹配数字:-1表示取全部
- 引用第5个地址信息,格式:${变量名_索引}, 索引重1开始
2. XPath提取器
作用
- 针对HTML格式的响应结果数据进行提取(针对HTML格式的响应数据,可以使用XPATH提取器进行提取)
xpath
位置
- 添加方式:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 后置处理器 --> XPath提取器
使用“Xpath提取器”的操作步骤?
- 添加线程组
- 添加HTTP请求-传智播客
- 添加XPATH提取器
- 添加HTTP请求-百度引用正则表达式中的引用名称。如:用${title}引用它
- 添加查看结果树
参数介绍
- Use Tidy (tolerant parser):
- 当需要处理的页面是HTML格式时,必须选中该选项
- 当需要处理的页面是XML或XHTML格式时,取消选中该选项。
- 引用名称:存放提取出的值的参数名称,如:填写title
- XPath Query:用于提取值的XPath表达式
- 匹配数字:如果XPath路径查询出许多结果,则可以选择提取哪个。 0:表示随机,-1:表示提取所有结果,1表示第一个值
- 缺省值:参数的默认值
- Use Tidy (tolerant parser):
演练
1、请求:https://www.taobao.cn/ ,获取网页的title值
2、请求:https://www.baidu.com/ ,把获取到的title作为请求参数
操作步骤:
- 添加线程组
- 添加HTTP请求-淘宝
- 添加XPath提取器
- 添加HTTP请求-百度
- 添加查看结果树
3. JSON提取器
作用
- 针对JSON格式的响应结果数据进行提取(针对JSON格式的响应数据,可以使用JSON提取器进行提取)
位置
- 添加方式:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 后置处理器 --> JSON提取器
使用“JSON提取器”的操作步骤?
- 添加线程组
- 添加HTTP请求-天气
- 添加JSON提取器
- 添加HTTP请求-百度引用正则表达式中的引用名称。如:用**${city}**引用它
- 添加查看结果树
参数介绍
- Names of created variables:存放提取出的值的参数名称,如:city
- JSON Path Expressions:JSON路径表达式,格式:$.xxx.yyy
- Match No:如果JSON路径匹配出许多结果,则可以选择提取哪个。
- 0:表示随机,-1:表示提取所有结果,1表示第一个值
- Default Values:参数的默认值
演练
1、请求获取天气的接口,http://www.weather.com.cn/data/sk/101010100.html,获取返回结果中的 城市名称“北京”
2、请求:https://www.baidu.com/s?wd=北京 ,把获取到的城市名称作为请求参数
操作步骤:
添加线程组
添加HTTP请求-天气
添加JSON提取器
添加HTTP请求-百度
添加查看结果树
4. JMeter属性(跨线程组关联)
为什么要使用JMeter属性?
- 当有关联关系的两个请求在同一个线程组中时,可以使用三种提取器的变量来实现数据传递。当有关联关系的两个请求在不同线程组中时,如何进行数据传递呢 ?
什么时候需要使用JMeter属性?
- 需要实现跨线程组的数据传递时,可以使用JMeter属性
使用“JMeter属性”的操作步骤?
- 添加线程组1
- 添加HTTP请求-天气
- 添加JSON提取器
- 添加BeanShell取样器(将JSON提取器提取的值保存为JMeter属性)
- 保存JMeter属性:
${__setProperty(pro_city,${city},)}
- 保存JMeter属性:
- 添加线程组2
- 添加HTTP请求-百度(读取JMeter属性)读取JMeter属性:
${__property(pro_city,,)}
- 添加查看结果树
- 添加HTTP请求-百度(读取JMeter属性)读取JMeter属性:
- 添加线程组1
1. JMeter属性的配置函数
__setProperty函数:
- 作用:将值保存成JMeter属性
- 入口:工具栏 - 函数助手
- 提示:属性值来源于提取器
__property函数:
- 作用:在其他线程组中使用property函数读取属性
- 入口:工具栏 - 函数助手
- 提示:属性名称来源于上一步setproperty函数的属性名称
2. JMeter属性的函数执行
__setProperty函数执行(保存JMeter属性):
需要通过BeanShell取样器来执行
BeanShell取样器入口:线程组 - 取样器 -> BeanShell取样器
__property函数(读取属性)
- 在其他线程组中使用property函数
3. 演练
线程组1
- 请求获取天气的接口,http://www.weather.com.cn/data/sk/101010100.html,获取返回结果中的城市名称“北京”
线程组2
- 请求:https://www.baidu.com/s?wd=北京 ,把获取到的城市名称作为请求参数
操作步骤:
添加线程组1
添加HTTP请求-天气
添加JSON提取器
添加BeanShell取样器(将JSON提取器提取的值保存为JMeter属性)
添加线程组2
添加HTTP请求-百度(读取JMeter属性)
添加查看结果树
添加“属性显示” (非测试元件 -> 属性显示)
4. 小节
什么是关联?
- 当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。
几种关联方式有何不同?如何选择适当的方式?
同一个线程组内,多个请求之间的关联
- 如果响应数据为JSON格式,优先使用JSON提取器进行关联
- 如果响应数据为HTML格式,优先使用XPath提取器进行关联
- 如果JSON提取器和XPath提取器都无法实现关联,使用正则表达式提取器进行补充(针对任意格式的响应数据)
不同线程组之间,多个请求之间的关联
JSON提取器 + JMeter属性
XPath提取器 + JMeter属性
正则表达式提取器 + JMeter属性
5. 录制脚本
- 为什么要录制脚本?
- 有API文档时,可以根据API文档的定义来编写HTTP接口测试脚本。那如果没有API文档时,该如何来编写HTTP接口测试脚本呢?
- JMeter录制脚本
- 在没有接口文档的旧项目当中,快速录制web页面产生的http接口请求,帮助编 写接口测试脚本。
1. JMeter录制脚本原理
正常请求过程
JMeter录制过程
- 录制时,JMeter作为代理服务器来拦截和转发请求与响应数据
2. JMeter录制脚本的操作步骤
添加HTTP代理服务器,并进行配置
添加HTTP代理服务器:测试计划(右键)-> 非测试元件->HTTP代理服务器
添加线程组:用于目标控制器
配置代理服务器的参数
开启windows操作系统的浏览器代理
win10代理设置
win7代理的设置
启动代理服务器,开始录制,(证书在bin目录下)
- 点击启动,会在Jmeter的bin目录下生成一个安全证书文件:ApacheJmeterTemporaryRootCA.crt (此证书有效期为7天)
- 导入Jmeter安全证书,选项 —> ssl管理器,导入jmeter—> bin目录下的安全证书文件ApacheJmeterTemporaryRootCA.crt,
- 至此,录制HTTPS的代理服务器就启动并设置成功了
Chrome配置
找到设备管理证书,导入Jmeter的bin目录下生成一个安全证书文件
在浏览器页面中进行操作,成功后,就能在JMeter当中看到抓取到的接口请求了。
- 录制完成关闭代理,否则浏览器无法正常访问;
提示:chrome抓取不到可以使用IE抓
3. 小节
什么时候需要使用JMeter录制脚本?
- 在没有接口文档的旧项目当中,通过录制http接口请求的方式,来快速编写接口测试脚本。
JMeter录制脚本的操作步骤?
- 添加HTTP代理服务器,并进行配置
- 设置端口:代理服务器的端口号
- 目标控制器:录制的脚本放到哪个容器(线程组)中
- Requests Filtering(过滤条件 – url匹配正则表达式):
- 包含模式:包含此项。如:.localhost.
- 排除模式:不包含此项 如:..jpg..png .*.js
开启windows操作系统的浏览器代理
- 配置浏览器代理:JMeter代理服务器的IP、端口号
启动代理服务器,开始录制
在浏览器页面中进行操作,成功后,就能在JMeter当中看到抓取到的接口请求了
6. 直连数据库
1. 直连数据库的使用场景
- 用作请求的参数化
- 例如:登录时需要的用户名,可以从数据库中查询获取
- 用作结果的断言
- 例如:添加购物车下订单,检查接口返回的订单号,是否与数据库中生成的订单号一致
- 准备测试数据
- 例如:通过数据库来准备大量(几十万条)的性能测试数据。
- 清理垃圾数据
- 例如:添加商品(商品名/编号等不能重复),再执行该脚本不能成功, 需要在下次执行前删除该商品数据
2. 直连数据库的关键配置
添加MySQL驱动jar包
下载地址:https://mvnrepository.com/
方式一:在测试计划面板点击“浏览…“按钮,将你的JDBC驱动添加进
方式二:将MySQL驱动jar包放入到lib/ext目录下,重启JMeter
配置数据库连接信息
添加方式:测试计划 --> 线程组--> (右键添加) 配置元件 --> JDBC Connection Configuration
数据库连接信息参数介绍
- Variable Name for created pool
- mysql数据库连接池名称(JDBC请求时要引用)
- Database URL
- jdbc:mysql://127.0.0.1:3306/tpshop2.0?characterEncoding=utf8&useSSL=false
- 组成:协议 + 数据库IP + 数据库端口 + 连接的数据库名称
- JDBC DRIVER class
- com.mysql.jdbc.Driver(MySQL驱动包位置, 固定格式 — 下拉框选择)
- Username
- root(连接数据库用户名,如实填写)
- Password
- MySQL数据库密码,如实填写,如果密码为空不写
- Variable Name for created pool
添加JDBC请求
添加方式:测试计划 --> 线程组--> 取样器 --> JDBC Request
JDBC请求参数介绍:
Variable Name of Pool declared in JDBC Connect Configuration:
- 数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字保持一致
SQL Query:下拉选
- 查询操作:选择“Select Statement”
- 增加、删除、修改操作:选择“Update Statement”
Query:填写的SQL语句,未尾不要加“;”
Variable names
- 保存SQL语句返回结果的变量名,多个值用
,
分割
- 保存SQL语句返回结果的变量名,多个值用
3. 案例
- 案例一
- 需求
- 连接tpshop商城数据库获取商品名包含:
小米
的商品id
- 连接tpshop商城数据库获取商品名包含:
- 需求
- 准备工作
- 启动tpshop数据库服务器
- 添加MySQL驱动jar包
- 操作步骤
- 添加线程组
- 添加 JDBC Connection Configuration(注意写法)
- 添加 JDBC request
- 添加查看结果树
案例二
需求
- 连接tpshop商城数据库获取商品名包含:
小米
的商品id(假设上一个案例的查询结果ID为65) - 在tpshop首页中搜索商品名”小米”,请求URL:http://127.0.0.1/Home/Goods/search.html 请求方法:GET, 请求参数:q=小米
- 在搜索的响应数据中检查是否有该商品对应的商品链接:/Home/Goods/goodsInfo/id/65.html
- 连接tpshop商城数据库获取商品名包含:
操作步骤:
添加线程组
添加 JDBC Connection Configuration
添加 JDBC request添加 HTTP请求 - 搜索商品(URL中含有中文需要勾选编码)
在搜索HTTP请求下,添加响应断言,检查响应结果中的字符是否包含商品URL(URL中含ID)
添加查看结果树
7. 逻辑控制器
逻辑控制器: 可以按照设定的逻辑控制取样器的执行顺序
JMeter中常用的逻辑控制器:
- 如果(If)控制器
- 循环控制器
- ForEach控制器
1. IF 控制器
作用
- If控制器用来控制它下面的测试元素是否运行(用来控制它下面的测试元素是否运行)
位置
- 测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> 如果(If)控制器
使用“IF控制器”的操作步骤?
添加线程组
用户定义的变量
添加If控制器,判断name是否等于baidu
JS语法形式
- 不勾选Interpret Condition,
'${name}' == 'baidu‘
- 不勾选Interpret Condition,
函数形式
勾选,
${ jexl3('${name}' == 'baidu',)}
添加HTTP请求,用来访问百度添加If控制器,判断name是否等于baidu
添加HTTP请求,用来访问传智播客
添加查看结果树
演练
- 1、使用‘用户定义的变量’定义一个变量name,name的值可以是‘baidu’或‘qq’
- 2、根据name的变量值实现对应网站的访问
- 操作步骤:
- 添加线程组
- 用户定义的变量
- 添加If控制器,判断name是否等于baidu
- 添加HTTP请求,用来访问百度
- 添加If控制器,判断name是否等于qq
- 添加HTTP请求,用来访问qq
- 添加查看结果树
2. 循环控制器
作用
- 通过设置循环次数,来实现循环发送请求
位置
- 测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> 循环控制器
使用“循环控制器”的操作步骤?
- 添加线程组
- 添加循环控制器 —— 设置循环次数
- 循环控制器下,添加HTTP请求
- 添加查看结果树
演练
1、循环访问百度10次
操作步骤
添加线程组
添加循环控制器
添加HTTP请求
添加查看结果树
思考:线程组属性可以控制循环次数,那么循环控制器有什么用?
- 控制的作用域不同: 线程组控制是线程组下的所有请求,循环控制器控制逻辑控制器下的所有请求
- 如果线程组循环次数为M,循环控制器循环次数为N:
- 循环控制器下的HTTP请求运行: M*N次
- 线程组下的其他HTTP请求运行: M次
3. ForEach控制的器
作用
- 一般和用户自定义变量或者正则表达式提取器一起使用,读取返回结果中一系列相关的变量值。该控制器下的取样器都会被执行一次或多次,每次读取不同的变量值。
位置
- 测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> ForEach控制器
使用“ForEach控制器”的操作步骤?
添加线程组
添加用户定义的变量/正则表达式提取器
返回一组变量:
- 格式:相同的变量名_连续的数字后缀,如:name_1...name_3
添加ForEach控制器
- 参数介绍:
- 输入变量前缀:要读取的输入变量的固定前缀,如:name
- 开始循环字段:要读取的输入变量后缀数字的最小值-1,如:0
- 结束循环字段:要读取的输入变量后缀数字的最大值,如:3
- 输出变量名称:读取输入变量的值后保存的新变量名,用于后续HTTP请求来引用,如word
- 添加HTTP请求-百度
- 引用ForEach控制器中保存的新变量名,如:$
- 添加查看结果树
- 参数介绍:
演练一
- 1、有一组关键字 [hello,python,测试],使用用户定义的变量存储
- 2、要依次取出关键字,并在百度搜索,例如:https://www.baidu.com/s?wd=hello
- 操作步骤:
- 添加线程组
- 添加用户定义的变量
- 添加ForEach控制器
- 添加HTTP请求-百度
- 添加查看结果树
演练二
1、访问 http://www.itcast.cn,获取首页中的地址信息,并全部保存下来
2、要依次取出地址关键字,并在百度搜索,例如:https://www.baidu.com/s?wd=地址
操作步骤:
添加线程组添加HTTP请求1
在HTTP请求1下面,添加正则表达式提取器,提取出所有的地址信息
添加ForEach控制器
添加HTTP请求2-百度
添加调试取样器
添加查看结果树