LR脚本编写规范

LR脚本编写规范

ID:37712026

大小:116.50 KB

页数:21页

时间:2019-05-29

上传者:U-2437
LR脚本编写规范_第1页
LR脚本编写规范_第2页
LR脚本编写规范_第3页
LR脚本编写规范_第4页
LR脚本编写规范_第5页
资源描述:

《LR脚本编写规范》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

LR脚本编写规范LR脚本编写规范(V1.0.0)第2页共21页 LR脚本编写规范文档修订历史版本号日期描述维护人V1.0.02011-04-17初稿王颖第2页共21页 LR脚本编写规范目录LR脚本编写规范3n1.命名规则3脚本命名规则3Action命名规则4事务命名规则4请求命名规则4参数命名规则5n2.脚本结构说明5n3.请求说明6n4.优化规则6第21页共21页 LR脚本编写规范LR脚本编写规范n1.命名规则脚本命名规则LR脚本需存放于英文目录结果中,避免脚本在后续执行中出现异常,为方便管理脚本的命名规则需遵循以下原则:●简单准确的概括当前脚本的业务功能;●可以是英文描述或是功能拼音首字母组合;●全部脚本命名规则需统一;举例:信用卡还款,脚本名称可以是CreditCardPayment或xykhk。Action命名规则Action的命名规则只是针对于默认生成的Action和自己手动添加的action来说的,需遵循以下原则:(1)Vuser_init:action名称不需要修改;(2)默认生成的Action和自己手动添加的action:●以“项目简称_业务简称”命名每个业务action;举例:CEB_xykhk;●业务名称尽量与脚本名称统一;(3)如需单独存放脚本中使用函数,新建action命名为:Action_lib;(4)Vuser_end:action名称不需要修改;(5)Globals.h:名称不需要修改;事务命名规则考虑到事务是结果中关注点的特殊性,为方便查看结果事务的命名需遵循以下原则:●事务名称需以中文命名,明确表述业务功能;举例:本行转账_第一次请求,或信用卡还款;●若一个功能需多次请求,每个请求需封装成一个事务,每个事务以精简的语言描述对应的动作;举例:比如明细查询的功能需要经过3个步骤,首先选择账户列表,然后列出每个账户中的余额,然后点击每个账户对应的明细链接,进入明细查询结果界面。这个过程涉及到提交3个请求,每个请求可命名为:账户列表查询,余额查询,明细查询;第21页共21页 LR脚本编写规范原因:虽然每个请求都封装成一个事务,但用户真正想得到相应时间等指标的却可能是其中某个请求的数据,这时我们可以将前面的其他事务放到初始化中,然后将对应的事务注释掉,方便统计任意一个请求的数据。请求命名规则每个业务可能都需要提交多次请求才能最终实现一个完整功能,为了清晰了解每个业务的请求数,每个请求的命名需遵循以下原则:●以“ceb_业务简称_请求序号”命名每个请求;举例:ceb_xykhk_1,ceb_xykhk_2;●若一个功能需多次请求,每个请求名称和对应的事务名称可以准确的描述出第*次请求是完成了什么功能;举例:比如“我的账户”模块中的明细查询功能需要经过3个请求,第一个请求(ceb_wdzh_1)完成了(账户列表查询)事务的功能,第二个请求(ceb_wdzh_2)完成了(余额查询)事务的功能,第三个请求(ceb_wdzh_3)完成了(明细查询)事务的功能参数命名规则参数的命名考虑到两种种情况,一种是在脚本编写过程中需要方便传递过程变量自己定义的参数,一种情况是需要从服务器返回报文中解析出来然后再组合数据串用于向服务器提交请求的参数,所以对应参数的命名可以分两种种情况:●对于第一种情况:比如服务器返回内容可记为Response;●对于第二种情况:比如需要从服务器返回的报文中取到某个参数,直接用对应的参数名称;举例:CardNo,PayAmount,action对应的url可记为ceb_xykhk_3url;概括的说,就是每个参数都需要简单准确的表达变量的功能。n2.脚本结构说明每个脚本都由基本的3个action和一个globals.h文件组成,如需单独存放脚本中使用函数,可新建action命名为:Action_lib。●对于vuser_init::由于初始化在执行场景中只需要执行一次,一般包含以下内容:(1)宏定义(#define)常量定义,包含地址,证书路径,算法,消息类型等;(2)脚本中使用到的变量,结构函数及实体对象;(3)初始化函数:A.加载外部的dll文件;B.为之前定义的变量分配合适大小的内存;C.EWP访问地址;D.添加报文头信息;E.握手及前期准备获得加解密的密钥串;第21页共21页 LR脚本编写规范A.凡是在需要关注的事务之前的一切操作都可以放在初始化中,在第一次脚本编写过程中可仅将登录放在初始化中;B.函数成功返回标志,Return0;●对于业务action:(1)对于场景执行前的调试脚本,可将全部业务相关脚本放在主action中,具体执行场景时将业务其他脚本放入初始化中;(2)每次请求之前需明确列出请求地址,提交参数,接口名称;(3)拼接提交串后需将转LR_ENC_SYSTEM_LOCALE为LR_ENC_UTF8;(4)提交串需加密,有时需转URL编码;(5)基本结构为:注册函数-----发请求(转码)---判断返回结果中的错误串---没有错误串进行解码—查找内容----给出脚本执行正确的提示每个块结构加上注释说明,方便阅读;●对于函数action:存放脚本中使用的函数;●对于vuser_end:存放需要释放的变量;●对于globals.h:存放需要引入的头文件,头文件需放在LR安装目录的include中;n3.请求说明每个请求之前都需对本次请求做说明,内容包括:●请求说明:****业务第*次请求;●请求url:【http://{HostAdress}/ceb_s/prelogin?app=ceb&o=i】;●提交数据:参数名:***,【固定数据】,{参数数据};●接口方法:【***】●注意:对于个别参数名称不能明显看出的,比如用n表示userid,我们特别需要指出;举例:/*信用卡还款业务第3次请求请求url:【http://{HostAdress}/atompub_s/form/gdb_xyk_bills?app=ceb&o=i】提交data:body=CardNo:信用卡号【lr_eval_string("{account_in}")】AcctNo:还款帐号【lr_eval_string("{account_out}")】Org:币种(人民币)【102】PayAmount:还款金额【1】OTPPassword:手机动态密码【111111】OTPPassType:短信、阳光令牌【SMS】第21页共21页 LR脚本编写规范otherFlag:自己的卡【Y】n:接口方法【PayCreditCardResult.do?】*/n4.优化规则脚本基本规则在上述内容中已经明确,但在具体项目中会得到一些经验性的优化规则,主要有以下几点:●在解析XML内容时,尽量用描述性编程,比如:lr_xml_get_values("XML={content2}","ValueParam=PayerAcNo","Query=/form/input[@name="PayerAcNo"]/@value","NotFound=Continue",LAST);;避免使用"Query=/form/input[2]/@value",否则在数据结构改变后脚本经常会出现问题;●每个事务的结果都置成LR_AUTO,后边需手工指定在什么情况应该是lr_set_transaction_status(LR_FAIL),否则事务成功率统计将不准确;●如果要统计某个业务的某个请求的响应时间及其他指标时,需将对应请求之前的操作放入初始化中;●对于可参数化的数据尽量用参数化表示,比如登录数据等,避免每次都在脚本中修改;●在对某个请求进行关注时,将脚本中的其他封装的事务全部注释掉,避免统计太多事务,给用户理解结果时照成障碍;●对于上下文中取数据的,但在调试过程中经常需要参照的数据,可在脚本中注释,方便每次进行脚本修改时调试;●每个脚本最后应该根据检查点来给出是否正确执行的结果;●注意脚本中退出的控制,初始化中应该是退出虚拟用户,在action中应该是退出本次循环,但对于放在初始化中的业务脚本就保留原来的循环控制;●每个请求之前需正确添加思考时间,否则影响后边事务的成功率;●对于像交易密码需要(先加密-拼串-加密)还是(拼串-加密)的情况要给出注释说明情况;●服务器返回内容为空的检查;第21页共21页 LR脚本编写规范n4.脚本编写原则●脚本结构为:Vuser_initICA_loginICA_bhzz_brzh…Vuser_endGlobals.h说明:全部业务脚本都放在同一个脚本中,以不同的Action封装,每个业务Aciton以项目简称_模块名_业务名,比如登录可以省略模块名。当调试其中某个脚本时可通过运行时设置只运行其中某个脚本。●初始化中包含一次登录脚本,目的是某些业务需在登录后才能进行。这样方便进行登录与登录内业务进行混合场景运行。●将初始化action中的握手事务注释掉,业务action中的事务命名方式为:业务名称_第*次请求,也需将事务起始,事务结果成功与失败注释掉,只需保留需要进行性能测试的脚本,并将事务命名为业务名称,方便结果查看。●全部测试事务都需进行结果成功失败的判断。●需要在每个项目中调整的变量或参数有:EWP服务器地址,APP名称,密码加密方式,证书与DLL文件的存放路径,测试与调试脚本日志输出标志。●握手,握手后的解析,加密函数,界面函数,字符串替换,验签等都放在头文件中。●对于事务Action来说,去掉collistlist还让channelrun的请求,若完成这个业务只需最后一个请求就可以完成,那我们就在业务Action中只保留最后一个请求,原则是只要能保证脚本正常请求成功即可。●编写完脚本后需将脚本循环至少2次,以保证脚本是否正常运行,因为有时脚本中提交的数据是写死的,比如相同的确认界面如果业务上不允许提交两次,我们就需要想办法,比如可以利用新数据(利用前序步骤),或者用参数化。●对于每个业务Action,只需对测试的请求进行内容验证,比如出现什么字样才算请求通过,对于其他的请求只保证没有ERROR出现即可。第21页共21页 LR脚本编写规范●每个请求前,利用lr_save_string函数,将地址和参数列出来,然后利用sprintf函数将参数用%s形式读进去,为了是每次参数发生变化时方便修改,可增加参数含义说明。●握手可不必进行ERROR的判断,因为握手不会出现返回内容错误的时候,最多也就是请求服务器地址失败,导致没有返回内容。●在初始化中任何请求若发生错误,需使用lr_exit(LR_EXIT_VUSER,LR_FAIL);函数将当前虚拟用户退出,否则在跑场景的时候action中循环的请求肯定会连带全部出错。●业务Action中若请求发生错误要用lr_exit(LR_EXIT_ITERATION_AND_CONTINUE,LR_FAIL);函数,退出当前循环并继续,否则也会出现连带错误。n4.脚本参考lVuser_initvuser_init(){lr_save_string("192.168.64.178:80","HostAdress");//192.168.64.178:80,123.128.109.71:9008lr_save_string("ica","AppName");lr_save_string(HandShakeClient(),"ClientHelloBody");web_reg_save_param("response","LB=","RB=","Search=Body",LAST);web_reg_save_param("response_len","LB=Content-Length:","RB=r ","Search=Headers",LAST);web_reg_save_param("emp_cookie","LB=Set-Cookie:","RB=;path=","Search=Headers",LAST);//lr_start_transaction("握手");web_custom_request("EMP_HandShake","Method=POST",第21页共21页 LR脚本编写规范"URL=http://{HostAdress}/user/handshake?ota_version=AD-UMP-1.1.1-000000&app={AppName}&o=i","RecContentType=application/octet-stream","Body={ClientHelloBody}",LAST);//lr_end_transaction("握手",LR_AUTO);Response_1=HandShakeServer(lr_eval_string("{response_len}"),lr_eval_string("{response}"));lr_save_string(Response_1,"response");if(LOG_FLAG){lr_convert_string_encoding(lr_eval_string("{response}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"response2");lr_message("握手返回结果【%s】 ",lr_eval_string("{response2}"));}len=RSA_GetPublicKeyFromCert(NULL,0,APP_CERT,0);result=RSA_GetPublicKeyFromCert(PublicKey_JMJ,len,APP_CERT,0);if(result!=220){lr_error_message("未正确加载公钥证书,请查看是否正确设置 ","");lr_exit(LR_EXIT_VUSER,LR_FAIL);}//===========登录_第一次请求=============memset(Data1,0,10240);lr_save_string("02","encryptMode");EncryptPwd(Data1,lr_eval_string("{PassWord}"),strlen(lr_eval_string("{PassWord}")),PublicKey_JMJ,lr_eval_string("{encryptMode}"));第21页共21页 LR脚本编写规范lr_save_string(Data1,"pinData.pin");web_convert_param("pinData.pin","SourceEncoding=HTML","TargetEncoding=URL",LAST);sprintf(Data1,"Language=zh_CN&loginName=%s&pinData.pin=%s",lr_eval_string("{LoginName}"),lr_eval_string("{pinData.pin}"));lr_convert_string_encoding(Data1,LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"BODY");memset(Data2,0,10240);Aes_On(Data2,lr_eval_string("{BODY}"),ClientKey,ClientIV);AddHMac(Data2,strlen(Data2),ClientMac,20);lr_save_string(Data2,"POSTBODY");web_reg_find("Search=body","SaveCount=ErrorCount","Text=

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭