在用LR对公司delphi开发的C/S程序进行测试时,发现只有选择socket协议可以录制代码,经研究是通过TCP/IP的方式将参数保存在buffer中发送的方式来完成操作,但由于将buffer内容参数化后请求无响应,需要开发封装流程中的dll,也无法满足要求,而暂停。现发现前辈写的一篇文章,有说明解决方案,即转载:
 
http://www.51testing.com/html/34/369434-827920.html
  在公司的产品基本的功能测试做的差不多了之后,该做性能测试了,但发现一个问题,因为产品是属于嵌入式的产品终端的和B/S架构的软件结合使用的,而软件使用最容易造成瓶颈的地方不是系统B/S架构部分,而是在来源于终端对前置服务器和数据处理中心的压力。
   我们又不可能有那么多的终端来同时产生压力,终端软件又是运行于ARM平台上的,连录制脚本的机会都没有。于是找终端开发的人员进行了了解,从他们那里了解到这边终端和前置服务器的连接采用的是tcp/ip协议进行通信。通过查找资料,发现我们LR的windows sockets协议可以模拟tcp/ip协议和前置服务器进行数据交互,这样便可以模拟终端来进行性能测试了。
   还好几大中心集成测试的时候都是让开发给了他们的设计文档,对各个模块通信的数据格式还是比较了解,开着抓包工具,很快抓到了他们通信的数据包。
   根据资料将数据分别填写到脚本中
user_init部分
/*********************************************************************
 * Created by Mercury Interactive Windows Sockets Recorder
 *
 * Created on: Thu Jul 05 14:19:06
 *********************************************************************/
#include "lrs.h"
 
vuser_init()
{
    lrs_startup(257);
    lrs_create_socket("<socketName>", "TCP", "LocalHost=0","RemoteHost=192.168.1.9:9999",  LrsLastArg);//选择协议方式,接收数据的前置服务器IP:端口 与服务器建立socket连接。
 
 
    return 0;
}
****************************************************************
//action 部分
 
Action()
{
    lrs_send("<socketName>", "buf5", LrsLastArg);//发送buf5中的数据到服务器,开始公话认证
    return 0;
}
*************************************************************** //user_end 部分
 
vuser_end()
{
    lrs_cleanup();//断开建立的TPC连接
    return 0;
}
 
****************************************************************
//data.ws 部分
 
;WSRData 2 1
 
send buf5   44  //定义发送的内容变量buf5和信息的长度
"\xaa\x00\x1c\x00\x00\x00\x00\x00\xca\x10\x05\x00\x07\x00\x00\xac\x00\x00\x00\xd3\x00\x00\x00\x34\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x27\xfb\x1f\xee"//因为发送数据为16进制所以每个数据字段前需要添加\x 
   弄好脚本后dubug了几次发现都能收到前置服务器的回应,但现在又面临了其他问题,如果每次发送的费用流水到数据处理中心都一样的话,数据处理中心会认为是重复流水,并不会进入数据处理流程进行处理。
    这样就需要我们自己来生成发送的数据,除开消息的报文头,经历过一系列操作的随机变量转为16进制后,发送到前置竟然得不到回复信息了。检查了多次消息格式都是正确,找来开发的同事一问结果消息中还有信息的验证字段。因为生成的信息格式虽然正确但是效验不过,被认为是出错的数据包,前置服务器直接将数据包丢弃。又调用了他们的生成验证字段的dll生成效验字段后总算再次得到了回复,经过dba修改存储过程中对数据的效验后跑通了整个流程。
 
   开启性能测试后对多个节点进行了跟踪,发现前置服务器这里收到数据后一段时间后不在对我们的消息进行回复,然后就前置就崩溃了,进过分析发现,前置服务器,因为数据处理中心接收处理数据缓慢,将数据都堆积到了缓存中,结果数据太多后,内存溢出程序崩溃。
  最后在接收中心和处理中心分别添加缓存机制,数据处理中心先将数据接收过来在由另外的线程进行处理,同时前置将数据进行打包发送,不在一条一条的进行发送后,在进行压力测试,前置服务器崩溃的问题虽然解决了,但数据处理中心调用存储过程来处理数据依然缓慢,达不到系统的业务需求,又增加数据处理线程,几经周折终于达标了。
   性能测试,想说爱你不容易啊。

转载:http://www.51testing.com/html/95/391095-3718632.html

使用LR的socket协议进行进行性能测试,转解决方案的更多相关文章

  1. Loadrunner socket协议lrs_receive函数接收到返回数据包 仍然等待服务器返回--解决

    前段时间在使用loadrunner socket协议发送数据包到到服务器,使用lrs_receive接收服务器应答数据包,已经接收到数据包,但LR仍然在等待服务器端返回,而且日志打印显示每次接收返回都 ...

  2. 性能测试基础-SOCKET协议用例

    1.首先在进行性能测试的时候,我们要了解软件的通信协议是什么,我们使用什么协议,如何去模拟.SOCKET协议主要应用于在C/S模式的系统. 作者本人已当初做过的C/S架构的系统做的脚本录制,在上面做脚 ...

  3. LR socket协议脚本

    socket协议分为TCP.UDP两种(区别与联系在此不做赘述),一种为长连接.一种为短连接.如果创建连接时在init中对应关闭连接在end中,则为长连接:如果创建关闭连接都是在action则为短连接 ...

  4. 自行控制loadrunner的socket协议性能测试 (转)

    一前言 二任务的提出 三实现方案讨论 四技术要点讲解 如何开始录制一个最简单的收发数据包脚本 写日志文件 一行一行读数据包文件 字符串转换为十六进制数据包 发送自己定义的数据包 接收数据包到自定义缓冲 ...

  5. LoadRunner编写Socket协议脚本方法

    本文主要介绍使用LoadRunner手工编写Windows Socket协议测试脚本的方法. 通过LoadRunner编写Windows Socket协议测试脚本,总体说来,比较简单.就像把大象放进冰 ...

  6. Loadrunner 中socket协议RecvBuffer接收到数据长度为空

    socket通讯,有两种方式,一种是建立长连接(TCP),建立后,不停的发送,接收.另外一种是建立短连接(UDP),建立连接,发送报文,接收响应,关闭连接.两种方式 server的开销不同. 今天出现 ...

  7. loadrunner socket协议问题归纳(3)

    摘要:通过实例讲解loadrunner中的socket协议性能测试的一种测试方法,如何不依赖loadrunner既定规则,自行控制收发数据包 关键词:Loadrunner,socket,自行控制,收发 ...

  8. LR回放https协议脚本失败:[GENERAL_MSG_CAT_SSL_ERROR]connect to host "XXX" failed:[10054] Connection reset by peer [MsgId:MERR-27780]

    最近做一个负载均衡项目的性能测试,使用LR录制脚本协议为https协议,回放脚本时出现报错: [GENERAL_MSG_CAT_SSL_ERROR]connect to host "XXX& ...

  9. Socket协议

    Socket协议的形象描述 socket的英文原义是"孔"或"插座".在这里作为4BDS UNIX的进程通信机制,取后一种意思.socket非常类似于电话插座. ...

随机推荐

  1. java数据结构---------插入排序的实现

    插入排序分为直接插入排序和希尔排序 插入排序 实现方法 //插入排序,按从小到大的顺序 public static void insertSort(int[] array){ int j,temp = ...

  2. 微软URLRewriter.dll的url重写的简单使用

    1.先下载MSDNURLRewriting.zip包,打开代码生成URLRewriter.dll文件: 2.将URLRewriter.dll文件引用到项目中: 3.在web.config文件中  &l ...

  3. c之指针与数组(2)Dynamic Data Structures: Malloc and Free--转载

    http://www.howstuffworks.com/c29.htm http://computer.howstuffworks.com/c.htm Dynamic Data Structures ...

  4. C/C++编码规范

    C/C++编码规范 今天人们越来越明白软件设计更多地是一种工程,而不是一种个人艺术.由于大型产品的开发通常由很多的人协同作战,如果不统一编程规范,最终合到一起的程序,其可读性将较差,这不仅给代码的理解 ...

  5. CentOS7下Rsync+sersync实现数据实时同步

    近期公司要上线新项目,后台框架选型我选择当前较为流行的laravel,运行环境使用lnmp. 之前我这边项目tp32+apache,开发工具使用phpstorm. 新建/编辑文件通过phpstorm配 ...

  6. 编译可移植的python

    1. 在低版本系统机器上,编译python: cd Python-2.7.15/Modules vim Setup.dist 修改下述代码: ########### sed -i 's/#SSL=\/ ...

  7. jQuery Ajax实例 ($.ajax_$.post_$.get)

    Jquery在异步提交方面封装的很好,直接用AJAX非常麻烦,Jquery大大简化了我们的操作,不用考虑浏览器的诧异了. $.post.$.get是一些简单的方法,如果要处理复杂的逻辑,还是需要用到j ...

  8. KnockoutJS Select 标签 Options绑定

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  9. org.apache.commons.lang.StringUtils

    org.apache.commons.lang.StringUtils 作为jdk中lang包的补充 检查CharSequence是否为空,null或者空格 CharSequence (CharBuf ...

  10. mybatis 排坑记录

    1. mapper xml resultMap 中定义 property 时不能出现空格 否则会出现反射错误,找不到 do 对应的 set 方法