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/