zoukankan      html  css  js  c++  java
  • LoadRunner之自定义HTTP请求

    LoadRunner之自定义HTTP请求

    性能测试开发脚本时使用的都是同样的模式。对在性能测试规划时指定的典型业务逻辑场景进行录制,形成基本的脚本骨架。

    录制脚本后需要对脚本进行编辑,以满足性能测试需求,编辑脚本需要掌握参数化 、关联动态数据、增加逻辑控制等技术。

    如果不能处理好脚本的录制和编辑, 就不可能有效和成功的继续进行性能测试。什么是参数化数据和动态数据呢?

    这些数据都会做为http请求数据的一部分发送到web服务器,但二者肯定是有区别的。

    录制业务逻辑脚本时,生成的脚本包含的是录制期间实际用到的值。

    不做参数化这个脚本仍可以重放,不做关联动态数据,重放脚本就会出现问题。在给系

    统施加压力的时候,同一个脚本会被很多虚拟用户调用执行,应用系统现在都采用各种各样的

    缓存机制设计,不能使用同样的数据,这和应用系统的实际使用环境不一致,这会导致性能测

    试结果不可信。为解决这样的问题我们做参数化,使用参数替换已录制的值。参数化数据也有

    不同的种类,比如登录用户和密码,这些数据必须是系统支持的注册用户,需要从数据库表中

    读取。另一些表单的文本输入框,就可能允许随意输入数据。需要关联的数据是从服务器响应

    中获取的,在以后的请求中发送到服务器的数据。可以通过web_reg_save_parm()这个LR API从

    服务器响应中获取保存动态数据。动态数据通常在删除一些数据或审核后记录进入以后的流程

    环节等情况下出现。

    本篇文档会结合实例对动态数据数组和自定义HTTP请求进行介绍。演示使用的性能测试

    工具是LR8.0,使用的web应用是工具自带的MercuryTours Web系统,版本不一致,可能导致本

    文档中的脚本不能正确运行。Mercury Tours系统功能很简单,提供了航班订票(Flight菜单)

    和取消预订航班(Itinerary菜单)两个功能。需要自己注册,登录系统以使用这些功能。其中,

    取消预订航班的操作步骤为:登录系统-点击Itinerary菜单-选择一条预订的航班记录-点击按钮

    "cancel checked reservations"以取消该航班。如图1:


    现在系统中有五条航班预订记录,按上述操作步骤,录制LR脚本取消一条预订记录,如图2:


    在试图重放该脚本的时候出现会出现问题,如图3:

    我需要对动态数据进行关联。录制脚本的时候取消了一次航班预订,现在有四条记录,

    继续录制一次脚本,并比较两次脚本的action.c文件如图4:


    从图中,可以看出,loadrunner函数web_submit_form()的参数数目竟然是不一样的。其中,
    "Name=1"表示是第几条航班预订记录,"Value=on"表示向服务器发送请求取消对应的航班记录。
    试着删除:"Name=4", "Value=", ENDITEM, 回放脚本这样是成功的。但我们不能每次人
    工干预脚本以使脚本回放成功啊。怎么办?我们只能对LR API函数的参数做参数化或者关联动态

    数据,而在参数数目发生变化的情况下,可以使用HTTP自定义请求函数web_custom_request()

    来替代函数web_submit_form()。这个演示系统是使用Perl开发的,原来没见过这种情况。却也能

    很好的演示web_custom_request()。
    简单介绍一下web_custom_request()的参数TODO。。。。。。
    下面看一下,向服务器发送的请求的Body部分,如图5:


    对应的RecordingLog.txt部分为:

    *** [tid=1a8 Action 33] Sending request to host 192.168.1.101:1080 ( 6/5/2009 00:45:15 )

    "1=on&flightID=1494-796-kz&flightID=1494-1565-kz&flightID=1494-2334-kz&flightID=1494-3103-kz&fl"
    "ightID=1494-3873-kz&.cgifields=1&.cgifields=2&.cgifields=3&.cgifields=4&.cgifields=5&removeFli"
    "ghts.x=122&removeFlights.y=11"

    其中1=on表示向服务器发送请求取消对应的航班记录,removeFlights.x=122&removeFlights.y=11

    记录的是按钮cancel的位置,这个不影响。flightID和.cgifields来自于服务器响应,我们会把这些信息保

    存在一个数组里面,如何判断和操作web_reg_save_parm()参考其他资料,不再叙述。在 web_url("welcome.pl",

    前添加:

    //added by the Tester manually.start:


    int i,ii,k;
    char tmp[32],tmpp[32];
    char str[1024],strr[1024];
    web_reg_save_param("flight_name",
    "LB/IC=
    "RB=">",
    "Ord=ALL",
    LAST);


    web_reg_save_param("cgi_field",
    "LB/IC=
    "RB=">",
    "Ord=ALL",
    LAST);


    //added by the Tester manually.end!


    其中 "Ord=ALL"表示会把所有的复合左右边界的数据保存在数组里面。
    下面对保存的动态数据进行解析,封装成http请求的body部分:

    i = atoi(lr_eval_string("{flight_name_count}"));
    ii=atoi(lr_eval_string("{cgi_field_count}"));


    //lr_error_message("fff %d",ii);
    strcpy(str,"body=1=on&flightID=");
    //lr_error_message("str : %s",str);


    for (k=1;k<=i;k++)
    {
    sprintf(tmp,"{flight_name_%d}",k);
    sprintf(tmpp,"{cgi_field_%d}",k);
    //lr_error_message("str tmp : %s,%s",tmp,lr_eval_string(tmp));
    //lr_save_string(lr_eval_string(tmp),tmpp);
    //lr_error_message("str tmpp : %s",tmpp);

    strcat(str, lr_eval_string(tmp));
    strcat(str,"&flightID=");
    strcat(strr,"&.cgifields=");
    strcat(strr, lr_eval_string(tmpp));
    //lr_error_message("str 2 : %s",str);
    //lr_error_message("str 22 : %s",strr);
    }
    strcat(str,strr);
    strcat(str,"&removeFlights.x=122&removeFlights.y=11");
    //lr_error_message("str 2 : %s",str);
    lr_output_message(str);
    //return 0;


    我们需要自定义http请求函数为:
    web_custom_request("itinerary.pl",
    "Method=POST",
    "URL=http://192.168.1.101:1080/MercuryWebTours/itinerary.pl",
    "RecContentType=text/xml",
    "Snapshot=t4.inf",
    str,
    LAST);

    现在我们再进行回放该脚本就不会出现问题了。脚本回放成功,我们的文字也
    到此就结束了,我们不再对该脚本进行场景调度,已经分析性能测试运行的结果。我们的
    目的只是演示动态数据数组的保存、使用及http自定义请求函数web_custom_request()。

  • 相关阅读:
    oralce 10g(10.2.0.1) 冷备份从64位恢复到32位
    Java反序列化漏洞总结
    正则表达式优化总结
    机器学习笔记(持续更新)
    Java反序列化漏洞分析
    ThinkPHP5 远程命令执行漏洞分析
    Joomla对象注入漏洞分析
    crontab一句话后门分析
    WeCenter3.1.7 blind xxe 分析
    Redis Getshell总结
  • 原文地址:https://www.cnblogs.com/qmfsun/p/4900169.html
Copyright © 2011-2022 走看看