在用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 Map<String,String> clientUploadAttachment(Long belongId, String fileSource, MultipartFi ...

  2. shell脚本:行列转换

    Mybatis中写sql,如select,会涉及到一长串列名. `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) COLLATE ut ...

  3. 如何把连接字符串放到App.cfg配置文件中

    首先主Windows程序要添加一个[应用程序配置文件]会在项目中生成一个App.config文件. 在项目中也引用System.Configuration这个引用 当前文档中没有源. 在后台数据类库中 ...

  4. JAVA将数字钱数转换为大写

    1.Java文件的编写 package com.cwai.xtag; import java.util.Scanner; public class Num2Rmb { private String[] ...

  5. Groovy内存机制详解

    groovy每执行一次脚本,都会生成一个脚本的class对象,并new一个InnerLoader去加载这个对象. 所有的脚本都是由GroovyClassLoader加载的,每次加载脚本都会生成一个新的 ...

  6. 阿里巴巴的数据池DRUID

      使用了阿里巴巴的数据池管理: 监控DB池连接和SQL的执行情况 https://github.com/alibaba/druid/wiki/常见问题 https://www.cnblogs.com ...

  7. Java基础——面向对象

    Hello 大家好,我又来啦,今天我们来说说Java的面向对象. 还记得之前去面试几家公司的实习生职位,大部分面试官都问过我有关面向对象 的问题,不知道以后还会不会问,估计是不会了吧...(:3[▓▓ ...

  8. 分析解决 spring quartz 中出现的执行两次问题

    1. 问题描述 在开发询盘功能时,遇到一个需求,就是后台定时任务执行用电施工业务的工单下发. 使用的技术是 spring quartz,因为其他应用有先例,配置quartz 完成后,先写了一个 hel ...

  9. JSP9大内置对象

    JSP9大内置对象 JSP9个内置对象:out对象 用于输出各种数据reuest对象 封装了来自客户端的各种信息response对象 封装了服务器的响应信息exception对象 封装了程序运行过程中 ...

  10. python单继沿用父类属性的两种方法

    方法一 在子类中用父类调用其init方法(不建议) 方法二 在子类中使用super获得父类的方法 class Aaimal(object): type_name = '动物类' def __init_ ...