loadrunner关联——对服务器返回的数据选择性提交

  在跟进项目的过程中,才体会到自己之前闷头看书再写小小的测试程序验证的学习方式很没有效率,知道动态关联,却也只是会参数化式的动态关联,这种关联是我们预先知道要提交的数据而进行的关联;更高一级的可能就是使用loadrunner自带的自动关联,对jsessionid和DSId进行关联,除此之外一无所知。

  在项目中碰到的情况是:对输入框A进行参数化,假定当前参数数据为a1,参数化之后点击“查询”按钮,Server 返回a1的数据,选中a1进行提交。在这个过程中,根据参数不同Server返回的数据不同,且每次返回的数据项很多,提交过程中又需要这些数据,这个时候就需要考虑将Server返回的动态数据原封不动的添加到“提交”请求中去。

  说明:系统协议:flex+http;

【第一次尝试】:给“查询”操作插入事务,这样就可以清楚的知道哪个请求是“查询”操作(PS:比较小白的方式);确定好查询操作的flex_amf_call请求后,使用Tree视图——打开HTTP View中的Response Body——右边选择“XML-Tree Editor”,结合查询结果页面的展示数据和提交操作提交的数据(提交前插入事务就可以知道是哪一个请求),在XML-Tree Editor中查找对应的字段,并使用web_reg_save_param_xpath()函数将字段提取保存;这种方法相当于在盲人摸象,因为要尽可能完整的查找到需要提交的数据。

//以获取“id”为例   !!!注:该方法放在请求之前
web_reg_save_param_xpath( "ParamName=id", "QueryString=/AMFPacket[1]/Messages[1]/Message[1]/AMF3[1]/object-externalizable-custom[1]/flex.messaging.messages.AcknowledgeMessageExt[1]/flex.messaging.io.amf.ASObject[1]/map[1]/flex.messaging.io.ArrayCollection[1]/object-array[1]/flex.messaging.io.amf.ASObject[1]/map[1]/double[1]/text()", SEARCH_FILTERS, "Scope=Body", "IgnoreRedirections=Yes", LAST);
flex_amf_call();

  QueryString的值比较重要,但是当前系统Server返回的数据,对于非关键字段,有的有值有的为空,导致map后面的string[i]中i数值不准确;

【第二次尝试】:在QueryString中不再使绝对路径,但依旧需要对提交字段尽可能多的提取。

flex_amf_call(
.......
 "ResponseParameter=response", //******************** 1:添加参数获取服务器返回值
  ......
);
lr_xml_get_values("XML={response}",
	"Query=//string[contains(text(),'id')]/following::double",   //  2:获取字段对应的值,并保存在name为id的变量中
	 "ValueParam=id",
	 LAST);

【第三次尝试】:同样是使用lr_xml_get_values,但是对整段数据提取,之后在submit.c中找到对应的flex_amf_call函数,再确定数据位置,直接塞进去就可以了O(∩_∩)O~~

flex_amf_call(
.......
 "ResponseParameter=response", //******************** 1:添加参数获取服务器返回值
  ......
);
lr_xml_extract("XML={response}",
  "XMLFragmentParam=Result", 
  "Query=/AMFPacket[1]/Messages[1]/Message[1]/AMF3[1]/object-externalizable-custom[1]/flex.messaging.messages.AcknowledgeMessageExt[1]/flex.messaging.io.amf.ASObject[1]/map[1]/flex.messaging.io.ArrayCollection[1]/object-array[1]/flex.messaging.io.amf.ASObject[1]",   //2:获取整个对象
	LAST );

之后在提交的flex_amf_call中对应位置使用“ {Result} ” 覆盖原数据即可 //3:覆盖原数据

  

  

posted @ 2016-08-30 20:29  天使未必在场  阅读(1238)  评论(0编辑  收藏  举报