LoadRunner测试Google Suggest
Google的搜索框是典型的AJAX应用,用户在输入关键字的同时,前端页面通过xmlhttp与后台服务器动态交互,根据用户输入的关键字查找匹配的内容,向用户提示建议的搜索项,也就是所谓的“google suggest”。
如果使用LoadRunner进行测试,采用AJAX(Click and Script)协议录制的话会得到以下脚本:
Action()
{
web_add_cookie_ex("Cookie=PREF=ID=372e76ef6c7e842e:U=1961d03ffd7ab924:NW=1:TM=1264934277:LM=1264934316:S=OYfvCjRzGq1u4u4z; domain=google.cn; path=/", ENDITEM,
"Cookie=NID=31=hwv9eoM6IVUuD1ssILGftThmu8fjLzTdRUZXJTwcEggxBjCoy4Fh3dEsZVLVZ66_WndMz03It6xuCCWAqW28ZCj2r2wJxmfKM4_UHMZGk_mnybPjA6tDdB9HFqVkX1EU; domain=google.cn; path=/", ENDITEM,
"Cookie=SNID=31=BZul31Bwi_B97OMZlOIjZOeSm05tZw_9bw9T4zsT=kqUHVr3rOWtmkOvF; domain=google.cn; path=/verify", ENDITEM,
LAST);
web_browser("www.google.cn",
DESCRIPTION,
ACTION,
"Navigate=http://www.google.cn/",
LAST);
web_edit_field("q",
"Snapshot=t1.inf",
DESCRIPTION,
"Type=text",
"Name=q",
ACTION,
"SetValue=AJAX",
LAST);
web_button("INPUT",
"Snapshot=t2.inf",
DESCRIPTION,
"Type=submit",
"Tag=INPUT",
"ID=",
"Value=Google 搜索",
ACTION,
"UserAction=Click",
LAST);
return 0;
}
可以看到google suggest的AJAX行为并没有被录制下来,从回放日志的服务器返回记录中也找不到google suggest返回结果的踪影。
采用WEB(HTTP/HTML)协议来录制,则得到下面的脚本:
Action()
{
web_add_cookie("PREF=ID=372e76ef6c7e842e:U=1961d03ffd7ab924:NW=1:TM=1264934277:LM=1264934316:S=OYfvCjRzGq1u4u4z; DOMAIN=www.google.cn");
web_add_cookie("NID=31=hwv9eoM6IVUuD1ssILGftThmu8fjLzTdRUZXJTwcEggxBjCoy4Fh3dEsZVLVZ66_WndMz03It6xuCCWAqW28ZCj2r2wJxmfKM4_UHMZGk_mnybPjA6tDdB9HFqVkX1EU; DOMAIN=www.google.cn");
web_url("www.google.cn",
"URL=http://www.google.cn/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
EXTRARES,
"Url=/extern_js/f/CgV6aC1DThICY24rMAo4V0ACLCswDjgLLCswETgVLCswFjgXLCswFzgFLCswGDgFLCswGTgTLCswJTjKiAEsKzAmOAksKzAnOAQsKzA8OAIsKzBEOAEsKzBFOAEs/qft1hKbTw2Q.js", ENDITEM,
"Url=/favicon.ico", "Referer=", ENDITEM,
"Url=/intl/zh-CN/images/toolbar_animation_20090618.png", ENDITEM,
"Url=/complete/search?hl=zh-CN&xhr=t&q=A&cp=1", ENDITEM,
"Url=/complete/search?hl=zh-CN&xhr=t&q=AJ&cp=2", ENDITEM,
"Url=/complete/search?hl=zh-CN&xhr=t&q=AJA&cp=3", ENDITEM,
"Url=/complete/search?hl=zh-CN&xhr=t&q=AJAX&cp=4", ENDITEM,
LAST);
web_url("csi",
"URL=http://www.google.cn/csi?v=3&s=webhp&action=&e=17259,23361,23603&ei=kMFrS-GQB8qNkAWljIX6AQ&expi=17259,23361,23603&imc=2&imn=2&imp=2&rt=prt.110,xjsls.125,ol.437,iml.250,xjses.437,xjsee.468,xjs.500",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/",
"Mode=HTML",
LAST);
web_url("search",
"URL=http://www.google.cn/search?hl=zh-CN&source=hp&q=AJAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/",
"Snapshot=t2.inf",
"Mode=HTML",
LAST);
web_url("gen_204",
"URL=http://www.google.cn/gen_204?mgmhp=shp1&ct=v&cd=false",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/search?hl=zh-CN&source=hp&q=AJAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Mode=HTML",
LAST);
web_url("csi_2",
"URL=http://www.google.cn/csi?v=3&s=web&action=&e=17259,23361,23603&ei=msFrS5anH8qGkAX5rJDwAw&expi=17259,23361,23603&imc=1&imn=1&imp=1&rt=prt.125,ol.343,iml.156,xjses.375,xjsee.390,xjsls.390,xjs.437",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/search?hl=zh-CN&source=hp&q=AJAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Mode=HTML",
LAST);
return 0;
}
google suggest的行为被录制到第一个web_url的请求中,被作为资源进行HTTP请求。Web_url函数中的EXTRARES表示表示后面的url所指的内容都是作为资源来请求的,LR的帮助文档中是这样说的:
A list of resources generated by non–HTML mechanisms in the Web page. These include the resources requested by Javascript, ActiveX, Java applets and Flash. VuGen's Recording Options allow these elements either to be recorded within the current script step (the default mode) or recorded as separate steps (see "Recording in HTML–Based Mode" in the VuGen Online Book).
如果想把google suggest的行为分别录制成一个个的web_url请求,则需要修改录制模式,改为用“URL-Based”模式录制:
Action()
{
web_add_cookie("PREF=ID=372e76ef6c7e842e:U=1961d03ffd7ab924:NW=1:TM=1264934277:LM=1264934316:S=OYfvCjRzGq1u4u4z; DOMAIN=www.google.cn");
web_add_cookie("NID=31=hwv9eoM6IVUuD1ssILGftThmu8fjLzTdRUZXJTwcEggxBjCoy4Fh3dEsZVLVZ66_WndMz03It6xuCCWAqW28ZCj2r2wJxmfKM4_UHMZGk_mnybPjA6tDdB9HFqVkX1EU; DOMAIN=www.google.cn");
web_url("www.google.cn",
"URL=http://www.google.cn/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTTP",
LAST);
web_concurrent_start(NULL);
web_url("logo_cn.gif",
"URL=http://www.google.cn/intl/zh-CN/images/logo_cn.gif",
"Resource=1",
"RecContentType=image/gif",
"Referer=http://www.google.cn/",
"Snapshot=t2.inf",
LAST);
web_url("cn_icp.gif",
"URL=http://www.google.cn/intl/zh-CN_cn/images/cn_icp.gif",
"Resource=1",
"RecContentType=image/gif",
"Referer=http://www.google.cn/",
"Snapshot=t3.inf",
LAST);
web_concurrent_end(NULL);
web_concurrent_start(NULL);
web_url("qft1hKbTw2Q.js",
"URL=http://www.google.cn/extern_js/f/CgV6aC1DThICY24rMAo4V0ACLCswDjgLLCswETgVLCswFjgXLCswFzgFLCswGDgFLCswGTgTLCswJTjKiAEsKzAmOAksKzAnOAQsKzA8OAIsKzBEOAEsKzBFOAEs/qft1hKbTw2Q.js",
"Resource=1",
"RecContentType=text/javascript",
"Referer=http://www.google.cn/",
"Snapshot=t4.inf",
LAST);
web_url("nav_logo7.png",
"URL=http://www.google.cn/images/nav_logo7.png",
"Resource=1",
"RecContentType=image/png",
"Referer=http://www.google.cn/",
"Snapshot=t5.inf",
LAST);
web_url("favicon.ico",
"URL=http://www.google.cn/favicon.ico",
"Resource=1",
"RecContentType=image/x-icon",
"Referer=",
"Snapshot=t6.inf",
LAST);
web_concurrent_end(NULL);
web_url("csi",
"URL=http://www.google.cn/csi?v=3&s=webhp&action=&e=17259,23361,23603&ei=9MRrS62DC8yTkAX285SPAw&expi=17259,23361,23603&imc=2&imn=2&imp=2&rt=prt.94,xjsls.109,ol.437,iml.328,xjses.452,xjsee.484,xjs.515",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/",
"Mode=HTTP",
LAST);
web_concurrent_start(NULL);
web_url("toolbar_animation_20090618.png",
"URL=http://www.google.cn/intl/zh-CN/images/toolbar_animation_20090618.png",
"Resource=1",
"RecContentType=image/png",
"Referer=http://www.google.cn/",
"Snapshot=t7.inf",
LAST);
web_url("search",
"URL=http://www.google.cn/complete/search?hl=zh-CN&xhr=t&q=A&cp=1",
"Resource=1",
"RecContentType=application/json",
"Referer=http://www.google.cn/",
"Snapshot=t8.inf",
LAST);
web_url("search_2",
"URL=http://www.google.cn/complete/search?hl=zh-CN&xhr=t&q=Aj&cp=2",
"Resource=1",
"RecContentType=application/json",
"Referer=http://www.google.cn/",
"Snapshot=t9.inf",
LAST);
web_url("search_3",
"URL=http://www.google.cn/complete/search?hl=zh-CN&xhr=t&q=AjA&cp=3",
"Resource=1",
"RecContentType=application/json",
"Referer=http://www.google.cn/",
"Snapshot=t10.inf",
LAST);
web_url("search_4",
"URL=http://www.google.cn/complete/search?hl=zh-CN&xhr=t&q=AjAX&cp=4",
"Resource=1",
"RecContentType=application/json",
"Referer=http://www.google.cn/",
"Snapshot=t11.inf",
LAST);
web_concurrent_end(NULL);
lr_think_time(14);
web_url("search_5",
"URL=http://www.google.cn/search?hl=zh-CN&source=hp&q=AjAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/",
"Snapshot=t12.inf",
"Mode=HTTP",
LAST);
web_url("nav_logo7.png_2",
"URL=http://www.google.cn/images/nav_logo7.png",
"Resource=1",
"RecContentType=image/png",
"Referer=http://www.google.cn/search?hl=zh-CN&source=hp&q=AjAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Snapshot=t13.inf",
LAST);
web_url("gen_204",
"URL=http://www.google.cn/gen_204?mgmhp=shp1&ct=v&cd=false",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/search?hl=zh-CN&source=hp&q=AjAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Mode=HTTP",
LAST);
web_url("csi_2",
"URL=http://www.google.cn/csi?v=3&s=web&action=&e=17259,23361,23603&ei=BMVrS-fpFMqGkAWXrpzwAw&expi=17259,23361,23603&imc=1&imn=1&imp=0&rt=prt.468,ol.499,iml.468,xjses.546,xjsee.561,xjsls.561,xjs.608",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/search?hl=zh-CN&source=hp&q=AjAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Mode=HTTP",
LAST);
return 0;
}
这样录制下来的脚本会长很多。Google suggest的AJAX行为被分别录制成一个个的web_url请求,并且放在web_concurrent_start和web_concurrent_end之间。关于web_concurrent_start函数的描述,可以参考LR帮助文档:
The web_concurrent_start function marks the beginning of a concurrent group. All functions within the group are executed concurrently. The end of the group is marked by the web_concurrent_end function. Within the concurrent group, you may include Action functions and several Service functions.
Note that the functions included within the concurrent group are not executed immediately. Instead they are registered for concurrent execution. When the concurrent group is closed, all of the functions registered as concurrent are executed together.
Concurrent中的函数都会先注册,而不是马上执行,直到web_concurrent_end才一起执行,这个从回放的日志也可以看出来:
Action.c(73): web_concurrent_start was successful [MsgId: MMSG-26392]
Action.c(75): Registering web_url("toolbar_animation_20090618.png") was successful [MsgId: MMSG-26390]
Action.c(83): Registering web_url("search") was successful [MsgId: MMSG-26390]
Action.c(91): Registering web_url("search_2") was successful [MsgId: MMSG-26390]
Action.c(99): Registering web_url("search_3") was successful [MsgId: MMSG-26390]
Action.c(107): Registering web_url("search_4") was successful [MsgId: MMSG-26390]
Action.c(115): web_concurrent_end was successful, 8506 body bytes, 1355 header bytes, 84 chunking overhead bytes [MsgId: MMSG-26385]
LoadRunner测试Google Suggest的更多相关文章
- AJAX实现仿Google Suggest效果
修复了一些细节代码(支持持续按键事件) *项目名称:AJAX实现类Google Suggest效果*作者:草履虫(也就是蓝色的ecma)*联系:caolvchong@gmail.com*时间:2007 ...
- LoadRunner测试AJAX
什么是AJAX? Ajax, shorthand for Asynchronous JavaScript and XML, is a web development technique for cre ...
- LoadRunner测试结果分析03 转载至zhangzhe的新浪博客
LoadRunner测试结果分析之我见 前面分析的Web Resource(网络资源)的测试情况,其主要关注的是服务器性能,而系统本身和环境都有可能存在问题,页面诊断(Web Page Diagnos ...
- LoadRunner测试结果分析02 转载至zhangzhe的新浪博客
LoadRunner测试结果分析之我见 上述测试过程的重点在于事务,而LoadRunner生成的测试结果图并不局限于事务上,其中还有是关于Vusers.Errors.Web Resources.Web ...
- LoadRunner测试结果分析01 转载至zhangzhe的新浪博客
LoadRunner测试结果分析之我见 LoadRunner生成测试结果并不代表着这次测试结果的结束,相反,这次测试结果的重头戏才刚刚开始.如何对测试结果进行分析,关系着这次测试的成功与否.网上关于L ...
- LoadRunner测试场景中添加负载生成器
如何在LoadRunner测试场景中添加负载生成器 本文对如何在LoadRunner的测试场景中添加负载生成器,如何使用负载生成器的方法,总结形成操作指导手册,以指导测试人员指导开展相关工作. 1.什 ...
- LoadRunner测试50人同时登陆下单
LoadRunner测试50人同时登陆下单 一.LoadRunner简介 LoadRunner,是一种预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找 ...
- LoadRunner测试问题
1.关于Error -27791: Error -27790:Error -27740: 错误如下: Action.c(198): Error -27791: Server has shut down ...
- LoadRunner测试ajax框架,回放后系统中没有产生数据解决方法
1.QTP11 下载地址:http://www.genilogix.com/downloads/unified-functional-testing/quicktest-professional-11 ...
随机推荐
- 【C++】继承中的隐藏与覆盖
没有访问控制符时默认为私有继承. 当基类中的某个函数有若干个重载版本,继承类中也实现了该函数的某个重载版本时,参数完全相同的基类版本被覆盖,基类的其他版本被隐藏. 1.若要在继承类中使用基类的被覆盖方 ...
- HUST-1350 Trie
1350 - Trie 时间限制:1秒 内存限制:128兆 104 次提交 35 次通过 题目描述 In computer science, a trie, is an ordered tree da ...
- SQLAlchemy技术文档(中文版)-上
转自:http://www.cnblogs.com/iwangzc/p/4112078.html 1.版本检查 import sqlalchemy sqlalchemy.__version__ 2.连 ...
- docker 安装持久化mysql
https://hub.docker.com 拉取mysql镜像docker pull mysql:5.5运行mysql镜像并持久化到本地docker run -v /var/own/mysqldat ...
- Bootstrap模态框垂直居中展示的方法
在bootstrap.js中加入以下代码:
- Android:Activity统一堆栈管理(实现随时finish特定或是所有Activty)
直接上代码: Activity管理类:AppManager /** * 应用程序Activity管理类:用于Activity管理和应用程序退出 * * @author BiHaidong * @ver ...
- AC日记——斐波那契数列(升级版) 洛谷 P2626
斐波那契数列(升级版) 思路: 水题: 代码: #include <cmath> #include <cstdio> #include <cstring> #inc ...
- JS动态计算移动端rem的解决方案
首先介绍下rem 说起rem就的说px,em: PX为单位 在Web页面初期制作中,我们都是使用“px”来设置我们的文本,因为他比较稳定和精确.但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的 ...
- SecureCRT 的上传和下载操作
在网上找了两篇文章,分别关于ftp和ssh的上传下载,如果有好的大家可以留言分享,不胜感谢~ 因为关于ftp的比较少,就copy上面,本人并没有验证.关于ssh用sr和sz发现一条错误,而且网上也有解 ...
- [Codeforces 15E] Triangle
Brief Introduction: 求从N出发,回到N且不包含任何黑色三角的路径数 Algorithm:假设从N点到第二层中间的节点M的路径数为k,易知总路径数为(k*k+1)*2 而从第第四层开 ...