1 背景介绍

正常业务场景时,通常存在发送的请求消息需要带上前面服务器回复的动态数据,如验证码、会话ID之类,否则业务将失败。因此需要工具支持从响应消息获取参数值,即关联参数。例如:

上图是一个HTTP请求消息,里面存在多个“{}”符号,即存在多个需要替换为实际值的参数: usernamepasswordvalidateCode,工具在发送数据前会自动将这些参数替换为对应的参数值。

上面参数对应的实际参数值来源方式不同,包括:参数列表配置、从服务器收到的响应消息提取(即关联参数,如validateCode)、工具自动处理(如Content-Length);

1.1 参数列表配置

该文重点是介绍参数关联,因此不对参数列表进行介绍,参数列表可以参照《kylinPET 参数配置》文档

1.2 工具自动处理

工具自动处理的参数每种协议都不同,如HTTP支持:HostCookieContent-Length等等;SIP支持:Content-LengthCall-ID等等。详细参照各个协议对应的文档。

2 在响应界面手动添加参数关联

2.1 响应界面

2.1.1 HTTP响应界面

选择对应的URL资源,再选择下边的“响应消息”选项卡:

2.1.2 HTTP外的其他业务响应界面

SIP协议,双击Receive按钮弹出响应界面:

2.1.3 关联参数表格

1)     表格每一条记录表示从响应消息里获取一个参数值;

2)     可通过按钮添加、修改、删除参数关联设置;

3)     表格列对应关联参数里的配置项。

参数名列:展示参数名+获取参数方式

匹配文本列:展示匹配文本项或左边文本项

查找文本列:展示高级规则里的查找文本项

开始偏移量列:展示“偏移量”或者“开始于文本”或者“结束于文本”,

其中“开始于文本”以“(+)”前缀,“结束于文本”以“(-)”前缀

结束偏移量列:展示“偏移量”或者“开始于文本”或者“结束于文本”,                          其中“开始于文本”以“(-)”前缀,“结束于文本”以“(+)”前缀

说明:

1.          开始偏移量的“(+)”表示包括查找的文本,“(-)”表示不包括查找的文本;

2.          结束偏移量的“(-)”表示不包括查找的文本,“(+)”表示包括查找的文本;

2.1.4 关联参数界面

默认包括:左右方式、自定义、by XML FindBy XML xpathby JSon,另外,一些特殊协议如SIP还包括一些自动处理的参数。

1)     SIP关联参数

包括SIP常见的关键字:Call-IDCSeq等等,详细参照《kylinPET SIPIMS)业务使用指导》文档

2)     WebService关联参数

包括对应接口的返回值,以soap@开头,详细参照《kylinPET WebService业务使用指导》文档

3)     HTTPWEB)及其他协议

2.2 左右方式

通过查找左边文本和右边文本,然后提取中间部分内容

2.2.1 文本协议

响应消息内容:abcd <ip>1.1.1.1</ip> <b>456</b>,获取参数{ip}的值1.1.1.1

2.2.2 二进制协议

0xaabb表示查找两字节,第一字节为aa ,第二字节为bb。当内容为aabb01020304ccdd时,提取到的name参数的值为01020304

说明:

1、     16进制方式:一个字节需要用2个字母表示,如aa;必须以0x开头,否则认为检查文本

2、     文本方式:直接输入文本字符串,不以0x开头

2.3 自定义

2.3.1 界面参数说明

1)        来源于

HTTPRTSPSIP协议消息格式分为头域与消息体两部分,其中头域部分为两回车前部分,消息体为两回车后部分(如HTTP里的HTML为两回车后,为消息体);其他协议只有响应消息一个选项。

说明:

分为头域与消息体两部分,缩小查找范围,提高查找效率

2)        获取参数

a)     左右方式:通过查找左边与右边文本方式获取参数值,例如:<a>123</a>,左边文本设置为<a>,右边文本设置为</a>,则获取的参数值为123

b)     自定义:提供复杂方式来获取参数值;包括查找文本使用正则表达式、查找多次、在查找到的参数值再进行查找。

c)     自动参数:协议典型参数,由工具自动获取;如HTTPCookieRTSPSessionSIPCseqCall-ID

3)        参数名

当选择左右方式或自定义时,必须设置参数名,表示提取的内容对应的key

4)        匹配文本

自定义时必须设置,在响应消息里查找的字符串,支持java正则表达式。如设置<a>.*</a>则可以得到内容值为<a>123</a><a>abcd</a>

5)        次数

设置查找的次数。如设置2,则表示需要查找两次,第1次找到的内容不是期望的参数值,第2次找到的内容才是期望的参数值

6)        左边文本

左右方式时必须设置,在响应消息里查找的字符串,该文本的结束位置为参数值的起始位置

7)        右边文本

左右方式时必须设置,在响应消息里查找的字符串,该文本的开始位置为参数值的结束位置

8)        结果来源于

a)     匹配规则的文本:不需要再进行查找,当前查找到的内容即为参数值;

b)     高级规则:在当前查找的基础上再进行一次查找,新查找的内容为参数值;

9)        类型

a)     在匹配文本里面:在当前查找到的内容里再进行查找,一般应用于正则表达式里再查找,如<a>.*</a>找到了<a>123</a>,但参数值为123,因此需要在里面进行第2次查找;

b)     在匹配文本后面:在当前查找到的内容后面再进行查找;

c)     在匹配文本前面:在当前查找到的内容前面再进行查找;

10)     查找文本

再查找字符串,不支持正则表达式;一般不需要配置

11)     开始偏移量

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>(结束于它);

12)     结束偏移量

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

2.3.2 例子

响应消息内容:abcd <ip>1.1.1.1</ip> <b>456</b>,获取参数{ip}的值1.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}

2)        高级规则

先得到<ip>1.1.1.1</ip>,再使用高级规则从结果里得到IP地址

或者

2.4 By XML Find

在响应内容里查找节点名字符串

2.4.1 参数名

保存获取到的值为名称getPara

2.4.2 获取全部

1)     Yes表示获取匹配的所有值 (即数组),保存参数值的key分别为validateCode, getPara_2, getPara_3, ..., getPara_n

2)     No: 只获取第一个匹配的值,并保存参数值的keygetPara

2.4.3 匹配文本

多级节点通过符号“/”分隔,如/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,属性与节点名中间符号一定要与内容一样

2.5 By XML xpath

Xpath与前面的by xml find不同之处是,响应内容必须是XML格式,且输入的xpath值必须符合xpath语法,xpath方式比by xml find更加消耗性能。

    

2.5.1 参数名

保存获取到的值为名称getPara

2.5.2 获取全部

1)     Yes表示获取匹配的所有值 (即数组),保存参数值的key分别为validateCode, getPara_2, getPara_3, ..., getPara_n

2)     No: 只获取第一个匹配的值,并保存参数值的keygetPara

2.5.3 xpath

必须符合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]

2.6 By JSon

响应内容必须是JSon格式

2.6.1 参数名

保存获取到的值为名称getPara

2.6.2 匹配文本

/parent/child, /parent[0]/child, /parent/child[1], parentchildkey名,多级以'/'分隔,[]代表数组,里面是下标。下面举例:

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]

2.7 左文本与长度(二进制协议)

当内容为aabb01020304ccdd时,提取到的name参数的值为01020304;先查找aabb两字节,找到后,提取它后面4字节长度作为参数值。

2.8 开始偏移量与长度(二进制协议)

当内容为aabb01020304ccdd时,提取到的name参数的值为01020304;响应消息的第2字节开始(即跳过aabb两字节),提取它后面4字节长度作为参数值。

2.9 开始与离结束偏移量(二进制协议)

当内容为aabb01020304ccdd时,提取到的name参数的值为01020304;响应消息的第2字节开始(即跳过aabb两字节),到结束位置前2字节(即从结束位置往前移动2字节)。

3 两次录制比较关联(推荐)

目前只支持HTTP协议的业务,连续录制两次业务,确保录制两次的操作步骤一样。假设文件名保存为AB,打开A文件,然后点击工具栏的比较按钮,选择B文件;弹出比较窗口,再点击按钮自动列出两次录制日志的不同地方的表格,选择需要关联的记录,然后添加。

说明:

连续录制两次的比较,关联时默认只显示发送请求里出现不同的匹配文本。关联的目的就是在发送时带上参数值,两次录制的脚本的请求内容或参数里,如果出现不一样的文本,基本可以确定该文本是需要关联的,因此从响应消息里得到不一样的文本时,只要是在发送里存在,则可以认为是需要关联的值。

因为可能从响应内容里得到不同的值存在很多,但不一定都需要关联,只有后面请求消息带上它时,才表示需要关联。

界面介绍请参照《kylinPET HTTPWEB)业务使用指导》文档的“2.5录制两次脚本比较实现关联参数”里的“2.5.2”至“2.5.9

3.1 弹出未找到的URL窗口

如果点击“比较”后,弹出如上图的窗口,表示列举属于第二个录制文件的URL在第一个文件里找不到它对应的URL

注意:

1.          如果是URL的参数不一样,工具是能够识别的,但如果是URL参数前面不一样,工具则认为是不一样。

需要用户确定两次录制步骤是否一样,如果第二次录制多了一些步骤或者步骤不一样则将导致找不到的URL;还有如果业务交互过程的HTTP请求存在动态改变URL(不包括参数值)的情况,例如:

第一次录制的URLhttp://www.baidu.com/abc/1/

第一次录制的URLhttp://www.baidu.com/abc/2/

 

解决办法:用户在workspace\url_map目录下创建一个map.txt文件,文件每一行代表一个映射,URL间使用空格分隔;第二个录制文件即窗口提示找不到的URL在前面,如:

3.2 关联过滤

Loadrunner的关联自动搜索响应内容然后自动关联到脚本,但有些场景出现关联出错或关联缺少;kylinPET的关联也是自动搜索响应内容里不同的地方,然后默认(即过滤条件勾选了去掉重复与只在HTTP请求出现)过滤出只在后面的发送内容里找到值得关联项。

如果用户对业务系统比较熟悉,可以查看下关联项是否都需要添加,然后根据业务所需添加;

如果用户对你们的业务系统不熟悉,建议选择勾选过滤条件(默认是勾选)后的全部关联项,然后批量添加(类似loadrunner的自动关联)。

说明:

1)     左文本:过滤表格的记录左文本包含该值的记录,如果为空表示不过滤左文本

2)     右文本:过滤表格的记录右文本包含该值的记录,如果为空表示不过滤右文本

3)     只显示“匹配文本”出现在请求内容里:勾选表示表格的记录里,当匹配文本存在请求里才展示;不勾选表示显示全部

例如关联存在abcdfg,但在后面的请求URL:http://192.168.1.7/a?xx=abc

abc出现在后面请求内容里,很大可能需要关联,而dfg没出现后面的所有请求里,因此很大可能不需要关联,除非需要dfg去进行逻辑运算得到abc

4)     多条“匹配文本”一样只显示第一条:勾选表示表格的记录里,当匹配文本一样的多条记录只显示第一条;不勾选表示显示全部

例如有记录

其中“匹配文本”primary出现多次,勾选则只显示一条,过滤掉后面两条记录。因为如果该值后面几条每次运行都一样,则取一次就够了,后面再取该值只是浪费效率。

3.3 添加关联

3.3.1 批量添加关联

在表格里选择需要关联的项,如果对系统不熟悉,可以勾选过滤条件后,选择全部。

当在关联窗口选择多条时,然后单击“添加”按钮,则为多条记录批量添加关联,提高效率。

如果出现告警:

最下面列出的参数名与参数值表示虽然在脚本里添加成功了,但这些参数值没在后面的发送请求里找到它对应的值,可能不需要关联,需要用户自己判断是否需要。

3.3.2 添加单个关联

可以双击表格某条记录或者选择某条记录,然后点击“添加”按钮来添加。

如果出现告警:

关联虽然在脚本里添加成功了,但该参数值没在后面的发送请求里找到它对应的值,可能不需要关联,需要用户自己判断是否需要。

4 录制与回放日志比较关联

回放脚本,然后点击的比较按钮,弹出比较窗口,再点击按钮自动列出两次录制日志的不同地方的表格,选择需要关联的记录,然后添加。

请参照《kylinPET HTTPWEB)业务使用指导》文档的“2.14 回放与录制日志比较验证业务是否执行成功”

4.1 关联过滤

参照“3.1 过滤

4.2 批量添加关联

参照"3.2 批量添加关联"

5 通过响应消息界面查看日志关联

点击“录制日志”按钮,然后选择内容,右键菜单选择“关联参数”

6 通过自己实现JAVA代码关联参数

当工具提供的管理参数功能不能满足需求时,如需求提取内容解密或者计算,则用户可以自己通过JAVA代码实现关联。操作方式请参照《kylinPET 调用外部java类实现扩展》文档。

主要是实现receive函数,提取内容值然后放入parameterMap.