利用 STAF 实现程序更新包的自动部署测试


利用 STAF 实现程序更新包的自动部署测试
2011年02月11日
  如今软件开发依赖于集体的开发和测试 。对于部署和测试人员来说,如何从集中的代码管理工具来获取源代码或者代码的编译包并且自动部署和测试变得非常重要。本文借助于 STAF(STAX) 和 FTP 以及 CVS 工具介绍如何自动从 FTP 或者 CVS 下载 程序的更新包,并且部署到测试环境中。本文首先对自动化测试 框架Software Test Automation Framework (STAF)和Software Test Automation eXecution Engine (STAX)进行简要的介绍,然后简单介绍如何安装和配置STAF(STAX)。其次本文将结合一个场景重点介绍STAF(STAX)如何利用CVS和 FTP工具进行源代码的下载、编译、分发、部署和测试。最后本文列出了使用STAF(STAX)的经验和教训。         读者可以从本文了解到 STAF(STAX) 的基本概念和用法。本文适合 STAF 的初学者。
  1.STAF(STAX)         Software Test Automation Framework (STAF) 是开源、跨平台、支持多语言并且基于可重用的组件来构建的自动化测试框架。它为自动化测试建立了基础,并且提供了一种可插拨的机制支持不同的平台和语言。 STAF 采用点对点的实现机制,被用来减轻自动化测试的工作 负担,加快自动化测试的进程。在 STAF 的环境中,所有的机器都是对等的,没有客户端和服务器的区分。         Software Test Automation eXecution Engine (STAX)是基于 STAF 的执行引擎。它在 STAF 的基础上,帮助用户实现测试用例 的分发、部署、执行以及结果分析。STAX 使用了三种技术 :STAF, XML 和 Python。简单来说,STAX 在 STAF之 上提供了一些接口,方便用户来操纵STAF进行自动化测试的实现。         我们将简要介绍一下 STAF 和 STAX 中所用到的概念和机制。
  1.1 Services (服务)
  STAF 基于可重用的组件来构建自动化测试框架,这些可重用的组件就是 Services(服务)。STAF 中所有的组件都是服务。服务是一系列功能的集合。STAF 本身是一个后台程序 (STAFProc),提供一种轻量级的分发机制,负责把请求转发给这些服务。
  STAF 中的服务分为两种:internal (内部服务)和 external(外部服务)。内部服务被集成进 STAFProc 中,提供一些关键性的功能,比如数据管理和同步。外部服务由 STAFProc 动态装入,通过共享库(shared libraries)来访问。
  STAF 提供了如下几种常用服务: 程序调用服务(Process Service):内部服务,利用此服务,STAF 可以调用外部程序。
  文件系统服务(FileSystem Service):内部服务,利用此服务,STAF 可以对文件系统进行操作,比如复制,删除,查看等操作。
  日志 服务(Log Service):外部服务,帮助用户进行日志的记录和查看。
  资源池服务(ResPool Service):外部服务,提供了对于资源池的管理和操作,如查看,创建和删除操作。
  监控服务(Monitor Service):外部服务,提供对于 STAF 运行时的监控功能。
  信号量服务(Sem Service):内部服务,提供了两种信号量的操作,mutex 和 event。
  压缩服务(Zip Service):外部服务,提供了压缩和解压的功能。
  Ping服务(Ping Service):内部服务,类似于操作系统 的 ping 功能,用于检测远程的 STAF 是否运行。
  变量服务(Var Service):内部服务,提供对于系统或者用户级别的环境变量的操作。
  STAF 还提供了延迟(Delay Service), 帮助(Help Service), 跟踪(Trace Service)等服务,这里不一一列举。
  1.2 请求-响应格式         每个服务都定义了它能接受的请求格式。STAF 通过请求来调用服务的功能,每个请求都以字符串的形式发送,这样可以保证 STAF 能够跨平台的运行。 每个请求都有三个参数,以系统-服务-参数的形式出现。第一个参数表示此请求需要被发送到的 STAF 系统,这个参数被 STAFProc 解析以便确定请求应该被本地处理还是发送到其他 的 STAF 系统。 当这个请求被发送到需要处理的 STAF 系统后,STAFProc 解析第二个参数来判断哪个服务会被调用。最后,STAFProc 会把第三个参数转发给需要调用的服务,服务处理这个请求。         当处理完请求后,服务会返回两种数据:返回码和特定于请求的信息。返回码表示服务处理的结果。特定于请求的信息表示服务返回的具体数据,如果请求成功返回,这些信息将包括这次请求所请求的数据,如果请求出现错误,这些信息将包含额外的诊断信息。
  完全使用字符串作为请求响应格式可以简化 STAF 的很多方面,包括与其他语言的接口,服务之间的通信,跨平台的操作等。 其他语言只需要通过一个接口 STAFSubmit() 来请求 STAF 的服务,并且只需传递三个字符串参数。服务之间也只需要通过字符串发送接收请求。
  1.3 STAX
  STAX 是基于 STAF 的执行引擎,它提供了一种 XML 格式的工作流语言。用户可以编写 XML 的脚本文件来通过 STAX 调用 STAF 的服务已完成自动化测试。用户可以不需要和编程语言打交道就可以开发出自己的自动化测试环境。STAX 提供如下的功能:支持并行运行,用户自定义的运行控制粒度,嵌套测试用例,控制运行时间,支持现有的 Java 和 Python 模块等。STAX 还提供了一个图形化的监控工具,通过这个工具,用户可以清晰的看出测试运行的位置,状态和出错信息等。 下面我们将通过与 FTP 和 CVS 的协作完成自动化部署来展示 STAF 和 STAX 的功能。
  2.STAF(STAX) 安装配置         STAF 的安装文件可以从STAF 的网站 下 载。对于不同的平台和 JVM 环境有不同的安装文件,请选择合适的文件下载。如果下载的是 jar 文件,要确保需要安装 STAF 的机器上已经安装有相应的 JRE,然后运行如下命令安装 STAF:java -jar STAF安装文件.jar。 如果下载的是可执行文件,则直接运行即可。         STAF 的安装比较简单,只需要按照向导提示进行操作即可。安装完毕后,可以通过 STAFProc 命令启动 STAF。关闭 STAF 可以用如下的命令: staf local shutdown shutdown。从这条命令我们可以看出上面提到的 STAF 的命令格式。local 表示 STAF 的本地系统,shutdown 表示服务, 此服务提供了 STAF 的关闭操作。第二个 shutdown 表示传递给服务的参数,指示 STAF 把本地的 STAF 服务关闭。         STAX 的安装文件也可以从STAF 的网站 下载。STAX 本身不需要安装,只需要更改 STAF 的配置文件以便 STAF 在启动的时候能够加载 STAX 服务。 从这个角度来说,STAX 是 STAF 的一种外部服务,可以根据需要来决定是否加载它。         下载完 STAX 后,将其解压到 $STAF_Install_Directory\services\stax 目录中,然后更改 STAF 的配置文件 STAF.cfg。此文件在 $STAF_Install_Directory\bin 目录下。在 STAF.cfg 文件末尾加上如下的代码,然后重启 STAF。
  代码1:STAX配置
  SERVICE STAX LIBRARY JSTAF EXECUTE \
  {STAF/Config/STAFRoot}/services/stax/STAX.jar  OPTION J2=-Xmx384m
  SERVICE EVENT LIBRARY JSTAF EXECUTE \
  {STAF/Config/STAFRoot}/services/stax/STAFEvent.jar
  SET MAXQUEUESIZE 10000
  STAF重启之后,运行命令staf local service list ,查看输出结果,如果显示有STAX和EVENT,如图1所示,则说明STAX已经成功加载。
  图 1. STAF 服务列表
  
  SERVICE STAX LIBRARY JSTAF EXECUTE {STAF/Config/STAFRoot}/services/stax/STAX.jar通知STAF在启动时以名字STAX(这样在STAF服务 列表中,我们看到的STAX的服务名字就叫做STAX)来加载STAX.jar,也就是STAX服务。 传递的参数J2=-Xmx384m表示更改JVM的堆栈大小。如果STAX会出现OutOfMemory错误,则需要调整这个参数,增加JVM的堆栈大 小。 建议在加载STAX时总是指定这个参数,并且根据系统环境来调整参数大小。
  SERVICE EVENT LIBRARY JSTAF EXECUTE {STAF/Config/STAFRoot}/services/stax/STAFEvent.jar通知STAF在启动时以名字EVENT来加载STAFEvent.jar。
  如果需要在运行STAX的机器上运行STAX Monitor (STAX任务的监控工具),则需要设置MAXQUEUESIZE,以保证STAXMonitor能够正确运行。
  2.1 STAF Java 代码示例
  代码2所示的是STAF Java代码示例。 代码2:STAF Java代码示例
  STAFHandle handle = null;
  try {
  handle = new STAFHandle("Java_Sample_Test");
  } catch (STAFException e) {
  System.exit(1);
  }
  STAFResult result = handle.submit2("Linux1", "process",
  "start command ls parms -l wait stdout /root/lsjava.log");
  if (result.Ok != result.rc) {
  System.out.println("Error starting the process ls, RC:  " + result.rc);
  }
  result = handle.submit2("Linux1", "fs", "copy FILE /root/lsjava.log
  TODIRECTORY C:/STAF TOMACHINE windows' % machineName");
  if (result.Ok != result.rc) {
  System.out.println("Error coping file, RC: " + result.rc);
  }
  在调用STAF服务之前,首先需要注册STAFHandle,所有的STAF服务调用都要通过这个句柄来进行,因此一般把这个句柄设置成静态的。通过handle.submit2()函数可以向STAF服务发送请求并且接收处理结果。
  2.2 STAX脚本示例
  STAX为我们简化了调用STAF服务的过程,因此我们通过STAX脚本来调用STAF服务。本节将根据一个简单的示例来简要介绍STAX脚本的语法。 代码3:STAX脚本SampleScript.xml示例 1 
  2  
  3 
  7 
  8  LinuxMachine = ['Linux1', 'Linux2'] 
  9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 '%s' % machineName
  17 'process'
  18 'start command "ls" parms "-l" wait stdout /root/ls.log'
  19 
  39  
  40 
  41 
  这个示例调用两台Linux机器上的ls命令,将结果输出到文件,根据命令返回的结果判断调用是否成功,然后复制文件到另外的STAF机器中。为了方便描述,为脚本加上行号。
  STAX采用现在流行的XML语言作为其脚本语言。第一行是XML语言的标准格式,第二行表示此XML文件使用stax.dtd样式表进行验证。所有的STAX脚本文件都应该保留这两行。
  3-6行是XML的注释,用来描述这个脚本的功能。         第7行是STAX脚本命令的开始符,所有STAX脚本内容都要用它起始。第8行中script 类似于编程语言中的定义变量的语句,在这里定义一个长度为2的数组LinuxMachine,其值为Linux1和Linux2。         第9-10行指定STAX脚本运行时调用的函数。第11-40行是函数的定义体。11行指定函数名为ListDirectory。         第12-39行定义一个循环,类似于Java中的for,但是这个循环是并行的。var="machineName" in="LinuxMachine" 表示此循环从LinuxMachine数组中获得输入,并且赋给machineName变量。         13行定义测试用例,在STAX脚本的运行中,可以根据运行结果来决定测试用例的结果,方便用户查看。
  第14-37行表示其中的STAX脚本是顺序执行的。15-19行执行具体的STAF命令,其中location指定需要运行STAF命令的机器,可以由 变量来动态指定,比如'%s' % machineName。 service表示需要调用的服务,在这里为process进程服务。request为需要传递给服务的参数。进程服务的参数分为几部分,首先是需要调用 的命令"ls",parms指定需要传递给"ls"的参数"-l"。 wait表示需要等待这个命令结束才能返回。stdout表示将命令运行的结果输出到文件中去。          20-31行判断上个命令的返回结果,并根据返回结果的值设定测试用例的状态,并且记录日志以及将消息发送到STAFMonitor。expr="RC==0" 判断返回结果是否为0。 RC表示上个命令的返回结果,0表示命令执行成功。 设置测试用例状态为通过,fail则表示测试用例失败。 表示不仅将消息记录到STAX的日志中,而且将其发送到STAFMonitor(如果STAFMonitor处于运行状态)。          32-36行是STAF的文件拷贝命令。fs表示文件系统服务,copy FILE指定复制文件操作,TOFILE指定目标文件的名字,STAX会用命令后面的参数% machineName替换%s,因此目标文件的名字为lsLinux1.log和lsLinux2.log。 TODIRECTORY指定目标文件夹,TOMACHINE指定目标机器。          上述STAX脚本可以用staf local stax execute file SampleScript.xml wait 执行,或者通过java -jar STAXMon.jar 启动STAXMonitor来调用。 3.自动部署更新包 图2. STAF(STAX)环境拓扑
  
  图2是本节将要介绍的简化的场景图。软件开发分为两部分,一部分是在CVS上的最新的软件源码,另外一部分是在FTP服务器上的执行脚本。在 STAF(STAX)自动部署更新包的过程中,STAX需要同时从CVS和FTP上下载最新的代码和安装脚本。 测试环境中,测试机器上都装有STAF,并且在从CVS和FTP下载代码的机器上安装有STAX。
  STAX下载完代码后,将代码拷贝到用于编译的服务器上。因为代码的编译需要特殊的环境,比如需要WAS (WebSphere Application Server) 的环境,因此我们把STAX服务器和编译服务器分开。 编译服务器编译好源码之后,将其分发到部署和测试服务器上。部署服务器负责向应用程序服务器部署程序,而测试服务器则用来进行自动化测试。 
  本节根据这个场景介绍如何通过STAF(STAX)来实现部署和测试的自动化。
  3.1 FTP脚本
  STAF(STAX)实现了自动化测试的框架,但并没有实现具体的常用功能,比如FTP, CVS。因此我们需要借助FTP命令来完成FTP源码的下载。自动化下载一般通过命令行实现,因此我们使用Windows自带的FTP命令来完成。
  FTP命令提供了一个参数-s,可以指定一个FTP脚本文件来存放将要执行的FTP命令。因此我们把需要执行的FTP命令存放到某个文件,然后通过STAX调用FTP命令实现FTP上源码的自动下载。 代码4:FTP脚本(ftpSample.conf)示例
  open ftp.ibm.com
  username
  password
  binary
  prompt
  cd /code/latest/unix
  lcd C:\latest\unix
  mget *
  bye
  这个FTP脚本表示以用户名username,密码password访问ftp.ibm.com,设置传输方式为binary,然后下载/code/latest/unix下的文件到本地目录C:\latest\unix。可以通过ftp -s:ftpSample.conf 来运行此脚本。         调用ftp命令的STAX脚本如下所示: 代码5:调用FTP命令的STAX脚本         process标签表示调用STAF的进程服务(process),location表示请求被发送的目标机器,command表示需要执行的进程,而parms表示传递给进程的参数,workdir表示进程运行的工作目录。 
  通过FTP脚本和STAX脚本,我们可以控制STAX来自动下载FTP上的源代码。
  3.2 CVS下载         和FTP类似,CVS源码下载也使用命令行的方式,但由于CVS服务器使用的协议不同,对CVS客户端的要求也不同,因此我们在这里不再介绍如何使CVS客户端工作的内容。假定我们能够使用如下的命令更新CVS代码: cvs -d :ext:[email protected]:/cvsroot/ checkout -d directory modulename .          根据这个CVS命令,调用此命令更新CVS代码的STAX脚本如下: 代码6:调用FTP命令的STAX脚本         与代码 5 不同的是,代码 6 使用了stdout 标签,此标签表示将进程 cvs 的输出重定向到 cvsupdate.log 中,以便于我们查看 cvs 命令执行的状态和结果。 
  3.3 拷贝编译源码
  从 CVS 和 FTP 上下载源码之后,需要将源码拷贝到编译服务器上。本节介绍如何使用 STAF 的文件传输命令以及 STAX 的循环指令。 代码 7:传输文件的 STAX 脚本   directoryList = ['CVSDirectory', 'FTPDirectory'] 
  
  
  
  
  'local'
  'fs'
  'copy DIRECTORY C:/Source/%s TODIRECTORY /root/build/%s TOMACHINE 
  buildserver RECURSE KEEPEMPTYDIRECTORIES' % directory % directory
  
  
  
  
  代码 7 拷贝 CVS 和 FTP 源码到编译服务器中。script 标签定义了一个数组 directoryList,这个数组有两个值,分别表示 CVS 源码目录和 FTP 目录。iterate 定义了一个顺序循环,分别从 CVS 目录和 FTP 目录拷贝文件到编译服务器中。 stafcmd 标签调用 STAF 命令,此处我们调用的是 FS(文件系统)服务。copy DIRECTORY 表示我们需要拷贝整个目录到编译服务器中。 如果编译服务器已经有原来的代码,为了正确起见,可以在拷贝之前使用 fs delete entry 命令来删除原有的文件。   拷贝文件后,需要通知编译服务器对更新后的源码进行编译。假定在编译服务器上存在用于编译源码的脚本文件 /root/build/build.sh,则调用此脚本文件编译源码的 STAX 脚本如代码 8 所示。
  代码 8 指定以用户 root 的身份来运行编译脚本 build.sh,并且将输出重定向到文件 build.log 中,以便分析编译运行的过程和结果。另外如果编译脚本 build.sh 用到某些和路径相关的命令,比如相对路径,则需要指定工作目录。 workdir 指定工作目录为 build.sh 所在的目录,这相当于在 /root/build 目录中运行 build.sh 命令。 
  3.4 部署测试
  更新包编译完成后,需要将编译之后的更新包分发到部署服务器和测试服务器,然后部署服务器部署程序,测试服务器调用测试程序来测试更新包。将更新包分发到部署和测试服务器的 STAX 脚本如代码 9 所示。 代码 9:更新包分发   serverList = ['deployServer', 'testServer'] 
  
  
  
  
  'buildserver'
  'fs'
  'copy DIRECTORY /root/build/result TODIRECTORY /root/build/result 
  TOMACHINE %s RECURSE KEEPEMPTYDIRECTORIES' % server 
  
  
  
  'buildserver'
  'fs'
  'copy DIRECTORY /root/build/result TODIRECTORY C:/build/result 
  TOMACHINE %s RECURSE KEEPEMPTYDIRECTORIES' % server 
  
  
  
  
  
  代码9使用了判断语句来判断目标机器的平台,根据目标机器的平台选择不同的文件路径。当只有两台机器时,使用 if-else 的好处并不明显,甚至还不如分别向 windows 和 linux 机器上单独拷贝方便。 但考虑如下的情况,环境中有大量的部署服务器和测试服务器,这时一台一台的拷贝显然很难维护,而使用 if-else 加上循环的方式则要方便的多。
  部署测试的 STAX 脚本如代码 10 所示。 代码 10:部署测试  
  
  'deployServer'
  'process'
  'start command "C:/build/deploy.bat > deploy.log" username "Administrator" 
  password "password" workdir "C:/build" wait '
  
  
  'testServer'
  'process'
  'start command "/root/build/runtest.sh" username "root" password "password" 
  workdir "/root/build" wait stdout /root/build/runtest.log'
  
  
  代码 10 中在 Windows 和 Linux 平台运行命令的方式有细微的区别,在 Windows 中我们使用> deploy.log 来重定向输出,而在 Linux 中我们使用 stdout 来重定向输出。具体的原因将在经验教训中说明。         至此,我们已经完成了更新包下载、分发、编译、部署和测试的整个过程,根据本节提供的示例代码,读者应该能够根据自己的环境编写出适合环境的STAX脚 本。 另外,读者也可以自定义一些附加的操作,比如在更新代码之前,先把原有的代码删除;在测试完毕后,把分散于各个服务器上的日志汇总到一台集中的机器上;甚 至和 CruiseControl 结合实现定时或者基于 CVS 上的代码更新来运行,以及将测试的日志发布到某台服务器上。
  4.经验教训
  虽然现在 STAF(STAX) 已经比较完善,但在实际使用的过程中,我们还是发现了一些问题。本节介绍这些问题以及解决或者避免这些问题的方法,使读者在碰到这些问题时能够及时的解决它们。
  4.1 使用 STAFCMD 的 process 服务,不要使用 STAX 的 process 标签
  为了编写 STAX 脚本方便,STAX 定义了 process 标签用来调用 STAF 中的进程(process)服务。但在使用过程中,发现 STAX 的 process 标签在某些情况下存在着一定的问题,其所调用的进程不能返回。 代码 11 的 STAX 脚本就是这样一个例子。 代码 11:process 标签不能返回         代码 11 调用 Linux 机器上的 ls 命令,并且传给 ls 命令 -l 参数。使用 STAXMonitor 执行此脚本,任务始终无法返回。因此推荐使用 stafcmd 标签直接调用 STAF 服务,如代码 12 所示。  代码 12:修改后的任务  4.2 在 Windows 平台上不要使用 STDOUT 重定向输出
  STAF 使用 STDOUT 来为启动的进程重定向输出,类似于>参数,比如 ls -l > ls.log。但在 Windows 平台使用中,我们发现使用 STDOUT 会带来一些问题。 如果调用的进程为批处理文件,并且此批处理文件中包含某些特定的功能,比如 xcopy,则 xcopy 将不会工作。另外一些检查目录和文件的命令也不能与 STDOUT 共存。在 Linux 环境中并不存在这样的问题。因此,如果需要在 Windows 平台中使用重定向输出的功能时,建议使用>来重定向输出。
  4.3 使用 STAXMonitor 监控任务的执行情况
  对于 STAF 和 STAX 新手来说,尽可能使用 STAXMonitor 来监控 STAX 任务的执行情况。STAXMonitor 为我们提供了足够详细的信息,比如测试用例的执行结果,任务执行的消息,当前执行的命令。 使用 STAXMonitor 有助于我们对正在进行的任务进行分析并且监控其执行情况和结果。  STAXMonitor 在 STAX 安装文件中,可以用java -jar STAXMon.jar 来启动 STAXMonitor。STAXMonitor 的界面如图 3 所示。 
  
  STAXMonitor 会显示当前正在运行的 STAX 任务,任务号,任务名字,功能,开始时间,执行时间以及结果。Monitored 表示是否正在使用 STAXMonitor 来监控任务。 右键单击任务,然后选择 Start monitoring,将出现如图 4 所示的监控界面。 图 4. STAXMonitor 监控界面
  
  监控界面会显示正在运行的进程或者STAF命令,命令的详细信息,比如开始时间、进程或者命令的参数,状态等。另外还显示测试用例的状态。通过STAXMonitor,我们可以很好的监控STAX任务的执行情况。
  4.4 将 STAF 注册为 Windows 平台上的服务
  STAF 并没有提供开机自动启动的功能,在 Windows 平台上,只有当某个用户登录后,才会启动 STAF。这对于自动化测试的环境来说不是一个好消息。 因此我们需要自动启动 STAF 的功能,这在 Linux 上比较简单,只要在 /etc/rc.d/rc.local(如果是 SuSE Linux,就是 /etc/rc.d/boot.local)中加入 STAF 的启动命令/usr/local/staf/bin/STAFProc &就可以了。 Windows 平台上就没有那么方便,因此本小节介绍如何将 STAF 注册为 Windows 的服务,以便能开机自动重启。  首先使用 instsrv 命令注册一个基本的服务 STAF:instsrv STAF c:\winnt\system32\srvany.exe。 
  打开注册表编辑器(regedit),找到键值 My Computer\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\S ervices\STAF。在 STAF 下创建一个键,名字为 Parameters。 
  在 Parameters 键下面,创建一个字符串值(String Value),名字为 Application,值为 STAFProc 的完整路径,比如 C:\STAF\bin\STAFProc.exe。 
  使用命令services.msc启动Windows服务窗口,找到STAF,右键选择属性,然后定位到登录窗口,选择"允许服务与桌面交互"。 
  使用命令net start staf或者重启机器来启动STAF服务。 
  使用命令staf local service list来验证STAF是否已经成功启动。 
  5.总结

猜你喜欢

转载自noa92noa.iteye.com/blog/1363101