在用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. R语言函数

    函数是一个组织在一起的一组以执行特定任务的语句.R语言有大量的内置函数,用户也可以创建自己的函数. 在R语言中的函数是一个对象,所以R语言解释器为能够通过控制到该函数,带有参数可能是函数必要完成的操作 ...

  2. flush table with read lock的轻量级解决方案

    为什么要使用FTWRL   MySQL dba在日常工作中,数据备份绝对是工作频度最高的工作内容之一.当你使用逻辑方式进行备份(mydumper,mysqldump)或物理方式进行备份(percona ...

  3. 最全的HTTP 响应状态码列表!

    摘要: HTTP状态码,我们要学会现查现用能记住最好. 简单举例几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.如果是做AJAX,RE ...

  4. 最简单的java多线程代码(重写thread或者runnable的run方法)

    http://blog.csdn.net/testcs_dn/article/details/42526549 java线程使用示例——最简单的线程 线程使用示例一: [java] view plai ...

  5. nginx+uwsgi部署flask应用后只能在本机访问解决办法,ipv4 和ipv6

    我的系统是centos7 nginx监听8888端口 在window下  :telnet 192.168.81.224 8888  发现连接不上, 端口22能连上 关闭224的防火墙就好了 syste ...

  6. css3怎么分清伪类和伪元素

    伪类用于向某些选择器添加特殊的效果. 伪元素用于将特殊的效果添加到某些选择器. 伪类有::first-child ,:link:,vistited,:hover,:active,:focus,:lan ...

  7. 解析json结构绘制canvas

    在工作中偶尔会遇到绘制转发卡/邀请卡的业务,且这个转发卡/邀请卡的风格会有很多,要求最后生成图片.这时候如果使用一张图片绘制一个canvas,这个工作量会相当大.分析一下转发邀请的内容,会发现所有的里 ...

  8. nodo合并多个mp3文件

    nodo合并多个mp3文件 会使用到node中的fs - 文件系统 import fs from 'fs'; //读取目录下的文件,返回文件名数组[0x2.mp3,f0k.mp3]; const fi ...

  9. VMware虚拟机上配置CentOS联网

    转自https://www.cnblogs.com/cindy-cindy/p/6784536.html 1.首先保证虚拟机的网络适配器为NAT模式 2.设置虚拟机的“编辑”-->“虚拟网络编辑 ...

  10. Python爬虫教程-02-使用urlopen

    Spider-02-使用urlopen 做一个最简单的python爬虫,使用爬虫爬取:智联招聘某招聘信息的DOM urllib 包含模块 - urllib.request:打开和读取urls - ur ...