xingcyx

编码未动,测试先行

常用链接

统计

积分与排名

软件测试

最新评论

通过响应报文判断交易的处理情况

    在LoadRunner脚本的编写过程中,很多时候我们需要通过服务器返回的响应报文来判断交易的处理情况,比如说服务器返回一个xml报文,用<reponse_code></response>字段的值来指明交易处理的结果,如'0000'表示处理成功,其余取值则表示出错。在基于http协议的脚本中,该值可以通过关联的方式来获取,在这里就不多说了。我在这里说的是另外一种情况,即在一些非http协议脚本(如tuxedo协议)中,如何获取这个值呢?
    假设脚本向服务器发送请求的脚本如下:
    ret = lrt_tpcall("EAIHINCSMW",(char *)pFml,0,(char **)&recvBuf,&recvlen,0);
    服务器处理请求后返回:
    <?xml version="1.0" encoding="GBK"?><Transaction><Transaction_Header><tran_response><response_code>2000</response_code><respone_msg>组件处理:组件[SDATA_GetSerialNo]执行失?/respone_msg></tran_response></Transaction_Header><Transaction_Body><response/>
</Transaction_Body></Transaction>
    以上信息保存在recvBuf中。其中<response_code>字段值'2000'就是我们需要用来判断的字段值,那么在后续的脚本中如何获取该值并做相应的判断呢?  
    首先声明两个用于取值的字符串指针和一个表示响应码的字符串:
    char *response1;
    char *response2;
    char response_code[5];

    接下来是取值的方法:
   
   //判断返回结果是否成功:响应码respone_code '0000'表示处理成功。返回码的其余取值表示出错
    response1 = (char *)strstr(recvBuf,"<response_code>");
    response1 =response1 + 15;
    response2 = (char *)strstr(response1,"</response_code>");

    说明:
    strstr()函数的作用是:返回一个字符串在另一个字符串中首次出现的位置到后者末尾的子字符串(大小写敏感)。如果这个函数执行成功,将返回剩余字符串(存在相匹配的字符);如果没有找到相匹配的字符,则返回False。
    因此strstr(recvBuf,"<response_code>");表示查找在recvBuf中查找<response>字符串,并将其后的字符都赋给response1,故response1的值为:“<response_code>2000</response_code><respone_msg>组件处理:组 件[SDATA_GetSerialNo]执行失?/respone_msg></tran_response></Transaction_Header><Transaction_Body><response/>
</Transaction_Body></Transaction>”
    response2的值为:</response_code><respone_msg>组件处理:组 件[SDATA_GetSerialNo]执行失?/respone_msg></tran_response>< /Transaction_Header><Transaction_Body><response/>
</Transaction_Body></Transaction>
   15是“<response_code>”的字符串长度

    最后是判断:
    if(strncmp(response1,"0000",response2-response1)==0)
    {
        //返回码0000,处理成功
         lr_message("Success!");
    }
    else
    {
        //返回码不为0000,处理失败
        lr_message("Fail!");
    }

    说明:strncmp()函数的作用是:比较字符串的前n个字符(大小写敏感)。返回值:
  • 0 – 如果字符串相等
  • <0 – 如果string1小于string2
  • >0 – 如果string1大于string2
    语法:strncmp(string1,string2,length);

    如果想打印返回码,则可以用memcpy函数:
    memcpy(response_code,response1,4);
    lr_error_message("response_code:%s",response_code);

    注:以上代码均是从我的实际工作中选取的例子,其中所使用的方法并不一定是最好的解决方案。如果各位同仁有其它更好的方法或建议,请不吝指教!
   


posted on 2007-11-01 14:53 xingcyx 阅读(348) 评论(6)  编辑  收藏 所属分类: 兵器谱

评论

# re: 通过响应报文判断交易的处理情况[未登录] 2007-11-01 14:58 阳光

这个协议我不太清楚,算了不评价了,不过你的说法很好,有很多时候是不不能直接从LR运行结果中分析结果,需要更深入的去分析  回复  更多评论   

# re: 通过响应报文判断交易的处理情况 2007-11-01 15:58 Zee

Good! Good boy.
  回复  更多评论   

# re: 通过响应报文判断交易的处理情况 2007-11-01 16:09 路过

哥们,帮你顶了!  回复  更多评论   

# re: 通过响应报文判断交易的处理情况 2007-11-01 17:54 ppent

其实你想做的事情就是类似lrs_save_searched_string函数的功能吧?把需要的字符串拿出来再进行相应的处理,是这样吧。
另外,在非http协议脚本中,是否不能用lrs_save_searched_string函数?  回复  更多评论   

# re: 通过响应报文判断交易的处理情况 2007-11-01 20:43 xingcyx

@ppent

我没有用过你说的这个函数,所以不确定是不是可以在非http协议脚本使用,有机会可以在QQ或MSN上和我讨论一下。  回复  更多评论   

# re: 通过响应报文判断交易的处理情况 2007-11-02 11:56 Zee

ppent说的是winsock里的关联函数。
在tuxedo中也有相应的函数,如:lrt_save_parm 、lrt_save_searched_string和lrt_save_searched_string_ext。
因为前面xingcyx说了,可以用关联,而这里他用的是另一种处理方式。
呵呵,绕了一圈实现了关联的功能,也算是练练手了。
  回复  更多评论   




标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-11-01 14:57 编辑过
 
 
相关链接:
网站导航: