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


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

    先贴一个脚本:

    完整代码:

    重点代码部分:

    1. Action()
    2. {
    3. web_url("webhp",
    4. "URL=http://www.google.com.hk/webhp?hl=zh-CN&sourceid=cnhp",
    5. "Resource=0",
    6. .....
    7. lr_start_transaction("登陆"); //设置事务开始
    8. web_submit_data("ServiceLoginAuth",
    9. "Action=https://accounts.google.com/ServiceLoginAuth",
    10. "Method=POST",
    11. ........
    12. web_file("web_find","defnngj@gmail.com",LAST); //设置检查点
    13. lr_end_transaction("登陆",LR_AUTO); //设置事务结束
    14. return 0;
    15. }

    如果你想学习性能测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的性能测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386   

    15天学会性能测试,通俗易懂详细教学,Jmeter性能测试实战(集群压测,全链路压测,性能调优,瓶颈分析)极速掌握,干就完事!_哔哩哔哩_bilibili15天学会性能测试,通俗易懂详细教学,Jmeter性能测试实战(集群压测,全链路压测,性能调优,瓶颈分析)极速掌握,干就完事!共计27条视频,包括:1.【性能测试】什么是性能测试以及性能测试的价值和目的、2.【性能测试】真实企业性能测试指标详解以及指标测算、3.【性能测试】真实企业中性能测试流程以及细节剖析等,UP主更多精彩视频,请关注UP账号。icon-default.png?t=N7T8https://www.bilibili.com/video/BV1B14y1D7X9/?spm_id_from=333.337.search-card.all.click 

    上面的一段代码是我录制的一个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  。可以在脚本中根据条件设置事务的状态,例如,根据检查点返回的结果来设置事务为通过还是失败。

    1. if(event == GENERAL_ERROR)
    2. lr_set_transaction_instance_status(LR_FAIL);
    3. lr_end_transaction("登陆",LR_AUTO);

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

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

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

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

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

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

    完整脚本:

    1. Action()
    2. {
    3. double trans_time; //定义变量
    4. web_url("www.baidu.com",
    5. "URL=http://www.baidu.com/",
    6. "Resource=0",
    7. "RecContentType=text/html",
    8. "Referer=",
    9. "Snapshot=t14.inf",
    10. "Mode=HTML",
    11. EXTRARES,
    12. "Url=http://s1.bdstatic.com/r/www/cache/aoyun/img/i-1.0.1.png", ENDITEM,
    13. "Url=/favicon.ico", "Referer=", ENDITEM,
    14. "Url=http://s1.bdstatic.com/r/www/img/bg-1.0.0.gif", ENDITEM,
    15. "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,
    16. "Url=https://passport.baidu.com/favicon.ico", "Referer=", ENDITEM,
    17. LAST);
    18. lr_start_transaction("访问注册页"); //定义事务开始
    19. web_link("???",
    20. "Text=???",
    21. "Ordinal=2",
    22. "Snapshot=t15.inf",
    23. EXTRARES,
    24. "Url=../img/breadbg.gif", "Referer=https://passport.baidu.com/v2/?reg®Type=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM,
    25. "Url=../js/pass_api_reg.js?v=20120711", "Referer=https://passport.baidu.com/v2/?reg®Type=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM,
    26. "Url=../img/v2/regbtn-split.gif", "Referer=https://passport.baidu.com/v2/?reg®Type=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM,
    27. "Url=../cgi-bin/genimage?0013435383780156BF1F30CF18D2332EA927154DCDAB3B6B40F9E25197273F556454857E2FADF7BA23531BE59EEDE0EF92F2F006F8D595B88A907E318D2A249CBAB109FCDB3AB38ED4453F3BC149C6A5FD6240B97D598BA84EE3CEEE3F4359D3469309D88EE55C19B04251D2212171720B476D0A0D6277787DD43D9BA29E426A82BFD90E248FA15A32F1838B3E15D63B8CFE4E3DC6EAD4F23FE0DB457E5AE6B82DACCB79EE9EF289", "Referer=https://passport.baidu.com/v2/?reg®Type=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM,
    28. "Url=../img/v2/reg_input_bg.gif", "Referer=https://passport.baidu.com/v2/?reg®Type=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM,
    29. LAST);
    30. trans_time=lr_get_transaction_wasted_time("访问注册页"); //获得消耗时间
    31. if (trans_time) {
    32. lr_output_message("The duration up to the submit is %f seconds",trans_time); //打印数输出消耗实时间
    33. }else{
    34. lr_output_message("the duration cannot be determined. ");
    35. }
    36. lr_end_transaction("访问注册页",LR_AUTO); //事务结束
    37. return 0;
    38. }

    重点代码部分:

    1. Action()
    2. {
    3. double trans_time; //定义变量
    4. web_url("www.baidu.com",
    5. "URL=http://www.baidu.com/",
    6. .....
    7. lr_start_transaction("访问注册页"); //定义事务开始
    8. web_link("???",
    9. "Text=???",
    10. "Ordinal=2",
    11. "Snapshot=t15.inf",
    12. ......
    13. trans_time=lr_get_transaction_wasted_time("访问注册页"); //获得消耗时间
    14. if (trans_time) {
    15. lr_output_message("The duration up to the submit is %f seconds",trans_time); //打印数输出消耗实时间
    16. }else{
    17. lr_output_message("the duration cannot be determined. ");
    18. }
    19. lr_end_transaction("访问注册页",LR_AUTO); //事务结束
    20. return 0;

    运行结果:

    1. .......
    2. Action.c(39): The duration up to the submit is 0.029588 seconds
    3. Action.c(45): Notify: Transaction "访问注册页" ended with "Pass" status (Duration: 5.0300 Wasted Time: 0.0296).
    4. Ending action Action.
    5. 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插入在事务执行过程的任意位置来计算消耗时间。

  • 相关阅读:
    spring cloud、gradle、父子项目、微服务框架搭建---cloud gateway(十)
    [linux] scp 远程拷贝到本地机器
    SynCoBERT:语法引导的多模态对比预训练用于代码表示。
    花一星期折腾后,我劝你好好考虑下书签同步这个问题
    C++ 值类别(value category)循序渐进(一)值类别是什么
    DeepLearning[花书] 参考资料
    【Mybatis编程:插入和根据id删除相册数据】
    最优化:建模、算法与理论(最优性理论
    SpringCloud和SpringBoot在调Feign传文件时的异常汇总及解决办法
    Java基础之数组
  • 原文地址:https://blog.csdn.net/caixiangting/article/details/134422474