• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

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

发布: 2009-10-21 10:13 | 作者: 李刚 | 来源: 本站原创 | 查看: 560次 | 进入软件测试论坛讨论

领测软件测试网

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>
  <location>'local'</location>
  <command>'ftp'</command>
  <parms>'-s:ftpSample.conf'</parms>
  <workdir>'C:/STAF'</workdir>
</process>
      

process标签表示调用STAF的进程服务(process),location表示请求被发送的目标机器,command表示需要执行的进程,而parms表示传递给进程的参数,workdir表示进程运行的工作目录。

通过FTP脚本和STAX脚本,我们可以控制STAX来自动下载FTP上的源代码。

3.2 CVS下载

和FTP类似,CVS源码下载也使用命令行的方式,但由于CVS服务器使用的协议不同,对CVS客户端的要求也不同,因此我们在这里不再介绍如何使CVS客户端工作的内容。假定我们能够使用如下的命令更新CVS代码: cvs -d :ext:username@cvs.ibm.com:/cvsroot/ checkout -d directory modulename .

根据这个CVS命令,调用此命令更新CVS代码的STAX脚本如下:


代码6:调用FTP命令的STAX脚本

               
<process>
  <location>'local'</location>
  <command>'cvs'</command>
  <parms>'-d :ext:username@cvs.ibm.com:/cvsroot/ checkout -d directory modulename'</parms>
  <workdir>'C:/CVS'</workdir>
  <stdout>'C:/CVS/cvsupdate.log'</stdout>
</process>
      

与代码 5 不同的是,代码 6 使用了stdout 标签,此标签表示将进程 cvs 的输出重定向到 cvsupdate.log 中,以便于我们查看 cvs 命令执行的状态和结果。

3.3 拷贝编译源码

从 CVS 和 FTP 上下载源码之后,需要将源码拷贝到编译服务器上。本节介绍如何使用 STAF 的文件传输命令以及 STAX 的循环指令。


代码 7:传输文件的 STAX 脚本

               
<script> directoryList = ['CVSDirectory', 'FTPDirectory'] </script>
  <iterate var = "directory" in="directoryList">
    <testcase name = "'sourceCopy'">
      <sequence>
        <stafcmd>
          <location>'local'</location>
          <service>'fs'</service>
          <request>'copy DIRECTORY C:/Source/%s TODIRECTORY /root/build/%s TOMACHINE
            buildserver RECURSE KEEPEMPTYDIRECTORIES'  % directory % directory</request>
        </stafcmd>
      </sequence>
    </testcase>
</iterate>
      

代码 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:编译源码的 STAX 脚本

               
<stafcmd>
  <location>'buildserver'</location>
  <service>'process'</service>
  <request>'start command "/root/build/build.sh" username "root" password "password"
    workdir "/root/build" wait stdout /root/build/build.log'</request>
</stafcmd>
      

代码 8 指定以用户 root 的身份来运行编译脚本 build.sh,并且将输出重定向到文件 build.log 中,以便分析编译运行的过程和结果。另外如果编译脚本 build.sh 用到某些和路径相关的命令,比如相对路径,则需要指定工作目录。 workdir 指定工作目录为 build.sh 所在的目录,这相当于在 /root/build 目录中运行 build.sh 命令。

3.4 部署测试

更新包编译完成后,需要将编译之后的更新包分发到部署服务器和测试服务器,然后部署服务器部署程序,测试服务器调用测试程序来测试更新包。将更新包分发到部署和测试服务器的 STAX 脚本如代码 9 所示。


代码 9:更新包分发

               
<script> serverList = ['deployServer', 'testServer'] </script>
<iterate var = "server" in="serverList">
  <testcase name = "'buildCopy'">
    <if expr="server != 'deployServer'">
      <stafcmd>
        <location>'buildserver'</location>
        <service>'fs'</service>
        <request>'copy DIRECTORY /root/build/result TODIRECTORY /root/build/result
          TOMACHINE %s RECURSE KEEPEMPTYDIRECTORIES'  % server </request>
      </stafcmd>
    <else>
      <stafcmd>
        <location>'buildserver'</location>
        <service>'fs'</service>
        <request>'copy DIRECTORY /root/build/result TODIRECTORY C:/build/result
          TOMACHINE %s RECURSE KEEPEMPTYDIRECTORIES'  % server </request>
      </stafcmd>
    </else>
    </if>
  </testcase>
</iterate>
      

代码9使用了判断语句来判断目标机器的平台,根据目标机器的平台选择不同的文件路径。当只有两台机器时,使用 if-else 的好处并不明显,甚至还不如分别向 windows 和 linux 机器上单独拷贝方便。 但考虑如下的情况,环境中有大量的部署服务器和测试服务器,这时一台一台的拷贝显然很难维护,而使用 if-else 加上循环的方式则要方便的多。

部署测试的 STAX 脚本如代码 10 所示。


代码 10:部署测试

               
<sequence>
  <stafcmd>
    <location>'deployServer'</location>
    <service>'process'</service>
    <request>'start command "C:/build/deploy.bat > deploy.log" username "Administrator"
      password "password" workdir "C:/build" wait '</request>
  </stafcmd>
  <stafcmd>
    <location>'testServer'</location>
    <service>'process'</service>
    <request>'start command "/root/build/runtest.sh" username "root" password "password"
      workdir "/root/build" wait stdout /root/build/runtest.log'</request>
  </stafcmd>
</sequence>
      

代码 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 标签不能返回

               
<process>
  <location>'linuxServer' </location>
  <command>'ls'</command>
  <parms>'-l'</parms>
</process>
      

代码 11 调用 Linux 机器上的 ls 命令,并且传给 ls 命令 -l 参数。使用 STAXMonitor 执行此脚本,任务始终无法返回。因此推荐使用 stafcmd 标签直接调用 STAF 服务,如代码 12 所示。


代码 12:修改后的任务

               
<stafcmd>
  <location>'linuxServer'</location>
  <service>'process'</service>
  <request>'start command "ls" parms "-l" wait '</request>
</stafcmd>
      

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 所示。


图3. STAXMonitor 运行界面


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\Services\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.总结

STAF提供了一个自动化测试的平台,帮助我们进行自动化测试的更新、编译、部署和测试。STAX为STAF提供了一个执行引擎,帮助加快STAF程序的开发和部署。 因此利用STAF和STAX可以减少测试的工作量和复杂度,加快软件测试的流程,缩短测试周期。

 

 

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

22/2<12

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网