JMeter参数关联,就是请求或者线程之间通过传递参数建立联系。一般,我们将一个请求的响应参数,作为另一个请求的入参。比如登录后的操作,第一步用来实现登录操作,然后将请求返回的token提取出来保存到某一个变量当中,后续请求作为入参使用。
一、通过正则表达式提取器实现参数关联
jmeter通过正则表达式提取器来实现这一场景。
1.1 正则表达式提取器添加方式
1.2 实现案例
场景:有如下两个接口,通过正则表达式提取器,将第一个接口的城市代码,作为第二个请求的参数传入。
获取城市代码接口:
http://toy1.weather.com.cn/search?cityname=nanjing
根据城市代码获取天气接口:
http://www.weather.com.cn/data/cityinfo/101190101.html
操作步骤
1)建立http请求,获取南京的城市代码,添加察看结果树。
2)运行后,在响应数据中复制目标参数及前后的字符,尽量保证复制的字符串具有唯一性。
3)添加正则表达式提取器,填写提取器相关参数。
4)添加获取城市天气请求,添加察看结果树,使用${citycode}替换101190101。
使用${xx}引用上述正则提取的参数。
5)响应结果如下
提取器参数解释
- 引用名称:提取的参数名称,自定义,后续请求引用时使用。
- 正则表达式:获取响应结果的正则公式,常用(.+?)和(.*?),两者结果一致。
- 具体字符含义如下:
- 模板:-1全部,0 随机,对应上述正则表达式,若只有一个正则一般就填写1。
- 匹配数字:匹配结果作为一个数组,匹配数字即可看做是数组的第几个元素。-1表示全部,0随机,其他整数表示对应第几个值。
- 缺省值:匹配失败时取的默认值。
小技巧
可以在线程组中添加调试取样器,通过取样器获取的请求返回值可以查看所有正则参数的取值。
常见的正则表达式操作符
二、通过JSON提取器实现参数关联
2.1 JSON提取器介绍
相信做过自动化测试的朋友经常会遇到这样的场景:我想调用系统中的某个业务接口,但是需要先登录系统。也就是现在很多接口的访问,都是需要登录接口的token做为基础。
在JMeter中先访问登录接口,使用后置处理器提取出来token或者Cookie的值,然后将该值带到后续的业务接口中,这时就会用到JSON提取器组件。
2.2 为什么要用 JSON 提取器
- JSON是目前大多数接口响应内容的数据格式。
- 在接口测试中,不同接口之间可能会有数据依赖,在JMeter中可以通过后置处理器来提取接口的响应内容。
- JSON 提取器是其中一个可以用来提取响应内容的元件。
2.3 JSON提取器界面详解
添加JSON提取器组件操作:选中“取样器”右键 —> 添加 —> 后置处理器 —> JSON提取器。
界面如下图所示:
下面是JSON提取器组件的详细说明:
- 名称:JSON提取器组件的自定义名称,见名知意最好。
- 注释:即添加一些备注信息,对该JSON提取器组件的简短说明,以便后期回顾时查看。
(1)Apply to:作用范围(返回内容的取值范围)
- Main sample and sub-samples:作用于父节点的取样器及对应子节点的取样器。
- Main sample only:仅作用于父节点的取样器。(选默认的 main sample only 就行了)
- Sub-samples only:仅作用于子节点的取样器。
- JMeter Variable Name to use:作用于JMeter变量(输入框内可输入JMeter的变量名称),从指定变量中提取需要的值。
(2)第二部分内容
- Names of created variables:定义引用提取值的变量名,后面接口中使用${变量名}引用,必填项。
- JSON Path expression:填写JSON Path表达式,用来提取某个值。必填项。
- Match No.(0 for Random):表示取值是第几个匹配结果,因为有可能XPath表达式会匹配到多个值。0表示随机,-1表示全部,1代表第一个,2代表第二个,以此类推。(非必填项)
- Compute concatenation var(suffix_ALL):勾选此项后,如果匹配到多个结果,JMeter会使用,将他们连接起来,存储在的变量中,会自动命名为_ALL。
- Default Values:缺省值,如果JSON Path表达式匹配不到值的时候,将使用该默认值。(非必填项)
2.4 JSON提取器的使用
需求:用户登录系统,并在系统中查询个人信息。
实现思路:
- 登陆系统,记录Cookie信息。
- 提取出用户的ID信息。
- 保持登陆的状态,根据用户ID,查询用户信息。
(1)测试计划内包含的元件
添加元件操作步骤:
- 创建测试计划。
- 创建线程组:选中“测试计划”右键 —> 添加 —> 线程(用户) —> 线程组。
- 在线程组里面,添加配置原件“HTTP Cookie管理器”组件:选中“线程组”右键 —> 添加 —> 配置元件 —> HTTP
Cookie管理器。 - 在线程组下,添加取样器“HTTP请求”组件:选中“线程组”右键 —> 添加 —> 取样器 —> HTTP请求。
- 在取样器下,添加后置处理器“JSON提取器”组件:选中“取样器”右键 —> 添加 —> 后置处理器 —> JSON提取器。
- 在线程组下,添加监听器“察看结果树”组件:选中“线程组”右键 —> 添加 —> 监听器 —> 察看结果树。
提示:需要重复添加的组件这里不重复描述。
最终测试计划中的元件如下:
点击运行按钮,会提示你先保存该脚本,脚本保存完成后会直接自动运行该脚本。
(2)HTTP Cookie管理器内容
什么都不用填写,保持原样即可。
简单说明一下:
- JMeter中自动收集的Cookie,是不会在HTTP Cookie管理器中进行展示的,但是运行后通过查看结果树可以查看到Cookie信息,接受到的Cookie会被自动存储在线程变量中。(使用Debug Sampler组件查看)
- HTTP Cookie管理器会自动记录每一个请求所产生的Cookie,在后边对同源站点进行的请求中,都可以自动的使用对应Cookie进行发送。
(3)用户登陆请求界面内容
发送一个标准POST请求,参数格式为JSON,这里就不做解释了。
界面内容如下图所示:
(4)JSON提取器界面内容
我们在编辑JSON提取器组件之前,一般先请求一下需要提取返回数据的接口。
因为我们需要先查看一下需要提取的数据在什么位置,同时我们也能够提前编写一下JSON Path表达式。
如下图所示:
然后选择JSON Path Tester视图模式,先手动编写JSON Path表达式,看看是否能够取到需要的数据。
如下图所示:
之后我们就可以编写JSON提取器组件界面了,如下:
编写引用名称、JSON表达式、匹配数据选择,如下图:
提示:如果要获取多个元素,则可以在HTTP请求组件中,加入多个后置处理器来提取需要的值。即:每一个后置处理器只能获取一个值。
JSON提取器组件提取出来的数据,会存储在线程变量中,供其他后续接口使用。
(5)查看用户信息请求页面内容
填写接口的基本请求信息,然后把JSON提取器提取出来的数据,作为参数化变量应用到请求中。
如下图所示:
(6)查看结果
我们可以看到在第二个请求中,拿到了第一个请求提取出来的用户ID数据。
如下图所示:
再来看看第二个请求响应的结果,可以看到对应用户的信息我们已经查询到了。
提示:可以添加Debug PostProcessor(调试后置处理器),或者Debug Sampler(调试取样器),来查看JSON提取器中,提取出的内容是否正确。
注意:正常跑用例时删除或禁用它们。
2.5 JSON Path表达式说明
JSON提取器用于提取请求返回结果中的某个值或者某一组值,用法比正则表达式要简单,标准写法为$.key,其中key为返回结果map中的一个键,如果是多层则继续用.key进行即可,如果遇到key的value值为一个List,则使用.key[n],其中n为list中元素的编号。
常用JSON Path表达式使用实例,如下:
1、获取第一层中的某个属性的值:$.key。
2、获取List中某个key的value值:$.result[0].name。
3、获取列表中的某个列表的属性值:$.result[1].approver[0]。
4、获取一个列表下全部的某一个元素:$.result[*].name。
5、获取N个值:
- 取前两条数据:$.result.records[2].id。
- 取后两条数据:$.result.records[-2].id。
6、提取特定条件的某个值:$.result.records[?(@.object_id==0)].id。
7、获取固定条件下的多个key的value值:$.result.records[?(@.object_id==0)].[“id”,“name”,“is_active”]。
三、通过Xpath提取器实现参数关联
1.1 XPath Extractor介绍
XPath Extractor的使用方法与正则表达式提取器(Regular Expression Extractor)类似,只不过该Expression中指定的不是正则表达式,而是给定的XPath路径。
后置处理器(Post Processor)本质上是一种对sampler发出请求后接受到的响应数据进行处理(后处理)的方法。必须将后置处理器元件放在合适的位置才能达到预期的效果。
1.2 XPath提取器界面详解
新建一个线程组,然后右键-添加-后置处理器-XPath Extractor:
(1)Apply to:作用范围(返回内容的取值范围)
- Main sample and sub-samples:作用于父节点的取样器及对应子节点的取样器
- Main sample only:仅作用于父节点的取样器
- Sub-samples only:仅作用于子节点的取样器
- JMeter Variable Name to use:作用于jmeter变量(输入框内可输入jmeter的变量名称)
(2)XML Parsing Options:要解析的XML参数
- Use Tidy(tolerant parser):当需要处理的页面是HTML格式时,必须选中该选项;如果是XML或XHTML格式(例如RSS返回),则取消选中;
- Quiet表示只显示需要的HTML页面
- Report errors表示显示响应报错
- Show warnings表示显示警告;
- Use Namespaces:如果启用该选项,后续的XML解析器将使用命名空间来分辨;
- Validate XML:根据页面元素模式进行检查解析;
- Ignore Whitespace:忽略空白内容;
- Fetch external DTDs:如果选中该项,外部将使用DTD规则来获取页面内容;
(3)Return entire XPath fragment of text content:返回文本内容的整个XPath片段
(4)Reference Name:存放提取出的值的参数。
(5)XPath Query:用于提取值的XPath表达式。
(6)Default Value:参数的默认值。
1.3 正则表达式提取器和XPath Extractor的区别
①正则表达式提取器可以用于对页面任何文本的提取,提取的内容是根据正则表达式在页面内容中进行文本匹配;
②XPath Extractor则可以提取返回页面任意元素的任意属性;
③如果需要提取的文本是页面上某元素的属性值,建议使用XPath Extractor;
④如果需要提取的文本在页面上的位置不固定,或者不是元素的属性,建议使用正则表达式提取器。
1.4 示例实战
1)场景:
访问网易官网,获取title值。
将title值放入百度搜索框,进行搜索。
2)添加元件操作
最终测试计划添加完元件后界面如下:
3)具体元件配置
非常简单的http请求配置,界面内容如下图所示:
- 网易首页请求设置
- Xpath提取器配置
我们在编辑Xpath提取器组件前,一般先运行上一个请求需要提取返回数据的接口。
因为我们需要先查看一下需要提取的数据在什么位置,如下图所示:
然后选择Xpath Tester视图模式,先手动编写Xpath表达式,看看是否能够取到需要的数据。如下图所示:
- 百度搜索页面设置如下
4)运行结果
我们可以看到第二个请求中,拿到了第一个请求提取出来的数据“网易”。如下图所示:
再来看看第二个请求响应的结果,可以看到有“网易_百度搜索”的title属性,说明在百度已经进行了网易搜索。如下图所示: