博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用loadrunner进行服务器性能测试(winsocket)
阅读量:6296 次
发布时间:2019-06-22

本文共 3510 字,大约阅读时间需要 11 分钟。

由于项目进入尾声,需要进行性能测试,没有专业的性能测试工程师,只好自己动手,研究一下loadrunner.

发现loadrunner对web测试介绍比较多,牵涉到winsocket测试的资料极少,不过到处找一找,研究一下,也是可行的.

先说一下我们的协议,采用tcp协议,与客户端采用自定义二进制流的方式进行通信.遵从普通的自定义协议的方式,即协议结构采用包头+包体的形式,包头为固定大小的长度,并在包头中加入包体总长度的字段.

好了,下面可以用loadrunner进行协议测试了.首先想法在PC上实现一个简单的协议生成软件,我采用python进行编制,将协议跑一遍,然后用loadrunner进行录制.由于是针对单个的协议录制,因而在loadrunner中生成的脚本一目了然.考虑到同一条协议根据不同的条件,返回的数据是不一样的,因此脚本稍有点复杂.

录制的脚本默认采用函数lrs_receive()来接收脚本,根据loadrunner的匹配规则,默认用data.ws中recv buf 中指定的长度来进行匹配,这样,由于同一个协议返回的数据总是不断变化的,就必然导致测试不通过的情况.在网上查到,可以通过某个设置使得每次达到录制时的数据量即可,但这样做有个明显的缺陷,每次读到到指定的数据后就不读取了,针对短连接,或是只测试一次的还可以,要是长连接,需要不停发送和接收的,必然出现测试不准确的问题.

以下为解决方法,将lrs_receive改为lrs_receive_ex,并将一次读取改为两次读取,第一次读取固定大小的包头,读完包头后,解析出包体的大小,然后再读取包体.

此方法适用所有自定义winsocket协议,附上相关脚本.

 

View Code
/********************************************************************* * Created by Mercury Interactive Windows Sockets Recorder * * Created on: Fri Jul 13 16:08:19 *********************************************************************/#include "lrs.h"vuser_init(){    lrs_startup(257);    lr_start_transaction("create_socket");    lrs_create_socket("socket0", "TCP", "RemoteHost=127.0.0.1:110",  LrsLastArg);    lr_end_transaction("create_socket", LR_AUTO);    return 0;}
View Code
/********************************************************************* * Created by Mercury Interactive Windows Sockets Recorder * * Created on: Fri Jul 13 16:08:19 *********************************************************************/#include "lrs.h"long getNextRecvLen(char* socketID){    int NumberOfBytes = 0;    int NextRecvLen = 0;    char *Buffer;    lrs_get_last_received_buffer(socketID, &Buffer, &NumberOfBytes);    memcpy((char*)&NextRecvLen, Buffer+20, 4);     lr_log_message("last_received:%d, NextRecvLen:%d", NumberOfBytes, NextRecvLen);    return NextRecvLen;}int receive_ex(char* socketID, char* buf){    long NextRecvLen = getNextRecvLen(socketID);//getNextRecvLen("socket0");    char flag[50];    memset(flag, 0, sizeof(flag));    sprintf(flag, "NumberOfBytesToRecv=%d", NextRecvLen);      lr_log_message(flag);     lrs_receive_ex(socketID, buf, flag, LrsLastArg);}void doOneThing(int index){     char sendbuf[50];     char recvbuf1[50];     char recvbuf2[50];     char transbuf[50];     memset(transbuf, 0, sizeof(transbuf));     sprintf(transbuf, "one_send_recv_%d", index);     lr_start_transaction(transbuf);             memset(sendbuf, 0, sizeof(sendbuf));         memset(recvbuf1, 0, sizeof(recvbuf1));         memset(recvbuf2, 0, sizeof(recvbuf2));         sprintf(sendbuf, "buf%d", 2*index);         sprintf(recvbuf1, "buf%d", 2*index+1);         sprintf(recvbuf2, "dbuf%d", index);         lrs_send("socket0", sendbuf, LrsLastArg);         lrs_receive_ex("socket0", recvbuf1, "NumberOfBytesToRecv=32", LrsLastArg);         receive_ex("socket0", recvbuf2);         lr_end_transaction(transbuf, LR_AUTO); }Action(){    lr_rendezvous("read_all_req_0");    doOneThing(0);}
View Code
/********************************************************************* * Created by Mercury Interactive Windows Sockets Recorder * * Created on: Fri Jul 13 16:08:19 *********************************************************************/#include "lrs.h"vuser_end(){    lrs_close_socket("socket0");    lrs_cleanup();    return 0;}

由于是分两次读取数据,必然读取的内容与录制的会稍有不同,幸好我们判断成功与否不是用返回的数据进行比较,而只是核对一下数据的大小,因此完全可以手动修改数据脚本,以下为在录制的基础上手工修改的脚本(注意,只是更改了接收端)

send  buf0 28

 "Test"
 "\x00\x1b\x00\x00\x00"
 "\x00\x00\x00\x00"
 "\x12\x01\x00\x00\x00\x01\x00\x00\x00"
 "\x02\x00\x01\x00\x01\x00"

recv  buf1 -1

recv rbuf0 -1

 

 

 

转载地址:http://wklta.baihongyu.com/

你可能感兴趣的文章
mac composer 使用
查看>>
PDF怎么测量尺寸
查看>>
改造Dubbo,使其可以对接口方法进行注解配置
查看>>
MySQL默认配置文件位置发生改变后如何查找
查看>>
C#操作数据库
查看>>
我的友情链接
查看>>
配置ELK添加marvel插件
查看>>
Oracle 内存一 手动内存管理,自动内存管理
查看>>
我的友情链接
查看>>
Mysql学习笔记【原创】
查看>>
ssm配置多数据库支持
查看>>
JVM内存分配与垃圾回收浅析
查看>>
Android零基础入门第65节:RecyclerView分割线开发技巧
查看>>
【深度学习笔记】(二)Hello, Tensorflow!
查看>>
Spring Boot Admin 2.0开箱体验
查看>>
vue-router如何在router-link标签绑定click点击事件、keyup、change等事件
查看>>
20.17 shell中的函数
查看>>
css 三角形
查看>>
从输入 URL 到页面加载完成的过程中都发生了什么
查看>>
JVM汇总--类加载/收集器
查看>>