1. loadrunner + json说明
使用lr测试json接口,向服务端发送json格式请求,接收处理返回响应数据。
主要用到函数:
1)web_custom_request
2)web_reg_save_param (此函数常用户处理动态参数,该方法在LoadRunner中被称为Correlation(关联))
2. web_custom_request 参数说明
Int web_custom_request (const char *RequestName, <List of Attributes>,[EXTRARES, <List of Resource Attributes>,] LAST );
返回值:
LR_PASS(0)代表成功
LR_FAIL(1)代表失败。
参数:
1、RequestName:步骤的名称,VuGen中树形视图中显示的名称。
2、List of Attribute:支持的属性有以下几种:
1)URL: 页面地址。
2)Method : 页面的提交方式,POST或GET。
3)EncType :编码类型。此参数给出一个内容类型(Content-Type),指定其做为回放脚本时“Content-Type”请求头的值,例如“text/html”。
4)BodyFilePath : 作为请求体传送的文件的路径。
5)UserAgent: 用户代理,它是一个HTTP头的名字,用来标识应用程序,通常是浏览器,它呈现的是用户和服务器的交互。
6)Binary: “Binary=1”表示页面请求体中的每一个以file://x/##形式出现的值(在这里“##”代表2个十六进制数字),都会被替换为单字节的十六进制的值。
7)ContentEncoding: 指定请求体的使用指定的方式(gzip或者deflate)进行编码(例如,压缩),相应的“Content-Encoding:” HTTP头会和此请求一起发送。这个参数适用于web_custom_request和web_submit_data。
8)FtpAscii: “1”使用ASCII模式处理FTP操作;"0" 使用二进制模式。
9)TargetFrame: 当前链接或资源所在Frame的名称。除了Frame的名字,还可以指定下面的参数:
_BLANK:打开一个空窗口。
_PARENT:把最新更改过的的Frame替换为它的上级。
_SELF:替换最新更改过的的Frame。
_TOP:替换整个页面。
10)RecContentType: 录制脚本时响应头的内容类型。例如text/html、 application/x- JavaScript 等。当没有设置Resource属性时,用它来确定目标URL是否是可记录的资源。此属性包含主要的和次要的资源。最频繁使用的类型是 text、application、image。次要的类型根据资源不同变化很多。例如:"RecContentType=text/html":表示html文本。"RecContentType=application/msword":表示当前使用的是Msword。
11)Referer: 当前页面关联的页面。如果已经显式指定了url的地址,此项可以省略。
12)Resource: 指示URL是否属于资源。1 是;0 不是。设置了这个参数后,RecContentType参数被忽略。
13)ResourceByteLimit: web页面下载资源的极限大小。
14)Snapshot: 快照的文件名。
15)Mode: 两种录制级别HTML、HTTP。HTML级别--在当前Web界面上录制直观的HTML动作。以一步步的web_url、web_link、web_image、web_submit_form来录制这些动作。
16)ExtraResBaseDir: 根URL,放在EXTRARES组里。
17)Body: 请求体。不同的应用中,请求体分别通过Body、BodyBinary或者BodyUnicode参数来传递。请求体可以只使用其中一个参数,也可以使用一连串的分开的参数组成多请求体。注意:如果请求体大于100K,会使用一个变量来代替Body参数。变量是在 lrw_custom_body.h中定义的。
18)Raw Body: 请求体是作为指针传递的,此指针指向一串数据。
3、EXTRARES:表明下面的参数将会是List Of Resource Attributes了。
4、LAST :结尾的标示符。
5、List of Resource Attributes
仅仅当Recording Options--Recording --HTML-based script-- Record within the current script step选项被选中时,List of Resource Attributes才会被插入到代码中。Web页面中的非HTML机制产生了资源列表,包含了Javascript, ActiveX, Java applets and Flash所请求的资源。VuGen's 的Recording 选项中,可以设置把这些资源录制在当前的操作中(默认是此设置)还是作为单独的步骤来录制。
3. 具体实例如下(包含发送json,获取响应数据,设置关联、设置检查点):
1/* 2 定义事务: 3 1)用户注册 4 2)用户登录 5 3)用户签到 6 接口为:application/json 7 思路: 8 1)app注册,获到mobile 9 2)使用获取到的mobile登录,获取tokenid和userid。 10 11 参数化:手机号码、设备号 12 */ 13 14Action() 15{ 16 //定义接口url 17 char *Interface_Url; 18 lr_save_string("http://192.168.0.1:8080/action.a","Interface_Url"); 19 20 //注册事务开始 21 lr_start_transaction("用户注册"); 22 lr_rendezvous("register"); 23 24 //检查用户是否注册成功 25 web_reg_find("Search=Body", 26 "Text=createTime", 27 "SaveCount=createTime", 28 LAST); 29 30 //web_set_max_html_param_len("10000000"); 31 32 //获取用户注册后响应数据,并传给mobile 33 web_reg_save_param("mobile", 34 "LB=\"mobile\":\"", //设置左边界 35 "RB=\",", //设置右边界 36 "Ord=1", 37 "Notfound=empty", 38 "Search=Body", 39 LAST); 40 41 web_custom_request("register", 42 "Url={Interface_Url}", //设置url 43 "Method=POST", //设置方法,post或get 44 "Mode=HTTP", 45 "EncType=application/json", //编码类型 46 "RecContentType=application/json", 47 "Body={\"c\":\"1001\",\"p\":{\"code\":\"9051\",\"mobile\":\"{phone}\",\"pwd\":\"123456\",\"model\":\"{model}\",}}", //请求主体,json格式,分号前需要加斜杠 48 LAST); 49 50 lr_vuser_status_message("注册事务,虚拟用户数 #%s",lr_eval_string("{phone}")); 51 lr_end_transaction("用户注册",LR_AUTO); 52 53 //登录事务开始 54 lr_start_transaction("用户登录"); 55 lr_rendezvous("login"); 56 57 web_reg_find("Search=Body", 58 "Text=lastLoginTime", 59 "SaveCount=lastLoginTime", 60 LAST); 61 //获取用户登录后响应数据tokenId,并传给pdl_dynamic_tokenId 62 web_reg_save_param("pdl_dynamic_tokenId", 63 "LB=\"tokenId\":\"", 64 "RB=\"", 65 "Ord=1", 66 "Notfound=empty", 67 "Search=Body", 68 LAST); 69 //从用户登录响应数据中,获取pdl_user_id 70 web_reg_save_param("pdl_user_id", 71 "NotFound=warning", 72 "LB=\"id\":", 73 "RB=,\"inviteCode", 74 "Ord=1", 75 "Search=Body", 76 LAST); 77 web_custom_request("login", 78 "Url={Interface_Url}", 79 "Method=POST", 80 "Mode=HTTP", 81 "EncType=application/json", 82 "RecContentType=application/json", 83 "Body={\"c\":\"1002\",\"p\":{\"mobile\":\"{pdl_mobile}\",\"pwd\":\"123456\"}}", 84 LAST); 85 lr_end_transaction("用户登录",LR_AUTO); 86 87 //用户签到 88 lr_start_transaction("用户签到"); 89 lr_rendezvous("Sign_in"); 90 91 web_reg_find("Search=Body", 92 "Text=signDate", 93 "SaveCount=signDate", 94 LAST); 95 web_custom_request("pdl_Sign_in", 96 "Url={Interface_Url}", 97 "Method=POST", 98 "Mode=HTTP", 99 "EncType=application/json", 100 "RecContentType=application/json", 101 "Body={\"c\":\"1014\",\"p\":{\"userId\":\"{pdl_user_id}\",\"tokenId\":\"{pdl_dynamic_tokenId}\"}}", 102 LAST); 103 lr_end_transaction("用户签到",LR_AUTO); 104 105 return 0; 106}
整合链接: