性能测试脚本规范样本.docx

上传人:b****7 文档编号:10171225 上传时间:2023-02-09 格式:DOCX 页数:12 大小:23.40KB
下载 相关 举报
性能测试脚本规范样本.docx_第1页
第1页 / 共12页
性能测试脚本规范样本.docx_第2页
第2页 / 共12页
性能测试脚本规范样本.docx_第3页
第3页 / 共12页
性能测试脚本规范样本.docx_第4页
第4页 / 共12页
性能测试脚本规范样本.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

性能测试脚本规范样本.docx

《性能测试脚本规范样本.docx》由会员分享,可在线阅读,更多相关《性能测试脚本规范样本.docx(12页珍藏版)》请在冰豆网上搜索。

性能测试脚本规范样本.docx

性能测试脚本规范样本

 

LoadRunner规范

 

东软集团股份有限公司移动互联网事业部测试部

更改履历

序号

版本

更改章节

状态

更改描述

更改时间

更改人

更改申请号

状态:

新建、增长、修改、删除。

1文档阐明

1.1背景及目

编写这篇文档目用于规范咱们测试部LoadRunner脚本编码风格,使人们可以养成一种好编程习惯,使得在寻常工作中编写代码可读性更强,“低档错误”更少,更易于维护以及她人学习,并且但愿通过这些点点滴滴努力从而提高咱们产品质量,减少风险。

该规范和C语言有关某些,基本完全借鉴了林锐博士高质量C++编程这本书里面内容。

因而建议人们学习一下这本书,是开发和测试都需要学习一本好书。

该规范背面增长了LoadRunner脚本中惯用例子,在实际工作中,基本惯用函数以及写法都已经包括在里面。

1.2注意事项

2脚本编写

2.1命名规则

●【规则2-1-2】命名规则尽量要遵循“言简意赅、望文生义”八字方针。

●【规则2-1-1】变量名应当直观且可以拼读,可望文知意,不必进行“解码”。

变量名最佳采用英文单词或其组合,便于记忆和阅读,切忌使用汉语拼音来命名。

程序中英文单词普通不会太复杂,用词应当精确。

●【规则2-1-2】程序中不要浮现仅靠大小写区别相似变量名。

例如:

intx,X;//变量x与X容易混淆

●【规则2-1-3】程序中不要浮现完全相似局部变量和全局变量,尽管两者作用域不同而不会发生语法错误,但会使人误解。

●【规则2-1-4】变量名字应当使用“名词”或者“形容词+名词”。

此外,对于人们惯用、习惯成俗形容词,可以采用缩写。

例如:

uint32value;//名词

uint32n_val;//形容词+名词,n是new缩写

●【规则2-1-5】尽量避免名字中浮现数字编号,如val1,val2等,除非逻辑上确需要编号。

这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义名字(由于用数字编号最省事)。

●【规则2-1-6】全局变量加前缀g_(表达global)修饰,单词之间采用下划线分割。

例如:

Char*g_msg_pool;

●【规则2-1-7】函数名尽量采用“模块名+动词+名词”(动宾词组)或者“模块名+名词+动词”方式命名,尽量做到依照函数名能大概明确函数所完毕功能。

例如:

boolcomm_hash_create(…)//模块+名词+动词

●【规则2-1-8】宏常量名必要所有采用大写字母,单词之间使用下划线分隔。

例如:

#defineDEF_BUF_LEN150//宏常量

2.2格式化代码

●【规则2-2-1】脚本应采用缩进风格编写,每层缩进使用一种制表位(TAB),类定义、办法都应顶格书写;

●【规则2-2-1】左花括号要另起一行,不能跟在上一行行末;  

●【规则2-2-2】一种变量定义占一行,一种语句占一行;

●【规则2-2-3】对独立程序块之间、变量阐明之后必要加空行;

●【规则2-2-4】对于较长语句(>80字符)要提成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出新行要进行恰当缩进,使排版整洁,语句可读;

●【规则2-2-5】循环、判断等语句中若有较长表达式或语句,则要进行适应划分;

●【规则2-2-6】在构导致员赋值等状况,等号对齐,至少留一种空格;

●【规则2-2-7】若函数或过程中参数较长,则要进行恰当划分。

●【规则2-2-8】形参排序风格:

最常使用参数放在第一位;

输入参数列表应放在输出参数列表左边;

将通用参数放在特殊参数左边

2.3Vuser

●【规则2-3-1】脚本越小越好。

就像写code同样,不要太长,这样易于维护也易懂。

尽量做到一种功能写一种脚本。

如果那些功能是持续有序,必要先做上一种,下一种动作才干进行,就只能放在一起了。

●【规则2-3-2】对于在脚本中惯用函数,需要进行抽取,放到专门.h中进行定义实现。

●【规则2-3-3】能用到高档合同,不要使用底层合同。

●【规则2-3-4】普通将登陆业务放到init里面;业务放到action里面;退出放到end里面

●【规则2-3-5】在脚本中,必要自己定义事务,不容许使用默认事务。

●【规则2-3-6】在脚本中,如果有登陆和退出操做,也必要声明事务。

●【规则2-3-7】脚本名称,事务名称、参数名称要做到见名知义。

●【规则2-3-8】对于socket需要明确是长连接还是段连接

●【规则2-3-9】socket编程必要关闭系统buffer

●【规则2-3-10】对于socket,如果能每次返回长度拟定,那么一定使用data.ws文献中指定特定长度字符。

否则才设立接受超时时间。

●【规则2-3-11】对于操做二进制,不使用字符串操做函数,需要使用内存函数。

如memcpy代替strcpy

3场景执行

●【规则3-1】在执行前,建议将所有脚本放到本地英文目录下,建议d:

\script

●【规则3-2】运营时需要关闭系统日记。

●【规则3-3】运营时依照实际状况设立场景思考时间

●【规则3-4】运营时去掉每个action作为一种transaction记录

●【规则3-5】对于HTTP合同测试,对的合理设立缓存方略

●【规则3-6】在执行时每次将执行成果放到本地英文目录下,建议d:

\result

●【规则3-7】执行单交易测试至少需要20分钟;执行混合场景测试至少需要30分钟

●【规则3-8】对于测试使用负载均衡方略系统,需要考虑负载均衡方案,以便决定与否采用IP欺骗。

●【规则3-9】在整个测试执行过程中,使用excel记录整个执行过程,特别是在执行过程中新设计场景。

序号

内容/场景

负责人

开始时间

结束时间

测试成果记录

发现问题

解决办法

备注

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4某些经验

1、能用简朴办法实现,别用复杂实现。

特别是获取loadrunner测试数据模块。

2、关联函数使用

web_reg_save_param("attributeChannelsXml",

"LB=","RB=",

LAST);

sprintf(tmp,"%s",lr_eval_string("{attributeChannelsXml}"));

lr_save_string(tmp,"attributeChannelsXml");

3、HTTP合同检查点

a)、检查HTTP应答消息BODY某些

 web_reg_find("Text=Welcome", LAST);

b)、检查HTTP应答消息Header某些

web_save_header(RESPONSE,"response");

web_url("John_Willoughby",

"URL=",

"TargetFrame=_TOP",

LAST);

if(strstr(lr_eval_string("{response}"),"OK")!

=NULL)

{

//PASS

}

else

{

//FAIL

}

4、使用hex_print函数,进行二进制报文调试。

char*hex_print(void*hexbuf,intbufsize)

{

inti;

unsignedchar*buf_str;

unsignedchar*x;

unsignedchartmp[1];

buf_str=(unsignedchar*)malloc(bufsize*4+1);

x=buf_str;

memset(x,0,bufsize*4+1);

for(i=0;i

{

sprintf(x,"%02x",((unsignedchar*)hexbuf)[i]);

x=x+3;

}

lr_log_message("%s",buf_str);

return(char*)buf_str;

}

5、格式化输出函数

sprintf(tmp,"%s",lr_eval_string("{attributeChannelsXml}"));

sprintf(buffer,"{m_Channel_%d}",i_loop+1);

sprintf(runlog.sendTime,"%s%c",ctime(&currTime),'\0');

sprintf(version,"%02x",((unsignedchar*)recieve_buffer)[2+total_loop]);

6、XML操做

i_address_channel=lr_xml_get_values("XML={attributeAddressesXml}",

"ValueParam=m_address_channel",

"Query=/addresses/item/channel",

"SelectAll=yes",

LAST);

i_address_address=lr_xml_get_values("XML={attributeAddressesXml}",

"ValueParam=m_address_address",

"Query=/addresses/item/address",

"SelectAll=yes",

LAST);

for(i_loop=0;i_loop

{

sprintf(buffer,"{m_address_channel_%d}

{m_address_address_%d}
",i_loop+1,i_loop+1);

strcat(tmp,buffer);

}

7、善于使用lr_save_string和lr_eval_string函数

lr_save_string(ssic,"SSIC");

lr_eval_string(“SSIC”)

8、内存函数使用

buffer=(char*)malloc(content_len*sizeof(char));

memset(buffer,0,content_len);

loop=loop+2;

sprintf(x,"%c",0xA0);

memcpy(buffer+loop,x,1);

loop=loop+4;

sprintf(x,"%c",0x05);

memcpy(buffer+loop,x,1);

loop=loop+3;

free(buffer)

9、字符串函数使用

if(strcmp(lr_eval_string("{currentWorkMode}"),"3")!

=0){

lr_set_transaction_status(LR_FAIL);

lr_end_transaction("登陆",LR_AUTO);

return1;

}

strcat(tmp,buffer);

if(strstr(runlog.recvPacket,runlog.Hrst)!

=NULL)

{

runlog.Frst="Pass";

result=TRUE;

}else

{

runlog.Frst="Fail";

result=FALSE;

}

(char*)malloc(sizeof(char)*(strlen(tmpStr)+strlen(ipport)+1));

10、文献操做

sprintf(filepath,"..\\runlog\\result.txt%c",'\0');

if((fp=fopen(filepath,"at+b"))==NULL)

{

lr_message("openlogfilefailed!

\n");

return-1;

}

sprintf(strbuf,"<%s>%s%s%c",strtime,scriptName,result,'\0');

fprintf(fp,"%s\r\n",strbuf);

free(strbuf);

fclose(fp);

11、函数参数传递

a)、函数传入参数返回内容

char*checkBuf;

调用函数:

socketSendRecv(socketName,"buf_Add_Buddy",1,&checkBuf,1)

函数实现:

/*****************************************************************

函数名称:

socketSendRecv

函数功能:

通过一种socket连接发送并接受数据

输入参数:

输出参数:

状态:

编码完毕

*******************************************************************/

BOOLsocketSendRecv(char*src_socket,char*buffer,intlength,char**pRebuffer,intflag_parse)

{

char*send_buffer_xml;

intnum_input;

char*send_buffer_mcp;

intsend_len;

char*recieve_buffer_mcp;

intrecsize2;

char*recieve_buffer_xml;

intrecvieve_len;

BOOLret;

……

paserMcptoXml((unsignedchar*)recieve_buffer_mcp,&recieve_buffer_xml,&recvieve_len,recsize2);

*pRebuffer=(char*)malloc(sizeof(char)*strlen(recieve_buffer_xml)+1);

memcpy(*pRebuffer,recieve_buffer_xml,strlen(recieve_buffer_xml));

*(*pRebuffer+strlen(recieve_buffer_xml))='\0';

free(recieve_buffer_xml);

free(recieve_buffer_mcp);

returnret;

}

b)、函数返回值,返回字符串

调用函数:

char*str=NULL;

str=GetMemory3(100);

函数实现:

char*GetMemory3(intnum)

{

char*p=(char*)malloc(sizeof(char)*num);

returnp;

}

12、网络函数操做

TCP

lrs_create_socket("socket","TCP","LocalHost=0","RemoteHost={remoteHost}",LrsLastArg);

lrs_set_send_buffer("socket",buffer,content_len);

lrs_length_send("socket","buf0",0,LrsLastArg);

lrs_receive("socket","buf1",LrsLastArg);

lrs_get_last_received_buffer("socket",&recbuf,&num_input);

UDP

lrs_create_socket("socket","UDP","LocalHost=0","RemoteHost={remoteHost}",LrsLastArg);

lrs_set_send_buffer("socket",buffer,52);

lrs_send("socket","buf0",LrsLastArg);

lrs_receive("socket","buf1",LrsLastArg);

lrs_get_last_received_buffer("socket",&recbuf,&num_input);

13、自定义封装函数

char*substr(char*srcstr,char*lstr,char*rstr);//对字符串进行截取

intsearchstr(char*srcstr,char*lstr,char*rstr,char**pSubstr);//在字符串内所搜指定字符串

intsearchstrN(char*srcstr,char*lstr,intlen,char**pSubstr);//在字符串内所搜指定字符串

intsplitStringByChar(char*bfword,charsep,char*bhword,char*source);

char*Trim(char*source);//删除字符串开始和结束某些空格

BOOLsearchstrM(char*srcstr,char*lstr,char*rstr,PSTRLIST*pList);//依照特定字符对字符串进行分割

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1