谢邀!
今天㳀谈下测试脚本开发中,报文长度动态变动的问题。
可能小伙伴们刚接触性能测试时不太熟悉,到网上找各个资料,却觉得网上的方法可用,但不太方便,下面我整理一些常用方法,若小伙伴们觉得不太清楚,还麻烦回复我,我及时修订。
条件说明:测试工具:LoadRunner11.0 & Jmeter5.0。
协议:TCP。
前提条件:报文开头含定长的字符串,表示报文内容的总长度,如:0004abcd,其中“0004”表示后面还有4个字符“abcd”表示报文内容。
约定:为描述方便,上述“0004”称为报文长度,“abcd”称为报文内容。
先说说LoadRunner(C语言实现):
1.一个TCP请求时。
思路:利用strlen函数,计算报文内容长度,把计算后的长度拼接报文内容前面。
一点碎碎念:网上常看见利用2个及以上同等长度的buffer或malloc/free函数来实现该思路,但我觉得存在优化的空间。
实现图解:
脚本示例:
#include "lrs.h"Action()
{
int rc;
int length=0;
char lenOfhead[10];
char buf[4096];
// Step01:与入“报文内容”到Buffer // 这里应判定报文内容长度是否大于4096,若实际报文不可能超出该长度可不判定sprintf(buf+8,"%s",lr_eval_string(
"test,this is a message,"
));
// Step02:计算“报文内容”长度length += strlen(buf+8); --+8,在这里是预留的8位定长的“报文长度”字符
// Step03:格式化“报文内容”长度 // 这里需要注意的时sprintf函数会在结束时定入字符串的结束标标,即最后面多一个\x00 // 这也是我单独使用一个小buffer存放格式化“报文长度”的原因sprintf(lenOfhead,"%08d",length);
// 计算“总报文”的长度=“报文长度”+“报文长度”的长度(这里为8位定长字符),用于后面lrs_set_send_buffer函数发送TCP请求时使用length += 8;
// Step04:完成报文拼接memcpy(buf,lenOfhead,8*sizeof(char));
lr_output_message("buf:%s",buf);
lr_start_transaction("trans01");
rc=lrs_create_socket("socket1","TCP","RemoteHost=",LrsLastArg);
if(rc!=0)
{
lr_error_message("An error occurred while opening the socket1,Error code:%d",rc);
return 0;
}
lrs_set_send_buffer("socket1",buf,length);
lrs_send("socket1","buf1",LrsLastArg);
lrs_set_recv_timeout(68,0);
lrs_receive_ex("socket1","buf10","StringTerminator=","Mismatch=MISMATCH_CONTENT",LrsLastArg);
lrs_save_searched_string("socket1",NULL,