1 背景介绍
正常业务场景时,通常存在发送的请求消息需要带上前面服务器回复的动态数据,如验证码、会话ID之类,否则业务将失败。因此需要工具支持从响应消息获取参数值,即关联参数。例如:
上图是一个HTTP请求消息,里面存在多个“{}”符号,即存在多个需要替换为实际值的参数: username、password、validateCode,工具在发送数据前会自动将这些参数替换为对应的参数值。
上面参数对应的实际参数值来源方式不同,包括:参数列表配置、从服务器收到的响应消息提取(即关联参数,如validateCode)、工具自动处理(如Content-Length);
该文重点是介绍参数关联,因此不对参数列表进行介绍,参数列表可以参照《kylinPET 参数配置》文档
工具自动处理的参数每种协议都不同,如HTTP支持:Host、Cookie、Content-Length等等;SIP支持:Content-Length、Call-ID等等。详细参照各个协议对应的文档。
2 在响应界面手动添加参数关联
选择对应的URL资源,再选择下边的“响应消息”选项卡:
如SIP协议,双击Receive按钮弹出响应界面:
1) 表格每一条记录表示从响应消息里获取一个参数值;
2) 可通过按钮添加、修改、删除参数关联设置;
3) 表格列对应关联参数里的配置项。
参数名列:展示参数名+获取参数方式
匹配文本列:展示匹配文本项或左边文本项
查找文本列:展示高级规则里的查找文本项
开始偏移量列:展示“偏移量”或者“开始于文本”或者“结束于文本”,
其中“开始于文本”以“(+)”前缀,“结束于文本”以“(-)”前缀
结束偏移量列:展示“偏移量”或者“开始于文本”或者“结束于文本”, 其中“开始于文本”以“(-)”前缀,“结束于文本”以“(+)”前缀
说明:
1.
开始偏移量的“(+)”表示包括查找的文本,“(-)”表示不包括查找的文本;
2.
结束偏移量的“(-)”表示不包括查找的文本,“(+)”表示包括查找的文本;
默认包括:左右方式、自定义、by XML Find、By XML xpath、by JSon,另外,一些特殊协议如SIP还包括一些自动处理的参数。
1)
SIP关联参数
包括SIP常见的关键字:Call-ID、CSeq等等,详细参照《kylinPET SIP(IMS)业务使用指导》文档
2)
WebService关联参数
包括对应接口的返回值,以soap@开头,详细参照《kylinPET WebService业务使用指导》文档
3)
HTTP(WEB)及其他协议
通过查找左边文本和右边文本,然后提取中间部分内容
响应消息内容:abcd <ip>1.1.1.1</ip> <b>456</b>,获取参数{ip}的值1.1.1.1
0xaabb表示查找两字节,第一字节为aa ,第二字节为bb。当内容为aabb01020304ccdd时,提取到的name参数的值为01020304
说明:
1、
16进制方式:一个字节需要用2个字母表示,如aa;必须以0x开头,否则认为检查文本
2、
文本方式:直接输入文本字符串,不以0x开头
HTTP与RTSP、SIP协议消息格式分为头域与消息体两部分,其中头域部分为两回车前部分,消息体为两回车后部分(如HTTP里的HTML为两回车后,为消息体);其他协议只有响应消息一个选项。
说明:
分为头域与消息体两部分,缩小查找范围,提高查找效率
a) 左右方式:通过查找左边与右边文本方式获取参数值,例如:<a>123</a>,左边文本设置为<a>,右边文本设置为</a>,则获取的参数值为123
b) 自定义:提供复杂方式来获取参数值;包括查找文本使用正则表达式、查找多次、在查找到的参数值再进行查找。
c) 自动参数:协议典型参数,由工具自动获取;如HTTP的Cookie、RTSP的Session、SIP的Cseq、Call-ID
当选择左右方式或自定义时,必须设置参数名,表示提取的内容对应的key名
自定义时必须设置,在响应消息里查找的字符串,支持java正则表达式。如设置<a>.*</a>则可以得到内容值为<a>123</a>或<a>abcd</a>
设置查找的次数。如设置2,则表示需要查找两次,第1次找到的内容不是期望的参数值,第2次找到的内容才是期望的参数值
左右方式时必须设置,在响应消息里查找的字符串,该文本的结束位置为参数值的起始位置
左右方式时必须设置,在响应消息里查找的字符串,该文本的开始位置为参数值的结束位置
a) 匹配规则的文本:不需要再进行查找,当前查找到的内容即为参数值;
b) 高级规则:在当前查找的基础上再进行一次查找,新查找的内容为参数值;
a) 在匹配文本里面:在当前查找到的内容里再进行查找,一般应用于正则表达式里再查找,如<a>.*</a>找到了<a>123</a>,但参数值为123,因此需要在里面进行第2次查找;
b) 在匹配文本后面:在当前查找到的内容后面再进行查找;
c) 在匹配文本前面:在当前查找到的内容前面再进行查找;
再查找字符串,不支持正则表达式;一般不需要配置
a) 偏移量:整数值。如<a>.*</a>找到了<a>123</a>,但参数值为123,因此可以设置偏移量为3,即为匹配文本的开始相对偏移量。
b) 开始于文本:字符串。如<a>.*</a>找到了<a>abc123</a>,但参数值为abc123,知道会以abc为前缀,因此可以设置开始于文本为abc,即包括文本abc;
c) 结束于文本:字符串。如<a>.*</a>找到了<a>123</a>,但参数值为123,因此可以设置结束于文本为<a>,即不包括文本<a>(结束于它);
a) 偏移量:整数值。如<a>.*</a>找到了<a>123</a>,但参数值为123,因此可以设置偏移量为4,即为匹配文本的结束相对偏移量,</a>共4个字符。
b) 开始于文本:字符串。如<a>.*</a>找到了<a>123</a>,但参数值为123,因此可以设置开始于文本为</a>,即不包括文本</a>;
c) 结束于文本:字符串。如<a>.*</a>找到了<a>123abc</a>,但参数值为123abc,知道会以abc为后缀,因此可以设置结束于文本为abc,即包括文本abc;
响应消息内容:abcd <ip>1.1.1.1</ip> <b>456</b>,获取参数{ip}的值1.1.1.1
IP正则表达式文本:(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)) {3}
先得到<ip>1.1.1.1</ip>,再使用高级规则从结果里得到IP地址
或者
在响应内容里查找节点名字符串
保存获取到的值为名称getPara
1) Yes表示获取匹配的所有值 (即数组),保存参数值的key分别为validateCode, getPara_2, getPara_3, ..., getPara_n;
2) No: 只获取第一个匹配的值,并保存参数值的key为getPara
多级节点通过符号“/”分隔,如/parent/child表示获取child节点的内容值,而且它的父必须为parent。下面举例:
1)
例子1
响应消息内容为<root><parent><child>abc</child></parent></root>,需要提取child节点的内容值,则匹配文本可以配置如下:
/root/parent/child
/parent/child
/child
上面都可以得到参数内容abc,并将abc保存到参数名getPara
2)
提取多个同名节点值
响应消息内容为<root><parent><child>abc</child><child>efg</child><</parent></root>,需要提取child节点的内容值,则匹配文本可以配置如下:
/root/parent/child
/parent/child
/child
如果“获取全部”选择NO,则上面都可以得到参数内容abc,并将abc保存到参数名getPara;
如果“获取全部”选择Yes,则上面都可以得到参数内容abc,并将abc保存到参数名validateCode;内容efg,并将abc保存到参数名getPara_2;
3)
多个节点名相同但属性不同
可以通过属性过滤特定的节点
响应消息内容为<root><parent><child name=1>abc</child><child name=2>efg</child><</parent></root>,需要提取child节点的内容值abc,则匹配文本可以配置如下:
/root/parent/child name=1
/parent/child name=1
/child name=1
即查找的字符串味child name=1,属性与节点名中间符号一定要与内容一样
Xpath与前面的by xml find不同之处是,响应内容必须是XML格式,且输入的xpath值必须符合xpath语法,xpath方式比by xml find更加消耗性能。
保存获取到的值为名称getPara
1) Yes表示获取匹配的所有值 (即数组),保存参数值的key分别为validateCode, getPara_2, getPara_3, ..., getPara_n;
2) No: 只获取第一个匹配的值,并保存参数值的key为getPara
必须符合xpath语法,语法可参照:http://www.w3school.com.cn/xpath/xpath_syntax.asp
多级节点通过符号“/”分隔,如/parent/child表示获取child节点的内容值,而且它的父必须为parent。下面举例:
1)
例子1
响应消息内容为<root><parent><child>abc</child></parent></root>,需要提取child节点的内容值,则匹配文本可以配置如下:
/root/parent/child
上面都可以得到参数内容abc,并将abc保存到参数名getPara
2)
提取多个同名节点值
响应消息内容为<root><parent><child>abc</child><child>efg</child><</parent></root>,需要提取child节点的内容值,则匹配文本可以配置如下:
/root/parent/child
如果“获取全部”选择NO,则上面都可以得到参数内容abc,并将abc保存到参数名getPara;
如果“获取全部”选择Yes,则上面都可以得到参数内容abc,并将abc保存到参数名validateCode;内容efg,并将abc保存到参数名getPara_2;
3)
多个节点名相同但属性不同
可以通过属性过滤特定的节点
响应消息内容为<root><parent><child name=1>abc</child><child name=2>efg</child><</parent></root>,需要提取child节点的内容值abc,则匹配文本可以配置如下:
/root/parent/child[@name=1]
响应内容必须是JSon格式
保存获取到的值为名称getPara
/parent/child, /parent[0]/child, /parent/child[1], parent与child为key名,多级以'/'分隔,[]代表数组,里面是下标。下面举例:
1)
例子1
响应消息内容为{"parent":{"child":"abc"}},需要提取child节点的内容值,则匹配文本可以配置如下:
/parent/child
上面都得到参数内容abc,并将abc保存到参数名getPara
2)
提取的参数值的父是一个数组
响应消息内容为{"parent":[{"child":"abc","test":1},{"child":"efg","test":2}]},需要提取child节点的内容值abc,则匹配文本可以配置: /parent[0]/child
如果需要提取内容值efg,则匹配文本可以配置: /parent[1]/child
3)
提取的参数值是一个数组
可以通过属性过滤特定的节点
响应消息内容为{"parent":{"child":["abc","efg"]}},需要提取child节点的内容值abc,则匹配文本可以配置:/parent/child[0]
如果需要提取内容值efg,则匹配文本可以配置: /parent/child[1]
当内容为aabb01020304ccdd时,提取到的name参数的值为01020304;先查找aabb两字节,找到后,提取它后面4字节长度作为参数值。
当内容为aabb01020304ccdd时,提取到的name参数的值为01020304;响应消息的第2字节开始(即跳过aabb两字节),提取它后面4字节长度作为参数值。
当内容为aabb01020304ccdd时,提取到的name参数的值为01020304;响应消息的第2字节开始(即跳过aabb两字节),到结束位置前2字节(即从结束位置往前移动2字节)。
3 两次录制比较关联(推荐)
目前只支持HTTP协议的业务,连续录制两次业务,确保录制两次的操作步骤一样。假设文件名保存为A与B,打开A文件,然后点击工具栏的比较按钮,选择B文件;弹出比较窗口,再点击按钮自动列出两次录制日志的不同地方的表格,选择需要关联的记录,然后添加。
说明:
连续录制两次的比较,关联时默认只显示发送请求里出现不同的匹配文本。关联的目的就是在发送时带上参数值,两次录制的脚本的请求内容或参数里,如果出现不一样的文本,基本可以确定该文本是需要关联的,因此从响应消息里得到不一样的文本时,只要是在发送里存在,则可以认为是需要关联的值。
因为可能从响应内容里得到不同的值存在很多,但不一定都需要关联,只有后面请求消息带上它时,才表示需要关联。
界面介绍请参照《kylinPET HTTP(WEB)业务使用指导》文档的“2.5录制两次脚本比较实现关联参数”里的“2.5.2”至“2.5.9”
如果点击“比较”后,弹出如上图的窗口,表示列举属于第二个录制文件的URL在第一个文件里找不到它对应的URL。
注意:
1.
如果是URL的参数不一样,工具是能够识别的,但如果是URL参数前面不一样,工具则认为是不一样。
需要用户确定两次录制步骤是否一样,如果第二次录制多了一些步骤或者步骤不一样则将导致找不到的URL;还有如果业务交互过程的HTTP请求存在动态改变URL(不包括参数值)的情况,例如:
第一次录制的URL是http://www.baidu.com/abc/1/
第一次录制的URL是http://www.baidu.com/abc/2/
解决办法:用户在workspace\url_map目录下创建一个map.txt文件,文件每一行代表一个映射,URL间使用空格分隔;第二个录制文件即窗口提示找不到的URL在前面,如:
Loadrunner的关联自动搜索响应内容然后自动关联到脚本,但有些场景出现关联出错或关联缺少;kylinPET的关联也是自动搜索响应内容里不同的地方,然后默认(即过滤条件勾选了去掉重复与只在HTTP请求出现)过滤出只在后面的发送内容里找到值得关联项。
如果用户对业务系统比较熟悉,可以查看下关联项是否都需要添加,然后根据业务所需添加;
如果用户对你们的业务系统不熟悉,建议选择勾选过滤条件(默认是勾选)后的全部关联项,然后批量添加(类似loadrunner的自动关联)。
说明:
1) 左文本:过滤表格的记录左文本包含该值的记录,如果为空表示不过滤左文本
2) 右文本:过滤表格的记录右文本包含该值的记录,如果为空表示不过滤右文本
3) 只显示“匹配文本”出现在请求内容里:勾选表示表格的记录里,当匹配文本存在请求里才展示;不勾选表示显示全部
例如关联存在abc与dfg,但在后面的请求URL:http://192.168.1.7/a?xx=abc
则abc出现在后面请求内容里,很大可能需要关联,而dfg没出现后面的所有请求里,因此很大可能不需要关联,除非需要dfg去进行逻辑运算得到abc
4) 多条“匹配文本”一样只显示第一条:勾选表示表格的记录里,当匹配文本一样的多条记录只显示第一条;不勾选表示显示全部
例如有记录
其中“匹配文本”primary出现多次,勾选则只显示一条,过滤掉后面两条记录。因为如果该值后面几条每次运行都一样,则取一次就够了,后面再取该值只是浪费效率。
在表格里选择需要关联的项,如果对系统不熟悉,可以勾选过滤条件后,选择全部。
当在关联窗口选择多条时,然后单击“添加”按钮,则为多条记录批量添加关联,提高效率。
如果出现告警:
最下面列出的参数名与参数值表示虽然在脚本里添加成功了,但这些参数值没在后面的发送请求里找到它对应的值,可能不需要关联,需要用户自己判断是否需要。
可以双击表格某条记录或者选择某条记录,然后点击“添加”按钮来添加。
如果出现告警:
关联虽然在脚本里添加成功了,但该参数值没在后面的发送请求里找到它对应的值,可能不需要关联,需要用户自己判断是否需要。
4 录制与回放日志比较关联
回放脚本,然后点击的比较按钮,弹出比较窗口,再点击按钮自动列出两次录制日志的不同地方的表格,选择需要关联的记录,然后添加。
请参照《kylinPET HTTP(WEB)业务使用指导》文档的“2.14 回放与录制日志比较验证业务是否执行成功”
参照“3.1 关联过滤”
参照"3.2 批量添加关联"
5 通过响应消息界面查看日志关联
点击“录制日志”按钮,然后选择内容,右键菜单选择“关联参数”
6 通过自己实现JAVA代码关联参数
当工具提供的管理参数功能不能满足需求时,如需求提取内容解密或者计算,则用户可以自己通过JAVA代码实现关联。操作方式请参照《kylinPET 调用外部java类实现扩展》文档。
主要是实现receive函数,提取内容值然后放入parameterMap.