STAX脚本编写文档_第1页
STAX脚本编写文档_第2页
STAX脚本编写文档_第3页
STAX脚本编写文档_第4页
STAX脚本编写文档_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

STAX脚本编写STAX介绍

STAF(SoftwareTestAutomationFramework)是开源、跨平台、支持多语言并且基于可重用的组件来构建的自动化测试框架。它为自动化测试建立了基础,并且提供了一种可插拔的机制支持不同的语言平台。STAF采用点对点的实现机制,被用来减轻自动化测试的工作负担,加快自动化测试的进程。在STAF环境中,所有的机器都是对等的,没有客户端和服务区的区分。STAX(SoftwareTestAutomationeXecutionEngire)是基于STAF的执行引擎。它在STAF基础上,帮助用户实现测试用例的分发、部署、执行以及结构分析。STAX使用了三种技术:STAF、XML和Python。简单来说,STAX在STAF之上提供了一些接口,方便用户来操纵STAF进行自动化测试的实现。STAF和STAX的官方网站是:/。XML简单教程XML是英文Extensiblemarkuplanguage的缩写,中文意思是“可扩展标记语言”。XML的主要功能是帮助系统信息通过互联网共享结构化的数据。XML不是一个软件,也不是编程语言,XML只是一个标记语言的标准。用XML标准编写的文件,我们称为XML文件。下面是一个简单的XML文件。<booksISBN="9787544238212">

<title>Thebookthief</title>

<price>25</price>

<quantity>10</quantity></books>编写XML必须遵循一些简单的语法规则:(1)、每个开始标记必须有结束标记(2)、每个XML文档只能有一个根元素(3)、所有XML元素必须正确嵌套(4)、属性值必须加引号STAX脚本采用基于XML的脚本语言进行编写,这是专门为STAX测试设计的一种语言。在STAX脚本中,根元素是<stax>。一个STAX脚本的基本格式是这样的:<?xmlversion=’1.0”encoding=”UTF-8”standalone=”no”?><!DOCTYPEstaxSYSTEM‘stax.dtd”><stax></stax>脚本的头两行是固定的,主要指名我们采用的XML版本和编码规则,我们不进行详细讲解。我们需要将自己的代码写在<stax>和</stax>之间。XML的官方网站是。参考文献1是XML的简明教程。Python简单教程Python是一种脚本语言,STAX利用Python定义变量和表达式。变量命名规则:(1)、变量由字母、数字和下划线组成,第一个字符必须是字母或者下划线。(2)、变量区分大小写。(3)、Python中的关键字不能用作STAX的变量名(4)、STAX的保留字也不能用作变量名。STAX的保留字包括:RC、以”STAF’开头的单词、以”STAX”开头的单词。<script>testName="CoolTest1"</script><script>testName='CoolTest1'</script>这两条语句作用相同,都是将字符串CoolTest1赋值给变量testName。<script>testName=CoolTest1</script>这条语句的作用是将变量CoolTest1的值赋给变量testName。如果变量CoolTest1在前面没有定义,脚本出错。<testcasename="'Test1'">这条语句的作用是将字符串Test1赋值给变量name。注意这里是双引号里面包含单引号。‘:表示单引号“:表示双引号"':表示双引号嵌套单引号<testcasename="testName">这条语句的作用是将变量testName的值赋给变量name。由于XML中属性值必须用引号引起来,因此这里的testName不是字符串,而是变量。<script>testName="CoolTest1"</script><testcasename="testName">这样,name的值是字符串CoolTest1。<script>testName=“Test1”MachineName=“local”</script><testcasename="'%sPartA'%testName"><testcasename="'%sPartAonmachine%s'%(testName,machineName)">我们可以用%引用一个变量的值。上面这段脚本相当于<testcasename=”’Test1partA’”><testcasename=”’Test1partAonmachinelocal’”>Python的官方网站是/。参考文件2是Python的简明教程。STAX脚本教程有了前面的知识,我们来正式介绍stax脚本的编写规则。一个stax脚本的基本模板是这样的:<?xmlversion=’1.0”encoding=”UTF-8”standalone=”no”?><!DOCTYPEstaxSYSTEM“stax.dtd”><stax><defaultcallfunction=”FunctionA”/><functionname=”FunctionA”>……</function><functionname=”FunctionB”>……</function><functionname=”FunctionC”>……</function></stax>脚本开头两行是关于脚本的说明,stax是脚本的根标签,除去脚本说明以外的所有标签必须包含在根标签中。defaultcall是脚本执行时首先执行的语句。这个标签有个属性function=”FunctionA”,表示默认执行函数FunctionA,相当于C语言中的main函数。<functionname=”FunctionA”>……</function>是函数FunctionA的定义,标签function表示一个函数,这个元素有一个属性name指名了函数的名字。函数体定义在<function>和</function>中间。我们看到,这个脚本中一共定义了三个函数FunctionA、FunctionB、FunctionC。我们可以通过FunctionA去调用函数FunctionB和FunctionC。下面是一个更加详细的例子。?xmlversion="1.0"encoding="UTF-8"standalone="no"?><!DOCTYPEstaxSYSTEM"stax.dtd"><stax><defaultcallfunction="FunctionA"/><functionname="FunctionA"><process><location>'local'</location><command>'ls'</command><parms>'-l/'</parms></process></function><functionname="FunctionB"><stafcmd><location>'local'</location><service>'misc'</service><request>'version'</request></stafcmd></function><functionname="FunctionC"><log>'Thisfunctionlogsthismessage'</log></function></stax>FunctionA中包含一个process元素。process代表一个STAF进程,这个进程调用STAFPROCESS服务在指定的机器上执行指定的命令。因此,FunctionA的作用是在本地执行命令”ls-l/”。FunctionB中包含一个元素stafcmd。stafcmd表示要请用一个服务。因此,FunctionB相当于命令”staflocalmiscversion”。Function包含一个元素log,产生日志信息。4.1python代码4.4.1<script>标签说明:stax脚本中,标签script中的语句是Python语句,我们可以在这里定义XML文件解析和执行时用到的一些变量。我们还可以在这里加载python模块,执行python函数。<stax>中包含的<script>在文件执行前被初始化,<stax>中所有函数都可以用<script>中定义的变量,这些变量相当于其他语言中的全局函数。其他标签中包含的<script>中定义的变量只能在特定范围内有效,相当于其他函数中的局部变量。例子:<script>testName="CoolTest1"</script>这条语句的作用是将字符串CoolTest1赋给变量testName。<script>machName=STAFResult</script>这条语句的作用是将变量STARTResult的值赋给变量machName。<script>fromrandomimportrandomr=random()</script>这条语句的作用是加载random模块,然后产生0-1之间的随机数。4.2服务调用4.2.1<process>标签作用:为了编写STAX脚本方便,STAX定义了process标签用来调用STAF中的进程(process)服务。<process>标签会向process服务提交start需求,然后等待process执行。返回值:process服务调用结束后会产生以下返回值。返回值说明RC本次执行的错误码,0表示正常,非0值表示执行出错。STAFResult本次执行的错误信息,成功为None,不成功STAFResult中包含具体出错信息。STAXResult本次执行的返回信息,参见下面的例子。子标签:process包含以下子标签子标签名称属性说明locationrequiredprocess执行的机器。local表示本机2表示在IP地址为2的机器上执行。commandrequired执行的命令parmsoptional执行命令需要的参数,其他参数不再介绍。returnstdoutoptional标准输出例子:<processname="'TestProcess'"><location>'local'</location><command>'ls’</command><parms>'-l'</parms><returnstdout/></process><ifexpr="RC==0"><message>STAXResult</message></if>上面这段程序中,我们执行了一条指令ls-l/,STAXResult将包含根目录下所有目录的列表。4.2.2<stafcmd>标签作用:标签stafcmd用于调用STAF的命令。返回值:调用结束后有以下返回值供我们使用返回值说明RC本次执行的错误码,0表示正常,非0值表示执行出错。STAFResult本次执行的错误信息,成功为None,不成功STAFResult中包含具体出错信息。STAXResult本次执行的返回信息。子标签:stafcmd包含以下子标签:子标签属性说明locationrequiredSTAF命令在哪台机器上执行servicerequired接收request的服务的名称requestrequired我们提交的需求例子:<stafcmd><location>'2'</location><service>'PING'</service><request>'PING'</request></stafcmd><ifexpr="RC!=0"><log>'STAF%sPINGPINGrequestfailedwithRC:%s,Result:%s'%(RC,STAFResult)</log></if>上面是stafcmd的一个例子,这个例子的作用是向机器2的PING服务提交PING需求,判断机器2的STAF是否正常运行。当命令执行结束后,if标签检测返回值,如果返回值不是0表明192。168.0.42上STAF运行不正常,错误信息写入日志中。<stafcmd>

<location>'local'</location>

<service>'process'</service>

<request>'startcommand"ls"parms"-l"wait'</request></stafcmd>上面这段程序和4.2.1节中的例子作用完全一样。4.3并行执行STAF可以执行并行操作,即多个操作可以同时进行。4.3.1<parallel>标签作用:parallel标签可以包含子标签,这些子标签将并行执行。当所有的子标签执行结束后,parallel标签执行结束。例子:<parallel><stafcmd>...</stafcmd><process>...</process><callfunction="'VerifyRC'"/></parallel>在这个例子中,stafcmd、process、call三个操作同时执行。4.3.2<paralleliterate>标签作用:paralleliterate标签是并行执行的另一种方法。在使用paralleliterate前需要定义一个列表,paralleliterate标签中只包含一个执行子标签,列表中的每一个元素都要执行子标签中指定的任务,而且是并行执行的。当列表中所有的元素任务执行完毕时,paralleliterate结束。属性:paralleliterate标签含有以下几个属性:属性说明var列表中的元素in我们定义好的列表,列表中的元素将进行并行操作例子:<script>machineList=[’2’,’3’,’4’]</script><paralleliteratevar=”machineName”in=”machineList”><stafcmd><location>’local’</location><service>’PING’</service><request>’PINGMACHINE%s’%machineName</request></stafcmd></paralleliterate>在这个例子中,我们将会从本机同时ping42、43、44三台机器。4.4函数创建和调用这一节中,我们来谈谈STAX中如何创建函数,如何调用函数。4.4.1<function>标签作用:我们采用标签<function>创建函数。属性:function有一个属性name指名这个function的名字。属性说明name函数的名字例子:<functionname=”FunctionA”>……</function>4.4.2<function-map-args>标签作用:我们用<function-map-args>创建带有参数的函数。我们在4.4.1中创建的函数没有参数,若想创建带参数的函数,需要在<function>标签中使用<function-map-args>标签。例子:<functionname=”FunctionA”><function-map-args><function-required-argname="parms"/><function-optional-argname="machine"default="'local'"/><function-optional-argname="command"default="'ls'"/></function-map-args>……</function>我们将所有的参数放在标签<function-map-args>中,变量分为两种类型:<function-required-arg>:这种变量在函数调用时必须传递值。<function-optional-arg>:这种变量有默认值,函数调用时可以传值,可以不传值。如果不传递值就使用默认值。4.4.3<function-list-args>标签作用:<function-list-args>标签和<function-map-args>标签作用类似,也是用来创建带有参数的函数。这两个标签的主要区别时函数调用时参数的形式有差异。例子:<functionname=”FunctionA”><function-list-args><function-required-argname="parms"/><function-optional-argname="machine"default="'local'"/><function-optional-argname="command"default="'ls'"/></function-list-args>……</function>4.4.4<call>标签作用:我们用<call>标签调用前面定义的函数。例子:调用不带参数的函数<functionname=”FunctionA”>……</function><functionname=”FunctionB”><callfunction=”’FunctionA’”/></function>调用<function-map-args>标签定义的带参数的函数<functionname=”FunctionB”><callfunction="'FunctionA'">{'parms':'aaa','machine':'97'}</call></function>调用<function-map-args>标签定义的才参数的函数,我们需要将参数写成字典的形式。键值就是函数定义时的参数名称。我们传递给parms的值是字符串aaa,我们传递给machine的值是字符串2,参数command没有传递值就采用默认值ls。调用<function-list-args>标签定义的带参数的函数<functionname=”FunctionB”><callfunction="'FunctionA'">’aaa’,‘2’</call></function>我们按照变量定义的顺序进行赋值,第一个值aaa赋给第一个变量parms,第二个值赋给第二个变量machine,第三个变量采用默认值ls。4.4.5<call-with-map>标签作用:<call-with-map>标签是调用<function-map-args>标签定义的带参函数的另一种方式。作用与采用<call>标签调用<function-map-args>标签定义的带参函数一样。例子:<functionname=”FunctionB”><call-with-mapfunction="'FunctionA'"><call-map-argname="'parms'">'aaa'</call-map-arg><call-map-argname=”’machine’”>’2’</call-map-arg></call-with-map></function>name属性对应函数定义时指定的参数名称,<call-map-arg>与</call-map-arg>中间的值就是参数值。4.4.6<defaultcall>标签作用:这个标签指名脚本执行时默认调用的函数。例子:<defaultcallfunction="main"/><functionname=”main”>……</function>脚本启动时默认调用main函数。4.4.7<return>标签作用:我们可以用<return>标签指定函数返回值。函数执行到return语句就返回主调函数,不再向下执行。如果函数中没有return语句,那么执行完所有的函数语句返回主调函数。在主调函数中,我们可以用变量STAXResult获取函数返回值。这个变量可以表示任何类型,如整型、字符串、列表等等。例子:<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><!DOCTYPEstaxSYSTEM"stax.dtd"><stax><defaultcallfunction="main"/><functionname="FunctionA"><function-list-args><function-required-argname="x"/><function-required-argname="y"/></function-list-args><sequence><script>x=x+2y.append('test3')</script><return>x,y</return></sequence></function><functionname="main"><sequence><script>A=1B=['test1','test2']</script><callfunction="'FunctionA'">A,B</call><script>A,B=STAXResult</script><message>'A=%s,B=%s'%(A,B)</message></sequence></function></stax>这是一个完整的脚本,这个脚本中我们定义了两个函数FunctionA和main,FunctionA带有两个参数x和y,在函数FunctionA内部,我们让x的值加2,y增加一个元素’test3’,然后返回x和y的值。main是主调函数,定义了两个变量A=1B=[’test1’,’test2’],然后调用函数FunctionA,调用结束后查看返回值,最终结果应该是:A=3,B=[’test1’,’test2’,’test3’]。4.4.8<import>标签作用:import标签用于加载其他STAX脚本中定义的函数,这个标签有下面两个属性属性说明machineSTAX脚本在哪台机器上machine=”’2’”表示STAX脚本在2这台机器上。file我们要引入的脚本file=”’/usr/local/staf/samples/test1.xml表示我们要引入的是test1.xml这个STAX脚本。例子:文件test1.xml中定义了如下函数<functionname="FunctionA"><function-list-args><function-required-argname="x"/><function-required-argname="y"/></function-list-args><sequence><script>x=x+2y.append('test3')</script><return>x,y</return></sequence></function>我们在文件test2.xml中想调用函数FunctionA<functionname=”main”><sequence><script>A=1B=['test1','test2']</script><importmachine=”’local’”file=”’/usr/local/staf/samples/test1.xml’”><callfunction="'FunctionA'">A,B</call><script>A,B=STAXResult</script><message>'A=%s,B=%s'%(A,B)</message></sequence>4.5流程控制STAX脚本中也有if、loop等标签控制语句流程。4.5.1<loop>标签作用:<loop>标签表示语句循环,被loop包含的语句将执行若干次。属性:<loop>标签有几个属性。属性说明var循环过程中的变量from循环的起点to循环的终点<loopvar=”i”from=”0”to=”5”>相当于C语言中的for(i=0,i<=5,i++)。例子:<loopfrom=”0”to=”5”><stafcmd><location>'2'</location><service>'PING'</service><request>'PING'</request></stafcmd></loop>上面这段语句表示执行6次PING服务。4.5.2<iterate>标签作用:这个标签表示迭代,在迭代之前我们要先定义一个迭代的范围machineList=[’2’,‘3’,‘4’]。<iterate>会依次获取列表中的每一个元素执行指定的操作。属性:<iterate>标签有三个属性。属性说明var表示正在迭代的变量in表示迭代范围indexvar表示正在迭代的变量在迭代范围中的编号例子:<script>machineList=[’2’,‘3’,‘4’]</script><iteratevar=”machineName”in=”machineList”><stafcmd><location>’local’</location><service>'PING'</service><request>'PINGMACHINE%s'%machineName</request></stafcmd></iterate>上面这段语句表示在本机依次PING42、43、44三台机器。4.5.3<if>标签作用:STAX中有三个标签用于选择流程:<if>、<elseif>、<else>,相当于C语言中的if、elseif、else语句。例子:<script>fromrandomimportrandom</script><script>r=random()*100</script><ifexpr="r>75"><callfunction="'Function1'"/><elseifexpr="r>50"><callfunction="'Function2'"/></elseif><elseifexpr="r>25"><callfunction="'Function3'"/></elseif><else><callfunction="'Function4'"/></else></if>fromrandomimportrandom表示加载random模块中的random函数,第一个random是Python中的一个模块名称,第二个random是random模块中的一个函数的名称。random函数生成0-1之间的随机数。我们看到,上面这段程序对不同的情况进行了不同的处理。如果r大于75执行函数function1,如果r在50-75之间执行函数Function2,如果r在25-50之间执行函数function3,如果r在0-25之间执行函数Function4。4.6执行测试用例4.6.1<testcase>标签作用:<testcase>是用来执行测试用例的一个标签,STAX就是执行自动化测试的,因此<testcase>标签是非常重要的一个标签。<testcase>有一个属性name用于表明测试用例的名称。<testcase>要和<tcstatus>标签联合使用。<tcstatus>是用于标明本次测试状态的一个标签。<tcstatus>有一个属性result,<tcstatusresult="'pass'"/>表示测试通过,<tcstatusresult="'fail'"/>表示测试失败。例子:脚本testcase.xml定义如下:<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><!DOCTYPEstaxSYSTEM"stax.dtd"><stax><functionname="test"><sequence><script>fromrandomimportrandintr=randint(1,100)</script><stafcmd><location>'local'</location><service>'DELAY'</service><request>'DELAY2000'</request></stafcmd><return>r</return></sequence></function></stax>脚本test.xml定义如下:<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><!DOCTYPEstaxSYSTEM"stax.dtd"><stax><defaultcallfunction="begin_tests"/><script>ImportMachine='local'ImportDirectory='{STAF/Config/STAFRoot}/services/stax/samples'</script><functionname="begin_tests"><sequence><importmachine="'local'"file

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论