大话人生

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  299 随笔 :: 0 文章 :: 73 评论 :: 0 Trackbacks
一、loadrunner脚本创建
1.Insert - New step - 选择 Custom Request - web_custom_request
2.填入相应参数
LoadRunner模拟Json请求
3.生成脚本,并修改如下(参数中的引号"前需要加斜杠\转译)
Action()
{
  web_custom_request("web_custom_request",
  "URL=http://urlhead/CpcService.ashx?Method=checkXXXed",
  "Method=POST",
  "Resource=0",
  "RecContentType=application/json",
  "Referer=",
  "Mode=HTTP",
      "EncType=application/json",
  "Body={\"user\":{\"uid\":\"C8-9C-DC-70-BD-B2\"}}",
  LAST);
  return 0;
}
4.捕获页面返回值
返回格式{"IsError":0,"ErrorMsg":"","user_tags":["0"]}

将光标移动到脚本顶部,插入关联点insert-new step-service-web_reg_save_param

LoadRunner模拟Json请求

在脚本顶部,插入并修改脚本如下

      web_reg_save_param("user_tags",

                         "LB=user_tags\":[\"",

                         "RB=\"]}",

                         LAST);


在脚本尾部,加入输出日志验证是否获取成功

lr_message ("user_tags:%s", lr_eval_string("{user_tags}"));

5.对我们的接口做自动化功能测试,写验证脚本如下
if (atoi(lr_eval_string("{user_tags}"))==0) 
   lr_output_message("user_tags:%s,succeed!",(lr_eval_string("{user_tags}")));
else if(atoi(lr_eval_string("{user_tags}"))==1)
   lr_output_message("user_tags:%s,failed!",(lr_eval_string("{user_tags}")));
else 
   lr_output_message("user_tags:%s,unknow!",(lr_eval_string("{user_tags}")));
6.参数化脚本,
LoadRunner模拟Json请求
运行脚本,重要日志输出如下:
Action.c(24): [C8-9C-DC-70-BD-B2]0,succeed!
Action.c(26): [C8-9C-DC-70-BD-B3]1,failed!
---------------------------------------END---------------------------------------
二、web_custom_request和web_submit_data区别
web_custom_request方法可以发送POST和GET类型的请求
web_submit_data只能发送POST类型的请求
所有web_submit_data方法发送的请求都可以使用web_custom_request来实现
1. web_submit_data
请求中提交的数据格式:“Name=属性名称,”,“Value=属性值”
例如 
 “Name=username”, “Value=12044″, ENDITEM,
如果我们想提交的某个属性包含包含多个值(比如说批量删除),它就无法处理了,只能通过多个web_submit_data来处理。
2. web_custom_request
提交的数据(body)格式:“Body=属性名称=属性值&属性名称=属性值&……”
例如:
3. web_custom_request 函数详解
A.语法:
Int web_custom_request (const char *RequestName, 
                        <List of Attributes>,
                        [EXTRARES, <List of Resource Attributes>,] 
                        LAST );

B.返回值:返回LR_PASS(0)代表成功,LR_FAIL(1)代表失败。
C.参数:
(1)RequestName:步骤的名称,VuGen中树形视图中显示的名称。
(2)List of Attribute:属性列表,支持的属性有以下几种:
a.URL:页面地址。
b.Method :页面的提交方式,POST或GET。
c.TargetFrame:当前链接或资源所在Frame的名称。
除了Frame的名字,还可以指定下面的参数:
    _BLANK:打开一个空窗口。
    _PARENT:把最新更改过的的Frame替换为它的上级。
    _SELF:替换最新更改过的的Frame。
    _TOP:替换整个页面。
d.EncType:编码类型。
e.RecContentType录制脚本时响应头的内容类型。
例如text/html,application/x-javascript,application/json等。
当没有设置Resource属性时,用它来确定目标URL是否是可记录的资源。此属性包含主要的和次要的资源。
最频繁使用的类型是 text、application、image。次要的类型根据资源不同变化很多。例如:"RecContentType=text/html":表示 html文本。"RecContentType=application/msword":表示当前使用的是Msword。
f.Resource:指示URL是否属于资源。1 是;0 不是。设置了这个参数后,RecContentType参数被忽略。
“Resource=1”,意味着当前操作与所在脚本的成功与否关系不大。在下载资源时如果发生错误,是当作警告而不是错误来处理的;URL是否被下载受“Run-Time Setting—Browser Emulation--Download non-HTML resources” 这个选项的影响。此操作的响应信息是不做为HTML来解析的。
“Resource=0”,表明此URL是重要的,不受发送请求(RTS)的影响,在需要时也会解析它。

g.ResourceByteLimit:web页面下载资源的极限大小。当达到设置的极限后,无法下载其他资源。仅仅对需要下载的资源有效。
下载过程:如果总计下载大小小于极限值,则正常开始下载。如果当下载时达到了设置的极限值,资源大小可知(在HTTP响应头中指定了Content- Length),这中情况下,如果只需要一个缓冲区,那么下载可以正常完成。如果需要的不止一个缓冲区,或者资源大小不可知,下载就会中断同时关闭当前连 接。
这个特性可以用来模拟用户不等待一个页面下载完成时导航到另一个页面的情况。
ResourceByteLimit 在HTTP模式中无法使用,在Concurrent Groups(Vuser脚本中的一个区,此区中的所有函数并发执行)区中也无法使用。仅仅适用于Sockets的回放,WinInet也是不适用的
h.Snapshot:快照的文件名,关联时使用。
i.Mode:两种录制级别HTML、HTTP。
HTML级别:在当前Web界面上录制直观的HTML动作。以一步步的web_url、web_link、web_image、web_submit_form来录制这些动作。VuGen仅仅录制返回HTML页面的请求,不处理脚本和应用程序。
HTTP级别:VuGen把所有的请求录制为web_url指令,不生成web_link、web_image、web_submit_form这些函数。这种方法更为灵活,但是生成的脚本不够直观。
j.Body:请求体。(目前仅适用与web_custom_request函数)
不同的应用中,请求体分别通过Body、BodyBinary或者BodyUnicode参数来传递。请求体可以只使用其中一个参数,也可以使用一连串的分开的参数组成多请求体。
k.RAW BODY:参见List of Attributes的同名参数。
l. BodyFilePath:作为请求体传送的文件的路径。它不能与下面的属性一起使用:Body,或者其他Body属性或Raw Body属性包括BodyBinary,BodyUnicode, RAW_BODY_START或Binary=1。
m.Binary:
“Binary=1”表示页面请求体中的每一个以file://x/##形式出现的值(在这里“##”代表2个十六进制数字),都会被替换为单字节的十六进制的值。
如果“Binary=0”(默认值),所有的字符序列只是按照字面的值传递。
需要注意双斜杠的用法。在C编译器中双斜杠被解释为单斜杠。如果不需要零字节,单斜杠可以在Binary不等于1的情况下使用(例如,使用\x20代替file://x20/)。如果需要零字节,那么只能使用file://x00/且设置 “Binary=1”,\x00在逻辑上会被截断。
n.ContentEncoding
指定请求体的使用指定的方式(gzip或者deflate)进行编码(例如,压缩),相应的“Content-Encoding:” HTTP头会和此请求一起发送。这个参数适用于web_custom_request和web_submit_data。
o.Referer:当前页面关联的页面。如果已经显式指定了url的地址,此项可以省略。

p.ExtraResBaseDir:
(目前仅适用与web_custom_request函数):根URL,放在EXTRARES组里。它是用来解析相对URL的(译者加:类似于Windows的相对路径和绝对路径)。
URL可以是绝对路径(例如http://weather.abc.com/weather/forecast.jsp?locCode=LFPO),也可以是相对路径(例如“forecast.jsp?locCode=LFPO”)。
真正的URL的下载是通过绝对路径进行的,所以相对URL路径必须使用根路径URL去解析。例如,使用http://weather.abc.com /weather/做为根路径来解析“forecast.jsp?locCode=LFPO”,最后的URL是:http: //weather.abc.com/weather/forecast.jsp?locCode=LFPO。如果没有指定 “ExtraResBaseDir”,默认的根URL是主页面的URL。
q.UserAgent:用户代理,它是一个HTTP头的名字,用来标识应用程序,通常是浏览器,它呈现的是用户和服务器的交互。
(3)EXTRARES:表明下面的参数将会是List Of Resource Attributes了。 
(4)LAST :结尾的标示符。
-------------------------------------------------------------
附:测试页面
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title></title>
    <script src="http://img.m18.com/web/j/lib/jquery-1.3.2.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function() {
           $.ajax({
           type: "POST",
           contentType: "application/json",
            url: "http://url.com/mkt/CpcService.ashx?Method=checkhasactivated",
            data: '{"user":{"uid":"C8-9C-DC-70-BD-B2"}}',
            success: function(msg) {
                alert("Data Saved: " + msg);
            }
           });
        })
    </script>
</head>
<body>
</body>
</html>
-----------------------------------------------------------
web_reg_save_param("user_tags",
"LB=user_tags\":[\"",
"RB=\"]}",
LAST);
web_custom_request("web_custom_request",
"URL=http://XXX/CpcService.ashx?Method=checkXXXed",
"Method=POST",
"Resource=1",
"RecContentType=application/json",
"Referer=",
"Mode=HTTP",
      "EncType=application/json",
"Body={\"user\":{\"uid\":\"{mac}\"}}",
LAST);
    //lr_message ("user_tags:%s", lr_eval_string("{user_tags}"));
    if (atoi(lr_eval_string("{user_tags}"))==0) 
lr_output_message("[%s]%s,succeed!",(lr_eval_string("{mac}")),(lr_eval_string("{user_tags}")));
else if(atoi(lr_eval_string("{user_tags}"))==1)
lr_output_message("[%s]%s,failed!",(lr_eval_string("{mac}")),(lr_eval_string("{user_tags}")));
else 
lr_output_message("[%s]%s,unknow!",(lr_eval_string("{mac}")),(lr_eval_string("{user_tags}")));
-----------------------------------------------------------
posted on 2013-12-13 15:30 大话人生 阅读(665) 评论(0)  编辑 收藏 引用 所属分类: 性能测试
只有注册用户登录后才能发表评论。