LoadRunner脚本编写之三(事务函数)

关于脚本的这块,前两篇都在讲C语言,其实,要整理点实用的东西挺难,在应用中多对录制的脚本分析,但对于新手学脚本确实无从下手。

  先贴一个脚本:

  重点代码部分:


Action()
{

    web_url("webhp",
        "URL=http://www.google.com.hk/webhp?hl=zh-CN&sourceid=cnhp",
        "Resource=0",
      .....
    lr_start_transaction("登陆");    //设置事务开始

    web_submit_data("ServiceLoginAuth",
        "Action=https://accounts.google.com/ServiceLoginAuth",
        "Method=POST",      
   ........

    web_file("web_find","defnngj@gmail.com",LAST);  //设置检查点

    lr_end_transaction("登陆",LR_AUTO);    //设置事务结束

    return 0;
}

  上面的一段代码是我录制的一个google登录的过程,详细过程描述:

  1、进入google首页

  2、点击右上角的登录链接,跳转到登录页面

  3、设置登录事务开始,输入用户名密码,点击登录

  4、登录成功后跳转后google 首页,右上角出现登录的用户名,设置事务结束。

  检查点

  在上面的操作中,我设置了一个检查点,web_fiind ,判断后我是否登录成功一个重点的标志是在google首页右上角是否出现我的用户名。所以,我根据这个特点设置检查点,来检查登录是否成功。设置检查点的函数有三个,

  web_find()函数:在页面中查找相应内容

  web_reg_find()函数:在缓存中查打相应的内容

  web_image_check()函数:在页面中查找具体图片。

  他们的具体用法,你们可以在脚本的编写中,光标定位在函数中,按F1 查看帮助文档或参考其它文档。

  关于脚本中的事务

  我们在一个脚本中可能要做很多操作,我们为了分清脚本中某一段代码具体是做什么,所以,在执行某个操作的前后需要添加事务,用来标志事务的开始与结束,这样可以使脚本更清晰。当然,对于不同的事务需要分开录制。比如,某电子商务网站的浏览商品与交易。他们的比例是不同的,对于比较复杂的场景,是多个事务按不同的比例并行的。设置80%的用户浏览商品,20%的用户进行交易。

  当然,事务与事务之间是会有依赖关系的。如果我们把访问首页定为一个事务,登录定为一个事务,浏览商品定为一个事务,交易定为一个事务。那么我们要想录制(编写)交易的事务,那么前面三个事务是先觉条件。所以,我们知道录制一个脚本的目的是哪个操作,然后在其前后添加事务标识。

  对80%的用户浏览商品,20%用户交易,交易的前提是先浏览一个商品,也就是所有用户(100%)都浏览了商品,只有20%的用户去交易。这样是合乎逻辑的。

  事务函数

  在上面的脚本中我们用到了lr_start_transaction()函数和 lr_end_transaction()函数来标识一个事务的开始与结束,除些之外,loadrunner还提供了许多与事务相关的函数,这里介绍几个常用的。

  1、lr_set_transaction_instance_status 用于设置事务的状态,事务的状态包括:LR_PASS、 LR_FAIL 、  LR_AUTO 、  LR_STOP  。可以在脚本中根据条件设置事务的状态,例如,根据检查点返回的结果来设置事务为通过还是失败。

if(event == GENERAL_ERROR)
        lr_set_transaction_instance_status(LR_FAIL);
    lr_end_transaction("登陆",LR_AUTO);

  2、lr_fail_trans_with_error与lr_set_transaction_instance_status 类似,都可以用于设置事务的状态,区别在于lr_fail_trans_with_error除了可以设置的状态,还可以输出错误日志信息。

if(status != SUCCESS)
        lr_fail_trans_with_error("an error has occurred:%s",my_get_error_string(status));
    lr_end_transaction("登陆成功",LR_AUTO);

  3、lr_get_transaction_status与前两个函数的作用相反,用于获取事务的状态。

if (lr_get_transaction_status() == LR_FAIL)
    {
        //由于web_url请求失败了,所以没有必要继续执行下去,因些设置事务状态为FAIL
        lr_end_transaction("登陆失败",LR_FAIL);
        return;
    }

  4、lr_get_transaction_duration 用于获取事务所消耗的时间。这个就比较有意思了。

  我们登录百度首页,插入一个事务,然后访问百度注册页面。下面计算访问注册页面的时间。

  完整脚本:


Action()
{
    double trans_time;  //定义变量

    web_url("www.baidu.com", 
        "URL=http://www.baidu.com/", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=", 
        "Snapshot=t14.inf", 
        "Mode=HTML", 
        EXTRARES, 
        "Url=http://s1.bdstatic.com/r/www/cache/aoyun/img/i-1.0.1.png", ENDITEM, 
        "Url=/favicon.ico", "Referer=", ENDITEM, 
        "Url=http://s1.bdstatic.com/r/www/img/bg-1.0.0.gif", ENDITEM, 
        "Url=http://nsclick.baidu.com/v.gif?pid=201&pj=www&rsv_sid=1289_1328_1262_1228_1344_1342_1186_1281_1178_1287_1320_1294_1330&fm=behs&tab=tj_reg&un=&path=http%3A%2F%2Fwww.baidu.com%2F&t=1343538345708", ENDITEM, 
        "Url=https://passport.baidu.com/favicon.ico", "Referer=", ENDITEM, 
        LAST);

    lr_start_transaction("访问注册页");  //定义事务开始

    web_link("???", 
        "Text=???", 
        "Ordinal=2", 
        "Snapshot=t15.inf", 
        EXTRARES, 
        "Url=../img/breadbg.gif", "Referer=https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM, 
        "Url=../js/pass_api_reg.js?v=20120711", "Referer=https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM, 
        "Url=../img/v2/regbtn-split.gif", "Referer=https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM, 
        "Url=../cgi-bin/genimage?0013435383780156BF1F30CF18D2332EA927154DCDAB3B6B40F9E25197273F556454857E2FADF7BA23531BE59EEDE0EF92F2F006F8D595B88A907E318D2A249CBAB109FCDB3AB38ED4453F3BC149C6A5FD6240B97D598BA84EE3CEEE3F4359D3469309D88EE55C19B04251D2212171720B476D0A0D6277787DD43D9BA29E426A82BFD90E248FA15A32F1838B3E15D63B8CFE4E3DC6EAD4F23FE0DB457E5AE6B82DACCB79EE9EF289", "Referer=https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM, 
        "Url=../img/v2/reg_input_bg.gif", "Referer=https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM, 
        LAST);

    trans_time=lr_get_transaction_wasted_time("访问注册页");  //获得消耗时间

    if (trans_time) {
        lr_output_message("The duration up to the submit is %f seconds",trans_time);  //打印数输出消耗实时间
    }else{
        lr_output_message("the duration cannot be determined. ");
    }

    lr_end_transaction("访问注册页",LR_AUTO);  //事务结束

    return 0;
}

  重点代码部分:


Action()
{
    double trans_time;  //定义变量

    web_url("www.baidu.com", 
        "URL=http://www.baidu.com/", 
       .....

    lr_start_transaction("访问注册页");  //定义事务开始

    web_link("???", 
        "Text=???", 
        "Ordinal=2", 
        "Snapshot=t15.inf", 
     ......

    trans_time=lr_get_transaction_wasted_time("访问注册页");  //获得消耗时间

    if (trans_time) {
        lr_output_message("The duration up to the submit is %f seconds",trans_time);  //打印数输出消耗实时间
    }else{
        lr_output_message("the duration cannot be determined. ");
    }

    lr_end_transaction("访问注册页",LR_AUTO);  //事务结束

    return 0;
}

  运行结果:

.......
Action.c(39): The duration up to the submit is 0.029588 seconds
Action.c(45): Notify: Transaction "访问注册页" ended with "Pass" status (Duration: 5.0300 Wasted Time: 0.0296).
Ending action Action.
Ending iteration 1.

  39行:持续时间长达0.029588秒的提交

  45行:通知:交易”访问注册页”结束,“通过”状态(持续时间:5.0300 浪费时间:0.0296)。

  从上面的结果中发现,我们设置lr_get_transaction_wasted_time函数的时间0.029588 与事务结束浪费的时间 0.0296 非常接近。 这是因为我把 lr_get_transaction_wasted_time函数插入在了事务结果的前面,其实,我们可以将lr_get_transaction_wasted_time插入在事务执行过程的任意位置来计算消耗时间。

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-12-30 10:28:34

LoadRunner脚本编写之三(事务函数)的相关文章

LoadRunner脚本编写(二)

今天有朋友问我,关于loadrunner脚本编第二篇什么时候写,我告诉他都没什么东西了.要学习一门语言,基本的语法和思想很重要.现在每个人都识字,那是不是每个识字的人都可以当作家.不可能,因为大多数人没有作家的思想.编程是一门艺术,我们可以把代码写得很优美,而中国的程序员为什么叫代码工人呢?国为国外的程序员在写一篇优美的"散文",中国的程序员在写"说明文".中国的程序员只是根据需求把一个产品通过语言描述清楚. 扯远了,最近变啰嗦了,呵呵!我想表达的意思就是行编程基本

LoadRunner脚本编写之二

今天有朋友问我,关于loadrunner脚 本编第二篇什么时候写,我告诉他都没什么东西了.要学习一门语言,基本的语法和思想很重要.现在每个人都识字,那是不是每个识字的人都可以当作家.不可 能,因为大多数人没有作家的思想.编程是一门艺术,我们可以把代码写得很优美,而中国的程序员为什么叫代码工人呢?国为国外的程序员在写一篇优美的"散 文",中国的程序员在写"说明文".中国的程序员只是根据需求把一个产品通过语言描述清楚. 扯远了,最近变啰嗦了,呵呵!我想表达的意思就是行编

LoadRunner脚本编写(一)

性能测试工程师要懂代码么?答案是必须的.好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不多了.还有非计算机专业出身的测试员,所以对代码望都比较望而生畏. 好多人认为loadrunner只支持C语言(包括我之前也一直这么认为),因为loadrunner默认的脚本是C语言的,其实它支持目前所有主流的语言,如:Java User.VB User.VB script User .Javascript User.Mmicroso

LoadRunner脚本编写之一

性能测试工程师要懂代码么?答案是必须的.好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不多了.还有非计算机专业出身的测试员,所以对代码望都比较望而生畏. 好多人认为loadrunner只支持C语言(包括我之前也一直这么认为),因为loadrunner默认的脚本是C语言的,其实它支持目前所有主流的语言,如:Java User.VB User.VB script User .Javascript User.Mmicroso

《LoadRunner性能测试巧匠训练营》——2.4 脚本编写实战

2.4 脚本编写实战 知识的学习都是从易到难的,所以小白选择了最简单的场景.以提前注册好的用户名besttest,密码123123完成登录.退出的业务.别小看这么简单的场景,也许你也和小白一样遇到了不少问题呢. 通过"开始"菜单下的HP LoadRunner →Application→Virtual User Generator打开并新建一个空白的Web(HTTP/HTML)协议的脚本,首次会出现Task视图界面,如图2-8所示. 初学者可按照图2-8中的步骤学习.因为这里不使用此视图

《精通软件性能测试与LoadRunner最佳实战》—第2章2.5节 测试脚本编写

2.5 测试脚本编写精通软件性能测试与LoadRunner最佳实战性能测试用例编写完成以后,接下来就需要结合用例的需要,进行测试脚本的编写工作.本书后面章节将讲述了有关LoadRunner协议选择和脚本编写的一些知识,如果您还不是特别清楚,请参见第3-6章内容.关于测试脚本的编写在这里着重强调以下几点. (1)协议的正确选用,关系到脚本是否能够正确录制与执行,十分重要.因此在进行程序的性能测试之前,测试人员必须弄清楚,被测试程序使用的是什么协议. (2)测试脚本不仅可以使用性能测试工具来完成,在

LoadRunner 技巧之 添加事务

事务(Transaction)用于模拟用户的一个相对完整的.有意义的业务操作过程,例如登录.查询.交易.转账,这些都可以作为事务,而一般不会把每次HTTP请求作为一个事务. 拿笔者所测试的邮箱系统为例,对于邮箱来说更基本且用户使用最多的应用就是收发邮件功能,我们可以拿发邮件看作一个事务:打开写信页,填写收件人,主题,内容,点击发信.在做性能需求分析的时候也就是把系统的业务抽离出来,在性能脚本中用事务来描述. 我们在录制脚本的过程中,可以通过录制面板的事务按钮来添加事务.   同样以loadrun

LoadRunner 技巧之添加事务

事务(Transaction)用于模拟用户的一个相对完整的.有意义的业务操作过程,例如登录.查询.交易.转账,这些都可以作为事务,而一般不会把每次HTTP请求作为一个事务. 拿笔者所测试的邮箱系统为例,对于邮箱来说更基本且用户使用最多的应用就是收发邮件功能,我们可以拿发邮件看作一个事务:打开写信页,填写收件人,主题,内容,点击发信.在做性能需求分析的时候也就是把系统的业务抽离出来,在性能脚本中用事务来描述. 我们在录制脚本的过程中,可以通过录制面板的事务按钮来添加事务. 同样以loadrunne

用 PHP 开发健壮的代码(三):编写可重用函数

函数 在本系列文章(有关如何在实际情况下开发有效的 PHP 代码)的第 3 部分中,Amol Hatwar 讨论了如何构建最有效的功能型函数,使用这些函数不会牺牲太多性能或可管理性.作者重点阐述了如何编写可重用函数,并介绍了如何避免与该任务相关的一些最常见问题.欢迎回来.在本系列文章的第 1 部分中,我讨论了一些基本的 PHP 设计规则,并介绍了如何编写安全.简单.与平台无关且快速的代码.在第 2 部分中,我介绍了变量,并讨论了它们在 PHP 编码中的用法 - 好的和坏的实践. 在本文中,您将了