专栏首页测试技术圈测者性能测试手册:看懂这一个LoadRunner再无困难的脚本

测者性能测试手册:看懂这一个LoadRunner再无困难的脚本

一个特别的练习需求

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值。

留下的一个练习问题:

其实在最开始的流程中,我们还会发现每次选中一张票后,我们还会选择仓位(三种)、座位位置(三种),那么我想一个脚本能够顶3 * 3 *4=36张票,脚本要如何修改,测者就留给读者你了。欢迎后台回复你的代码交流。

本文分享自微信公众号 - V社 北京社(SoftwareTesters)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • static在C语言中主要是两种用法

    首先从内存四区的角度去看,auto即为普通的局部变量,存储在栈上,当函数结束时,随之释放。

    战神伽罗
  • 【数据结构】线性表的顺序储存结构

    1.写在前面1.C语言关键词---typedef3.线性表的特点4.线性表的顺序表示5.线性表的顺序表示(顺序表)结构

    程序员周同学
  • 实训任务—二次幂的进阶表示

    = 2(2(2)+2(1))+2(2(2))+2(2(1))+2(1)+2(0)

    程序员周同学
  • C语言应该怎么学,看看计算机类的学生给的建议

    近十年来,它在编程语言排行榜(TIOBE)稳居前三。因此,C语言绝对是值得初学者学习的一门语言。笔者从事C语言教学十多年的经验来看,有以下一些建议可供C语言初学...

    诸葛青云
  • 为什么C语言依然是必学的编程语言,这3点告诉你答案

    如今,市面上编程语言几百种,很多人觉得Python、 JAVA这种语言比较火,是不是C语言就不行了呢?

    诸葛青云
  • 实训任务——链表

    链表操作是我们在学习过程中的一大难点,也是一个非常重要的知识点,因为在之后C语言学习的过程中,很多结构模式图都可以在链表的基础上进行延伸。在初次接触的时候,可...

    程序员周同学
  • 浅析变长数组(VLA)和动态数组

    前天实训听见几位推免的大佬聊面试中出现了动态数组,而我们所学并没有涉及到动态数组,遂翻起了尘封已久的《C语言程序设计现代方法》以及《C Primer Plus》...

    休辞醉倒
  • 从Rust到远方:C星系

    来源:https://mnt.io/2018/09/11/from-rust-to-beyond-the-c-galaxy/

    MikeLoveRust
  • 关于顺序表的C语言实现

    严蔚敏老师的教材里用到引用传值,纯C语言无法实现,只能用CPP文件去编译,为此,特意将引用传值改为了指针作为参数。上例实现了创建、初始化、插入的封装。

    休辞醉倒
  • 随机点名可视化界面,记录迟到人员,转exe文件

    压缩文件下载链接:https://github.com/a568972484/Random_roll_call

    小小咸鱼YwY

扫码关注云+社区

领取腾讯云代金券