性能测试脚本要求规范.docx
- 文档编号:9165061
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:12
- 大小:23.33KB
性能测试脚本要求规范.docx
《性能测试脚本要求规范.docx》由会员分享,可在线阅读,更多相关《性能测试脚本要求规范.docx(12页珍藏版)》请在冰豆网上搜索。
性能测试脚本要求规范
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】函数名尽量采用“模块名+动词+名词〞〔动宾词组〕或者“模块名+名词+动词〞的方式命名,尽量做到根据函数名能大概明确函数所完成的功能。
例如:
boolm_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=
LAST);
sprintf(tmp,"
lr_save_string(tmp,"attributeChannelsXml");
3、HTTP协议检查点
a)、检查HTTP应答消息的BODY局部
web_reg_find("Text=Wele", LAST);
b)、检查HTTP应答消息的Header局部
web_save_header(RESPONSE,"response");
web_url("John_Willoughby",
"URL=be_Magna./portal/index.asp",
"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," sprintf(buffer," 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," 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);//根据特定字符对字符串进展分割
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 性能 测试 脚本 要求 规范
