1、关联定义
将某一个请求返回结果的动态返回值,保存成一个变量,供后面需要用到该值的请求的使用
2、关联原因
服务器或者数据库校验该值的合法性
3、哪些值要关联&分析关联的字段
先分析这个接口请求,是哪个类型的操作。
1、与数据库交互的接口(读或者写)
3.1 与数据库交互(读或写)
insert ---关联--建立关系的那几个字段--这条数据属于谁 谁操作的 啥时候干的(业务校验)
插入数据,一定会返回这条数据的ID
update
update table set x =? where xxid=?? and and
关联 where 后面的条件ID
delete
delete table set x =? where xxid=?? and and
select 。 。。。。
key . xxid . 或者 。 int==数字
关系型数据库,表与表之间,存在网状关系的
非关系型数据库,
INSERT INTO 表名称 VALUES (值1, 值2,....)
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
3.2 非数据库
从哪儿找----上一步交互请求
典型使用场景:时间戳、验证码(图片、手机、邮箱) session token
特征: 奇奇怪怪
举例:淘宝购物流程
1.注册 ------参数化 手机号/邮箱 关联 验证码、token
2.登陆 ------参数化 手机号 关联
4、jmeter关联方式
前提:访问 WeatherWS Web 服务
我们可以获取天气预报的web服务的接口,且没有加密。这些接口都是可以用的,以下场景举例。
给这个请求添加后置处理器。
4.1边界提取器
注:边界提取器与http请求,可以同目录,也可以在子目录。我们优先在子目录吧。
如下图,这都是可以的
在你要关联的请求下右键点击添加-后置处理器-边界提取器
Apply to:
Main sample and sub-samples: 主请求 和子 请求
Main sample only:主请求
Sub-samples only:子请求
Jmeter Variable Name to use:自定义
默认勾选的是Main sample only:主请求,边界提取器,作用范围在主请求的返回值上。
Jmeter Variable Name to use:自定义,可以忽略,不用关心。
当你不知道要提取的返回值在主请求还是子请求的返回值上是,可以选择Main sample and sub-samples: 主请求 和子 请求
要检查的响应字段:
我这里描述一个使用场景
以下是 HTTP GET 请求和响应示例。所显示的占位符需替换为实际值。
GET /WebServices/WeatherWS.asmx/getRegionProvince? HTTP/1.1 Host: ws.webxml.com.cn
HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <ArrayOfString xmlns="http://WebXml.com.cn/"> <string>string</string> <string>string</string> </ArrayOfString>
返回结果:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">
<string>黑龙江,3113</string>
<string>吉林,3114</string>
<string>辽宁,3115</string>
<string>内蒙古,3116</string>
<string>河北,3117</string>
<string>河南,3118</string>
<string>山东,3119</string>
<string>山西,31110</string>
<string>江苏,31111</string>
<string>安徽,31112</string>
<string>陕西,31113</string>
<string>宁夏,31114</string>
<string>甘肃,31115</string>
<string>青海,31116</string>
<string>湖北,31117</string>
<string>湖南,31118</string>
<string>浙江,31119</string>
<string>江西,31120</string>
<string>福建,31121</string>
<string>贵州,31122</string>
<string>四川,31123</string>
<string>广东,31124</string>
<string>广西,31125</string>
<string>云南,31126</string>
<string>海南,31127</string>
<string>新疆,31128</string>
<string>西藏,31129</string>
<string>台湾,31130</string>
<string>北京,311101</string>
<string>上海,311102</string>
<string>天津,311103</string>
<string>重庆,311104</string>
<string>香港,311201</string>
<string>澳门,311202</string>
<string>钓鱼岛,311203</string>
</ArrayOfString>
编辑边界提取器
case1,我们想提取重庆的城市id
配置如下图:
Apply to: Main sample only
要检查的响应字段 主体
引用名称: cityid
左边界: <string>重庆,
右边界: </string>
匹配数字(0代表随机)
缺省值
这里讲一下匹配数字和缺省值
匹配数字:当有多个结果时,0-随机取一个结果,1-取结果的列表的第一个,2-取结果列表的第2个,以此类推
缺省值:当娶不到结果时,给你变量返回一个默认值
为了验证我们的提取变量,正确,我们需要加一个【调试取样器】来调试一下我们的脚本
我们最终的脚本结构如下:
jmeter 调试取样器(Debug Sampler)
Debug Sampler
Debug Sampler主要用来看我们设置的变量,是否能正常取到我们设定的值
JMeter properties和System properties这两个属性我们不用管,默认false即可,他是jmeter的一些自带属性,一般是不会变的,重点要看的是中间那个
JMeter variables:jmeter中的变量,如果此项为ture,则此元件会打印出其范围内所有的jmeter变量的值,所以我们可以通过他把当前位置变量的值打印出来,从而进行程序的调试。
添加完Debug Sampler,我们还要添加查看结果树,来查看具体的变量数据。
这里就看到了我们刚刚添加的变量
4.2正则表达式处理器
在你要关联的请求下右键点击添加-后置处理器-正则表达式提取器
调试脚本结构如下:
元字符
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
限定符
* | 重复零次或更多次(优先取更多) |
+ | 重复一次或者更多次(优先取更多) |
? | 重复零次或者一次 |
{n} | 重复n次 |
{n,} | 重复n次或者更多次 |
{n,m} | 重复n到m次 |
*? | 重复任意次,(优先取最少) |
+? | 重复1次或更多次(优先取最少) |
?? | 重复0次或1次 |
{n,m}? | 重复n到m次(优先取最少) |
{n,}? | 重复n次以上(优先取最少) |
举例:
例如,字符串"aaaaaaaa",匹配字符串中所有的a ,
1、正则: "a*" 会出到所有的字符"a"
2、正则: "a+" 会取到字符中所有的a字 符,
"a+"与"a*"不同在于"+"至少是一次而"*" 可以是0次。
正则 : "a?" 只会匹配一次,也就是结果只是单个字符a
"{n}" 重复n次
例如从"aaaaaaaa" 匹配字符串的a 并重复3次 正则: "a{3}" 结果就是取到3个a字
符 "aaa";
"{n,m}" 重复n到m次
例如正则 "a{3,4}" 将a重复匹配3次或者4次 所以供匹配的字符可以是三个"aaa"也可以
是四个"aaaa" 正则都可以匹配到
"{n,}" 重复n次或更多次
与{n,m}不同之处就在于匹配的次数将没有上限,但至少要重复n次 如 正则"a{3,}" a至 少要重复3次
"*?" 重复任意次,但尽可能少重复
如 "acbacb" 正则 "a.*?b" 只会取到第一个"acb" 原本可以全部取到
但加了限定符后,只会匹配尽可能少的字符 ,而"acbacb"最少字符的结果就是
"acb"
"+?" 重复1次或更多次,但尽可能少重复
与上面一样,只是至少要重复1次
"??" 重复0次或1次,但尽可能少重复
如 "aaacb" 正则 "a.??b" 只会取到最后的三个字符"acb"
"{n,m}?" 重复n到m次,但尽可能少重复
如 "aaaaaaaa" 正则 "a{0,m}" 因为最少是0次所以取到结果为空
"{n,}?" 重复n次以上,但尽可能少重复
如 "aaaaaaa" 正则 "a{1,}" 最少是1次所以取到结果为 "a"
一些正则,可以使用工具生成,如一些在线的工具等:
一、校验数字的表达式
数字:^[0-9]*$
n位的数字:^\d{n}$
至少n位的数字:^\d{n,}$
m-n位的数字:^\d{m,n}$
零和非零开头的数字:^(0|[1-9][0-9]*)$
非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$
带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$
正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
有两位小数的正实数:^[0-9]+(\.[0-9]{2})?$
有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$
非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
非负整数:^\d+$ 或 ^[1-9]\d*|0$
非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$