百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

性能测试之看懂这一个LoadRunner再无困难的脚本

cac55 2024-09-26 07:28 25 浏览 0 评论

一个特别的练习需求

LoadRunner自带的训练的飞机票网站的例子中,有一个很有意思的流程,如下:首先登陆机票系统,然后查询从哪里到哪里的机票。然后系统会给你4张推荐票。选择一张机票,后就可以支付然后完成机票的预定和购买了。

我相信所有在用LoadRunner的人对这个流程都不陌生,很熟悉。那么今天测者提出一个问题,我想一个脚本购买推荐的4张飞机票。该如何处理对应的测试脚本呢?

一个飞机票的超级脚本

Action()

{

int i=0;//循环订票的游标变量

char temp[255];//临时存储字符串变量

int count=0;//存储循环关联数组长度变量

char tempfly[255];//临时存储字符串变量

web_url("WebTours",

"URL=http://127.0.0.1:1080/WebTours/",

"Resource=0",

"RecContentType=text/html",

"Referer=",

"Snapshot=t1.inf",

"Mode=HTTP",

LAST);

web_concurrent_start(NULL);

web_url("header.html",

"URL=http://127.0.0.1:1080/WebTours/header.html",

"Resource=0",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/",

"Snapshot=t2.inf",

"Mode=HTTP",

LAST);

web_url("welcome.pl",

"URL=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true",

"Resource=0",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/",

"Snapshot=t4.inf",

"Mode=HTTP",

LAST);

web_concurrent_end(NULL);

web_concurrent_start(NULL);

web_url("hp_logo.png",

"URL=http://127.0.0.1:1080/WebTours/images/hp_logo.png",

"Resource=1",

"RecContentType=image/png",

"Referer=http://127.0.0.1:1080/WebTours/header.html",

"Snapshot=t3.inf",

LAST);

web_url("webtours.png",

"URL=http://127.0.0.1:1080/WebTours/images/webtours.png",

"Resource=1",

"RecContentType=image/png",

"Referer=http://127.0.0.1:1080/WebTours/header.html",

"Snapshot=t5.inf",

LAST);

web_concurrent_end(NULL);

web_concurrent_start(NULL);

web_url("home.html",

"URL=http://127.0.0.1:1080/WebTours/home.html",

"Resource=0",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true",

"Snapshot=t6.inf",

"Mode=HTTP",

LAST);

web_reg_save_param("sessionuser","LB=<input type=hidden name=userSession value=","RB=>",LAST);//获取用于session值的关联函数

web_url("nav.pl",

"URL=http://127.0.0.1:1080/WebTours/nav.pl?in=home",

"Resource=0",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true",

"Snapshot=t7.inf",

"Mode=HTTP",

LAST);

web_concurrent_end(NULL);

web_concurrent_start(NULL);

web_url("JSFormSubmit.js",

"URL=http://127.0.0.1:1080/WebTours/JSFormSubmit.js",

"Resource=1",

"RecContentType=application/x-javascript",

"Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",

"Snapshot=t8.inf",

LAST);

web_url("mer_login.gif",

"URL=http://127.0.0.1:1080/WebTours/images/mer_login.gif",

"Resource=1",

"RecContentType=image/gif",

"Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",

"Snapshot=t9.inf",

LAST);

web_concurrent_end(NULL);

lr_start_transaction("login-0");

lr_think_time(9);

lr_error_message("sessionuser:%s",lr_eval_string("{sessionuser}"));//打印关联到的用户session值

web_submit_data("login.pl",

"Action=http://127.0.0.1:1080/WebTours/login.pl",

"Method=POST",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",

"Snapshot=t10.inf",

"Mode=HTTP",

ITEMDATA,

"Name=userSession", "Value={sessionuser}", ENDITEM,

"Name=username", "Value=test001", ENDITEM,

"Name=password", "Value=123456", ENDITEM,

"Name=JSFormSubmit", "Value=on", ENDITEM,

"Name=login.x", "Value=64", ENDITEM,

"Name=login.y", "Value=15", ENDITEM,

LAST);

web_concurrent_start(NULL);

web_url("nav.pl_2",

"URL=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",

"Resource=0",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/login.pl",

"Snapshot=t11.inf",

"Mode=HTTP",

LAST);

web_url("login.pl_2",

"URL=http://127.0.0.1:1080/WebTours/login.pl?intro=true",

"Resource=0",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/login.pl",

"Snapshot=t16.inf",

"Mode=HTTP",

LAST);

web_concurrent_end(NULL);

web_concurrent_start(NULL);

web_url("flights.gif",

"URL=http://127.0.0.1:1080/WebTours/images/flights.gif",

"Resource=1",

"RecContentType=image/gif",

"Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",

"Snapshot=t12.inf",

LAST);

web_url("signoff.gif",

"URL=http://127.0.0.1:1080/WebTours/images/signoff.gif",

"Resource=1",

"RecContentType=image/gif",

"Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",

"Snapshot=t13.inf",

LAST);

web_url("itinerary.gif",

"URL=http://127.0.0.1:1080/WebTours/images/itinerary.gif",

"Resource=1",

"RecContentType=image/gif",

"Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",

"Snapshot=t14.inf",

LAST);

web_url("in_home.gif",

"URL=http://127.0.0.1:1080/WebTours/images/in_home.gif",

"Resource=1",

"RecContentType=image/gif",

"Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",

"Snapshot=t15.inf",

LAST);

web_concurrent_end(NULL);

lr_end_transaction("login-0",LR_AUTO);

lr_start_transaction("book-1");

lr_think_time(11);

web_url("Search Flights Button",

"URL=http://127.0.0.1:1080/WebTours/welcome.pl?page=search",

"Resource=0",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home",

"Snapshot=t17.inf",

"Mode=HTTP",

LAST);

web_concurrent_start(NULL);

web_url("reservations.pl",

"URL=http://127.0.0.1:1080/WebTours/reservations.pl?page=welcome",

"Resource=0",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/welcome.pl?page=search",

"Snapshot=t18.inf",

"Mode=HTTP",

LAST);

web_url("nav.pl_3",

"URL=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=flights",

"Resource=0",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/welcome.pl?page=search",

"Snapshot=t19.inf",

"Mode=HTTP",

LAST);

web_concurrent_end(NULL);

web_concurrent_start(NULL);

web_url("home.gif",

"URL=http://127.0.0.1:1080/WebTours/images/home.gif",

"Resource=1",

"RecContentType=image/gif",

"Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=flights",

"Snapshot=t20.inf",

LAST);

web_url("itinerary.gif_2",

"URL=http://127.0.0.1:1080/WebTours/images/itinerary.gif",

"Resource=0",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=flights",

"Mode=HTTP",

LAST);

web_url("signoff.gif_2",

"URL=http://127.0.0.1:1080/WebTours/images/signoff.gif",

"Resource=0",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=flights",

"Mode=HTTP",

LAST);

web_url("in_flights.gif",

"URL=http://127.0.0.1:1080/WebTours/images/in_flights.gif",

"Resource=1",

"RecContentType=image/gif",

"Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=flights",

"Snapshot=t21.inf",

LAST);

web_concurrent_end(NULL);

web_url("button_next.gif",

"URL=http://127.0.0.1:1080/WebTours/images/button_next.gif",

"Resource=1",

"RecContentType=image/gif",

"Referer=http://127.0.0.1:1080/WebTours/reservations.pl?page=welcome",

"Snapshot=t22.inf",

LAST);

web_reg_save_param("flytype","LB=<input type = radio name=outboundFlight value=","RB=>","ORD=ALL","Savelen=18",LAST);//关联取得出现的4张电子机票

// web_reg_save_param("seatPref","LB=<input type=\"radio\" name=\"seatPref\" value=\"","RB=\" ","ORD=ALL","SaveLen=6",LAST);

// web_reg_save_param("seatType","LB=<input type=\"radio\" name=\"seatType\" value=\"","RB=\" ","ORD=ALL","SaveLen=8",LAST);

lr_error_message("seatPref_1:",lr_eval_string("{seatPref_1}"));

lr_error_message("seatPref_2:",lr_eval_string("{seatPref_2}"));

lr_error_message("seatPref_3:",lr_eval_string("{seatPref_3}"));

lr_error_message("seatType_1:",lr_eval_string("{seatType_1}"));

lr_error_message("seatType_2:",lr_eval_string("{seatType_2}"));

lr_error_message("seatType_3:",lr_eval_string("{seatType_3}"));

web_submit_data("reservations.pl_2",

"Action=http://127.0.0.1:1080/WebTours/reservations.pl",

"Method=POST",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/reservations.pl?page=welcome",

"Snapshot=t23.inf",

"Mode=HTTP",

ITEMDATA,

"Name=advanceDiscount", "Value=0", ENDITEM,

"Name=depart", "Value=Denver", ENDITEM,

"Name=departDate", "Value=05/29/2013", ENDITEM,

"Name=arrive", "Value={endplace}", ENDITEM,

"Name=returnDate", "Value=05/30/2013", ENDITEM,

"Name=numPassengers", "Value=1", ENDITEM,

"Name=seatPref", "Value={seatPerf}", ENDITEM,

"Name=seatType", "Value={seatType}", ENDITEM,

"Name=.cgifields", "Value=roundtrip", ENDITEM,

"Name=.cgifields", "Value=seatType", ENDITEM,

"Name=.cgifields", "Value=seatPref", ENDITEM,

"Name=findFlights.x", "Value=80", ENDITEM,

"Name=findFlights.y", "Value=15", ENDITEM,

LAST);

lr_error_message("seatPerf:%s",lr_eval_string("{seatPerf}"));

lr_error_message("seatType:%s",lr_eval_string("{seatType}"));

count = atoi(lr_eval_string("{flytype_count}"));

lr_error_message("lenflytype:%d",count);

lr_error_message("Flytype_1:%s",lr_eval_string("{flytype_1}"));

lr_error_message("Flytype_2:%s",lr_eval_string("{flytype_2}"));

lr_error_message("Flytype_3:%s",lr_eval_string("{flytype_3}"));

lr_error_message("Flytype_4:%s",lr_eval_string("{flytype_4}"));

for(i=0;i<count;i++)

{

sprintf(temp,"{flytype_%d}",i+1);//格式化flytype数组参数格式,取数组中一个存入temp变量

lr_error_message("temp:%s",temp);//打印temp变量的内容

sprintf(tempfly,"%s",lr_eval_string(temp));//将temp变量通过lr_eval_string函数将temp变量存储的对应loadrunner参数的对应内容存入tempfly变量中

lr_error_message("tempfly:%s",tempfly);//打印tempfly变量的内容

lr_error_message("lr_eval_string(tempfly):%s",lr_eval_string(tempfly));//通过lr_eval_string函数取得tempfly变量的内容

lr_save_string(tempfly,"flytypenum");//将tempfly变量内容存到flytypenum参数中,方便以后lr函数使用

lr_error_message("flytypenum:%s",lr_eval_string("{flytypenum}"));//打印flytypenum内容

web_submit_data("reservations.pl_3",

"Action=http://127.0.0.1:1080/WebTours/reservations.pl",

"Method=POST",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/reservations.pl",

"Snapshot=t24.inf",

"Mode=HTTP",

ITEMDATA,

"Name=outboundFlight", "Value={flytypenum}", ENDITEM,

"Name=numPassengers", "Value=1", ENDITEM,

"Name=advanceDiscount", "Value=0", ENDITEM,

"Name=seatType", "Value=Coach", ENDITEM,

"Name=seatPref", "Value=None", ENDITEM,

"Name=reserveFlights.x", "Value=63", ENDITEM,

"Name=reserveFlights.y", "Value=17", ENDITEM,

LAST);

web_submit_data("reservations.pl_4",

"Action=http://127.0.0.1:1080/WebTours/reservations.pl",

"Method=POST",

"RecContentType=text/html",

"Referer=http://127.0.0.1:1080/WebTours/reservations.pl",

"Snapshot=t25.inf",

"Mode=HTTP",

ITEMDATA,

"Name=firstName", "Value=test001", ENDITEM,

"Name=lastName", "Value=test001", ENDITEM,

"Name=address1", "Value=test001", ENDITEM,

"Name=address2", "Value=123456", ENDITEM,

"Name=pass1", "Value=test001 test001", ENDITEM,

"Name=creditCard", "Value=", ENDITEM,

"Name=expDate", "Value=", ENDITEM,

"Name=oldCCOption", "Value=", ENDITEM,

"Name=numPassengers", "Value=1", ENDITEM,

"Name=seatType", "Value=Coach", ENDITEM,

"Name=seatPref", "Value=None", ENDITEM,

"Name=outboundFlight", "Value={flytypenum}", ENDITEM,

"Name=advanceDiscount", "Value=0", ENDITEM,

"Name=returnFlight", "Value=", ENDITEM,

"Name=JSFormSubmit", "Value=off", ENDITEM,

"Name=.cgifields", "Value=saveCC", ENDITEM,

"Name=buyFlights.x", "Value=61", ENDITEM,

"Name=buyFlights.y", "Value=8", ENDITEM,

LAST);

}

web_url("bookanother.gif",

"URL=http://127.0.0.1:1080/WebTours/images/bookanother.gif",

"Resource=1",

"RecContentType=image/gif",

"Referer=http://127.0.0.1:1080/WebTours/reservations.pl",

"Snapshot=t26.inf",

LAST);

lr_end_transaction("book-1",LR_AUTO);

return 0;

}

特别点的解释

首先,LoadRunner是类C语言,因此变量要放到函数的开头声明(C语言的变量)。其次,在for循环中,我们看到了几次sprintf,那么这里了测者会详细说一下,第一次 (假设当前i=0), sprintf(temp,"{flytype_%d}",i+1);,其中“{flytype1}”的含义(包含双引号),是将一个指向了存有flytype_1值的内存地址的指针指向的值赋值给了temp。也就是temp指向了一段存储了fltype_1值的内存。sprintf(tempfly,"%s",lrevalstring(temp));将flytype_1这个指针指向的内存地址存储的值赋给了tempfly,也就是说tempfly和flytype_1这两个指针都指向相同内存地址,这段地址存储的就是关联出来的第一张机票的ouboundFlight值。

————————————————————————————————————————————————

给大家推荐一个学习资料分享群(574253227),里面大牛已经为我们整理好了许多的学习资料,有自动化,接口,性能等等的学习资料!

相关推荐

服务器用的CPU和个人电脑用的CPU有什么区别?一篇文章告诉你!

服务器cpu和普通cpu的区别你的电脑CPU是‘短跑健将’,服务器CPU却是‘铁人三项选手’——它不追求瞬间爆发力,而要7×24小时扛住千军万马的数据洪流!想知道为什么企业机房敢收天价服务费?答案全藏...

“吃鸡”新版本第1天,玩家进入游戏点击“立即更新”,后悔了!

欢迎诸位小伙伴们来到天哥开讲的《和平精英》“精英小课堂”~每逢两三个月,这款游戏就会迎来一次大版本迭代更新,很多朋友会在第一时间更新版本,前往全新的主题模式里一探究竟。不过也有一些老玩家并不会立刻更新...

中关村在线·aigo存储杯《无畏契约》全国高校争霸赛招募启事

以青春之名,燃电竞之火1赛事背景与宗旨在金秋送爽的9月,芊芊学子们即将回归校园生活。为了给精彩的校园生活锦上添花,由中关村在线与aigo存储联合主办的《无畏契约》全国高校争霸赛正式启幕,旨在为全国高...

【生肖狗】9.7-9.10提醒:人算不如天算,转变即是转机

九月上旬的风,带着秋意的清爽,也带着几分不可捉摸的变数。对于生肖狗的朋友们来说,9月7日到9月10日这四天,格外需要留意“计划与变化”的碰撞——你们向来习惯提前规划,做事稳妥周全...

转转客服IM系统的WebSocket集群架构设计和部署方案

本文由转转技术李帅分享,原题“转转客服IM的WebSocket集群部署方案”,下文有修订和重新排版。1、引言转转作为国内头部的二手闲置交易平台,拥有上亿的用户。用户在使用转转app遇到问题时,一般可以...

上线3天Steam好评率86%,《时间旅者:重生曙光》开启生存恐怖新篇章

这里究竟发生了什么?末日降临,真正的故事悄然启幕。目前,生存恐怖类游戏《时间旅者:重生曙光(Cronos:TheNewDawn)》已在PC(Steam、EpicGamesStore)、P...

什么神仙洗衣机让我一天有28小时?拆开松下「大四洗」藏了啥秘密

说起家庭洗衣的烦恼,想必很多人都有过类似的经历:贴身内衣要单独洗,宝宝的口水巾得小心呵护,宠物玩具怕藏污纳垢,床单被套又体积庞大,把这些东西混在一起洗担心越洗越脏,分开洗又得反复操作,洗完烘、烘完再洗...

爆料人挖出GTA6注册的奇葩域名 延续经典讽刺风格

等待《侠盗猎车手6》的日子跨越了数个春秋,在游戏圈期盼着这部可能成为史上最重磅游戏的过程中,每过一段时间就会有些许消息浮出水面。最新线索来自数据挖掘者Tez2在GTA论坛的发现,他可能偶然发现了关于...

跟着故事去旅行——读《驼峰间:旅行、探险与征服》

作者:郭冰茹《驼峰间》记录了旅行家伊本·白图泰有生之年流传的一则寓言,说一对父子被关进了监狱,有一天儿子问父亲他们每天吃的都是些什么肉,父亲说有牛、羊和骆驼,并且详细地描述了每种动物的特点。但不管父亲...

前端工程师需要熟悉的Linux服务器(SSH 终端操作)指令

在Linux服务器管理中,SSH(SecureShell)是远程操作的核心工具。以下是SSH终端操作的常用命令和技巧,涵盖连接、文件操作、系统管理等场景:一、SSH连接服务器1.基本连接...

跳票6年后,「丝之歌」首发把Steam服务器干爆了 | 玩点好的

文丨果脯樱花隧道昨天晚上22点,「鸽」了6年的《空洞骑士:丝之歌》终于上线,算是了却不少玩家的执念。毕竟,这款游戏实在让人等了太多太多年,而且曾有过多次定档后跳票的「案底」,不知道把多少人都整出了P...

对标魔兽失败!腾讯版“魔兽”运营一年多后,宣布国际服凉凉

大家好,这里是正惊游戏,我是正惊小弟。有很多游戏都想干掉《魔兽世界》,但是大部分魔兽杀手都知道自己不是魔兽的对手,不过是想蹭一下人气而已。腾讯也有一款曾经想对标魔兽的大作,可是上线才一年半国际服就宣布...

408 Request Timeout:服务器等待客户端发送请求的时间过长。

408RequestTimeout是HTTP状态码之一,表示客户端在发送请求时,服务器等待的时间过长,最终放弃了处理该请求。此问题通常与网络延迟、客户端配置、服务器设置或者应用程序的性能有关...

梦幻西游:9.9维护解读,全新时间服锁定129级

梦幻西游:9.9维护解读,全新时间服锁定129级9月9日维护解读。1、教师节活动开启,一共7天。挂机,答题,收笔墨纸砚,收海马,搞起来。或者是提前收点家具,教师节期间体力珍贵,家具会涨价。又或者是教师...

只是拆掉一面墙,空间就立马大变样,这种设计思路,值得学习

你有没有过这样的经历?刚买的房子户型图看起来方方正正,装修完却发现——玄关鞋柜只能塞在角落,进门就撞墙;餐厅正好在过道中间,吃饭像走流程;明明有四个房间,却有一个空着没用,像块食之无味的鸡肋;客餐厅之...

取消回复欢迎 发表评论: