发布新日志

  • 【转载】利用 STAF 实现程序更新包的自动部署测试

    2010-04-19 14:54:23

    文档选项
    '); //--> '); //-->
    将打印机的版面设置成横向打印模式

    打印本页

    将打印机的版面设置成横向打印模式

    打印本页

    将此页作为电子邮件发送

    将此页作为电子邮件发送

    将此页作为电子邮件发送

    将此页作为电子邮件发送


    级别: 中级

    崔 俊涛 (cuijunt@cn.ibm.com), 软件工程师, IBM

    2007 年 10 月 25 日

    如今软件开发依赖于集体的开发和测试。对于部署和测试人员来说,如何从集中的代码管理工具来获取源代码或者代码的编译包并且自动部署和测试变得非常重要。本文借助于 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 服务列表
    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 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    2 <!DOCTYPE stax SYSTEM "stax.dtd">        
    3 <!-- sample1.xml - Sample of a job definition file for STAX
    4 Job Description:
    5   This job executes some STAF commands and sends messages to the STAX Job Monitor.
    6 -->
    7  <stax>
    8   <script> LinuxMachine = ['Linux1', 'Linux2'] </script>
      
    9   <defaultcall function="ListDirectory">
    10   </defaultcall>
      
    11   <function name="ListDirectory">
        
    12     <paralleliterate var = "machineName" in="LinuxMachine">
    13       <testcase name = "'listDirectory'">
    14         <sequence>
              
    15           <stafcmd>
    16             <location>'%s' % machineName</location>
    17             <service>'process'</service>
    18             <request>'start command "ls" parms "-l" wait stdout /root/ls.log'</request>
    19           </stafcmd>
              
    20           <if expr="RC == 0">
    21             <sequence>
    22               <tcstatus result="'pass'"/>
    23               <log message="1">'List directory successfully on %s' % machineName</log>
    24             </sequence>
    25             <else>
    26               <sequence>
    27                 <tcstatus result="'fail'"/>
    28                 <log message="1">'Error in listing directory on %s' % machineName</log>
    29               </sequence>
    30             </else>
    31          </if>
    
    32           <stafcmd>
    33             <location>'%s' % machineName</location>
    34             <service>'fs'</service>
    35             <request>'copy FILE /root/ls.log TOFILE ls%s.log TODIRECTORY C:/STAF 
                        TOMACHINE windows' % machineName</request>
    36           </stafcmd>
    
    37         </sequence>
    38       </testcase>
    39     </paralleliterate>	
    40   </function>
    41 </stax>
          

    这个示例调用两台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表示命令执行成功。<tcstatus result="'pass'"/>设置测试用例状态为通过,fail则表示测试用例失败。<log message="1"> 表示不仅将消息记录到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)环境拓扑
    STAF环境示意图

    图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>
      <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 界面

    STAXMonitor 会显示当前正在运行的 STAX 任务,任务号,任务名字,功能,开始时间,执行时间以及结果。Monitored 表示是否正在使用 STAXMonitor 来监控任务。 右键单击任务,然后选择 Start monitoring,将出现如图 4 所示的监控界面。


    图 4. STAXMonitor 监控界面
    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 的服务,以便能开机自动重启。

    1. 首先使用 instsrv 命令注册一个基本的服务 STAF:instsrv STAF c:\winnt\system32\srvany.exe
    2. 打开注册表编辑器(regedit),找到键值 My Computer\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\STAF。在 STAF 下创建一个键,名字为 Parameters。
    3. 在 Parameters 键下面,创建一个字符串值(String Value),名字为 Application,值为 STAFProc 的完整路径,比如 C:\STAF\bin\STAFProc.exe。
    4. 使用命令services.msc启动Windows服务窗口,找到STAF,右键选择属性,然后定位到登录窗口,选择“允许服务与桌面交互”。
    5. 使用命令net start staf或者重启机器来启动STAF服务。
    6. 使用命令staf local service list来验证STAF是否已经成功启动。





    回页首


    5.总结

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

    本文仅代表作者本人观点,不代表IBM公司观点。



    参考资料

    学习

    获得产品和技术

    讨论


    关于作者

    崔俊涛是 IBM 上海全球实验室的软件工程师。在SAL_FIT部门工作,现正致力于自动化测试的开发和研究。他感兴趣的技术有 SOA, EAI。你可以通过邮件 cuijunt@cn.ibm.com 与他联系。



    崔俊涛是 IBM 上海全球实验室的软件工程师。在SAL_FIT部门工作,现正致力于自动化测试的开发和研究。他感兴趣的技术有 SOA, EAI。你可以通过邮件 cuijunt@cn.ibm.com 与他联系。

  • 【转载】WatirGrid介绍

    2010-04-16 09:28:11

    分布式Rubydrb也叫dRuby)是Ruby的远程方法调用库,它允许Ruby进程之间显式交互在相同或者不同机器上。Tuple space(元组空间)是并行/分布计算示例的一种共享存储实现,其Ruby实现是RindaRinda::Ring允许drb服务和客户端自动相互发现而无需知道它们各自的位置,drb服务器用RingServer注册它们自己,这样就能允许客户端找到它们所需要的服务器了。RingServer持有被用作分布式服务的命名系统的TupleSpace

     

    Going Parallel … distributed testing across a grid network using Watir就用上述技术实现了分布式自动化界面测试框架WatirGrid,它能够同时在多个操作系统上进行分布式网页测试,其中controller.rb实现了能同时被访问的tuple space仓库,providers.rb使远程Watir对象可用对Ring Server持有的tuple space。所用自动化基库自然是WatirYoutube提供了视频演示,此外作者还推荐了一本有益相关开发的书《Distributed Programming with Ruby》。

  • 【转载】ruby watir 整理

    2010-02-12 09:29:09

    异常对象识别(watir应用解决方案)

    watir基于处理,继承于web document的对象提供较好的支持方法,但相对于处理windows对象较弱. 就目前从各网站收集的对象来看, 基本上,对于在ie实例对象打开的web标准对象
    能够成功识别与操作,其它 的脱离当前ie窗口,打开的所有弹出框都不能正常识别。其中,弹出框对象占有异常对象识别中很大一部分。
    目前碰到的弹出框, 我把他们分为三大类型:
    1, alerts 警告作用,如:sorry, 当前用户没有权限操作
    2, confirm 需要操作按钮, 如:你确认要删除当前记录?
    3, prompt+ select +confirm  需要用户输入,操作查询或点击, 最后确认, 如:download/upload (浏览+选择文件)

    下面给出,上面几种弹出框watir实现识别与操作的方法,
    5.1. 弹出框基于autoit + 线程实现方式

    此种方法,对于第一、二种弹出框操作较有效,
    因点击某个link/button等对象,而弹出的窗口(大部分弹出框可应用此种方式来实现。)

    1, 定义方法

    def check_for_popups
        autoit = win32ole.new('autoitx3.control')
        #
       
        # do forever - assumes popups could occur anywhere/anytime in your application.
        loop do
            # look for window with given title. give up after 1 second.
          
            ret = autoit.winwait('消息 -- 网页对话框', '', 1)
            #ret = winactivate("microsoft internet explorer", "")
    #autoit.controlclick("microsoft internet explorer", "", "[class:button; instance:1]", 2)
          
            puts(ret)
            #
            # if window found, send appropriate keystroke (e.g. {enter}, {y}, {n}).
          
            if (ret==1) then autoit.send("{enter}") end
          
            #
            # take a rest to avoid chewing up cycles and give another thread a go.
            # then resume the loop.
            sleep(3)
        end
      end


    2, 程序体代码

    ie.button(:name, "signin").click_no_wait

    sleep(20)

    $popup = thread.new { check_for_popups }  # start popup handler

    at_exit { thread.kill($popup) }




    5.2. call 另一ruby 文件

    对于第二种弹出框,像安全警告点击, 并不通过操作与点击任何对象, 即呈现弹出窗口。
    我尝试用3.1方法来实现,不成功。用下面方法替代:


    1, 在watir/windowhelper.rb文件中增加方法

       def push_security_alert_yes_cn
            @autoit.winwait "安全警报", ""
            @autoit.send "{tab}"
            @autoit.send "{tab}"
            @autoit.send "{space}"
          end

    2, 定义另一调用文件 tmp.rb
    require 'watir/windowhelper'
    helper = windowhelper.new
    helper.push_security_alert_cn_yes


    3, 在打开安全url之前,启动调用ruby文件

    require 'rubygems'
    require 'watir'   # the watir controller
    require 'win32ole'
    require 'watir/windowhelper'


    thread.new{system('ruby c:\tmp.rb')} #你定义tmp文件存放路径
    ie = watir::ie.new
    ie.goto("http://www.alipay.com.cn/ ")
    5.3. 修改框架底层

    此种方法,针对弹出框3.

    举例一, 上传下载文件
    1, 修改底层代码input_elements.rb文件,
    类 filefield中, 方法set.
    为了支持中文,有一句替换修改为:

    system("rubyw -e \"require 'win32ole'; @autoit=win32ole.new('autoitx3.control');waitresult=@autoit.winwait ' 选择文件', '', 15; sleep 1; if waitresult == 1\" -e \"@autoit.controlsettext '选择文件', '', 'edit1', '#{setpath}'; @autoit.controlsend '选择文件', '', 'button2', '{enter}';\" -e \"end\"")


    2, 定义方法
    def save_file(filepath)
        ai = win32ole.new("autoitx3.control")
        ai.winwait("文件下载", "", 5)
        ai.controlfocus("文件下载", "", "保存(&s)")
        sleep 1
        ai.controlclick("文件下载", "", "保存(&s)", "left")
        ai.winwait("另存为", "", 5)
        sleep 1
        ai.controlsend("另存为", "", "edit1",filepath)
        ai.controlclick("另存为", "", "保存(&s)", "left")
        ai.winwait("下载完毕", "", 5)
        ai.controlclick("下载完毕", "", "关闭")
      end


    3, 程序体代码:
    ie.file_field(:name, "xlsfile").set("c:\\samenameobject.html")
    #上传你所指定的文件


    ie.span(:text, "导出excel表").click_no_wait
    save_file("c:\\abc.xls")
    #下载到你所指定的路径



    针对弹出框3, 需要用户介入查询并操作:
    举例二, 中供crm中类目与客户选择的弹出框,与第一种实现方式不同在于,
    用到autoit中winactivate与controlclick方法,


    require 'rubygems'
    require 'watir'   # the watir controller
    require 'watir/windowhelper'

    require 'win32ole'


    def check_for_popups

    autoit = win32ole.new('autoitx3.control')

    loop do
          ret = autoit.winwait("选择 -- 网页对话框", "", 1)
          puts ret
         if (ret==1) then
           autoit.winactivate("[class:internet explorer_tridentdlgframe]", "")
          autoit.send("{tab}")
          autoit.send("{tab}")

          #autoit.send("湖州")
          #autoit.send("{asc 2709}")
          #autoit.sendunicode("a")
          #autoit.clipput ("杭")
          #autoit.clipget
          #autoit.tooltip "this is a tooltip杭州", 0, 0
          #autoit.sleep 2000  
         
          autoit.send("{tab}")
          autoit.send("{tab}")
          autoit.send("{enter}")

          autoit.winactivate("[class:internet explorer_tridentdlgframe]", "")
          autoit.controlclick("选择 -- 网页对话框", "", "[class:internet explorer_tridentlstbox; instance:2]", 2)

          autoit.send("{tab}")
          autoit.send("{enter}")

          autoit.send("{tab}")
          autoit.send("{tab}")
          autoit.send("{tab}")
          autoit.send("{tab}")
          autoit.send("{enter}")
        end
        sleep(3)
      end

    end


    ie=watir::ie.new
    ie.goto("http://10.2.6.4:5100/bin/member/signin ")
    #ie.goto("http://10.2.6.4:5100/ ")


    #ie.element_by_xpath("//span[contains(text(), 'main road nijmegen')]").click

    ie.text_field(:name, "id").set("mhl1805")
    ie.text_field(:name, "password").set("zxcvbnm")

    ie.button(:name, "signin").click


    ie.frame(:name, "left").link(:url, "http://10.2.6.4:5100/v3/help_cust.htm").click

    ie.frame(:name, "left").link(:text, "新签中供客户").click

    # start popup handler


    ie.frame(:name, "right").frame(:name, "rtop").button(:value, "选择客户").click_no_wait
    sleep(20)

    $popup = thread.new { check_for_popups }

    at_exit { thread.kill($popup) }

    针对第三种popup window, 如果需要与用户交互,且需要输入中文时,若用autoit sendkey对待中文支持(但官方文档说支持中文输入, 网上有不少人和我遇到同样问题),尚没有找到有效方案,有待进一步跟进。

       除上述弹出框需要特殊处理外,watir中也有一些扩展tag,或第三方控件需要特殊处理的,
       像:
    5.4. web html编辑器
    中文站的html编辑器提供: 操作id或name操作起来较方便直接

    require 'rubygems'
    require 'watir'   # the watir controller
    require 'watir/windowhelper'
    require 'win32ole'
    ie=watir::ie.new

    ie=watir::ie.attach(:title, /阿里助手/)

    ie.text_field(:name, "_fmo.a._0.s").set("mhl1805")
    ie.document.getelementbyid("_editor").contentwindow.focus()
    ie.send_keys("abcsadfasfd")


    但也碰到有些web页面,不提供任何id,只能用autoit方法来send tab实现


    require 'rubygems'
    require 'watir'   # the watir controller
    require 'watir/windowhelper'
    require 'win32ole'




    ie=watir::ie.new

    #ie=watir::ie.attach(:title, /alibaba/)

    ie.goto('http://us.my.alibaba.com/product/buyoffer/post_buying_lead.htm')

    ie.text_field(:name, "_fmp.bu._0.su").set("mhl1805")
    ie.text_field(:name, "_fmp.bu._0.su").set("中国人")


    ie.checkbox(:id, "detaildesc").set
    ie.checkbox(:id, "detaildesc").focus()
    ie.send_keys("\t"*9)
    ie.send_keys('hello worldabcdef')


    5.5. 对象识别其它常用tag内置方法引用

    如:ie.div , ie.span, ie.cell, ie.table方法,可以实现点击操作,取值操作等.
    另外提供qtp 类似描述性编程,同类型对象统计:

    ie.buttons.each { |b| puts b.to_s }
    puts ie.checkboxes.length  
    puts ie.links.length
    puts ie.buttons.length等等

    对于常用的innertext属性, 在watir中已经封装到方法,可以直接引用。如:
    ruby在对象识别底层,封装了innertext
    实现,调用方法text即可:
    如:puts ie.div(:id, "intelligentword").link(:id, index.to_s).text

    最后:返回文本与源代码,用下面方法:
    puts ie.text()
    puts ie.html()

    5.6. 识别对象正则表达式支持

    当然,ruby提供强大的正则表达式支持,如:属性标识正则
    ie=watir::ie.attach(:title, /alibaba/)

    ruby的正则表达式以"//"作为基本框架,表达式内容位于"/"之间。表达式返回一个regexp的对象。
    表达式的一般规则:
    /a/匹配字符a。
    /\?/匹配特殊字符?。特殊字符包括^, $, ? , ., /, \, [, ], {, }, (, ), +, *.
    .匹配任意字符,例如/a./匹配ab和ac。
    /[ab]c/匹配ac和bc,[]之间代表范围。例如:/[a-z]/ , /[a-za-z0-9]/。
    /[^a-za-z0-9]/匹配不在该范围内的字符串。
    /[\d]/代表任意数字,/[\w]/代表任意字母,数字或者_,/[\s]/代表空白字符,包括空格,tab和换行。
    /[\d]/,/[\w]/,/[\s]/均为上述的否定情况。

    关于正则其它用法,请参照《watir技术集锦》
    5.7. 最后攻略

    总之,对于对象识别与操作,要借助于上述文档中的, 灵活运用autoit, xpath与异常对象操作方法。对于watir不支持的windows控件,想到第一个方法,就是采用第三方autoit技术,来模拟键盘或鼠标操作。
    对于操作web对象,watir不支持特殊tag,除了扩展其底层代码外,只能深深研究一下xpath了.
    最后,再搞不定,就只能到watir group里咨询高人了,呵呵。

    尚没有碰到其它更好方法。。。







    一些错误

    如果报错 autoitx3, it helps to make automation happen

    那就在windows 下运行

    regsvr32 "c:\ruby\lib\ruby\gems\1.8\gems\watir-1.6.2\lib\watir\autoitx3.dll"




    unknown ole server: `autoitx3.control' (wi2oleruntimeerror)

    that might mean you have not resisted the autoitx3.dll in your computer,
    in current watir version, autoitx3.dll has been included in the watir folder,
    so run the command in "run":

    regsvr32 "c:\ruby\lib\ruby\gems\1.8\gems\watir-1.6.2\lib\watir\autoitx3.dll"
    then you will not get the errors

    learn autoitx3, please go to http://www.autoitscript.com/autoit3/index.shtml
    i just want to use it to handle the popup windows when writing watir scripts
  • 【转载】watir学习系列

    2010-02-11 09:50:18

    加载win32ole文件:     require ‘win32ole’
    创建应用对象:         excel  = WIN32OLE.new("Excel.Application")
    新建Excel文件:        excel.workbooks.Add      #默认Excel文件
                                 excel.workbooks.Add 1   #单工作表
    创建Excel文件对象:    wb     = excel.ActiveWorkBook
    创建工作表对象:       sheet  = web.ActiveSheet
    打开Excel文件:        excel.workbook.open "文件路径名.xls"
    取单元格值:           str    = sheet.Cell[1][2].Value
    单元格赋值:           sheet.Cells[3][6].value = "test"
    保存Excel文件:        wb.Save 或 wb.SaveAs "文件名"
    退出Excel:            excel.quit
     

    class CreateFile                  #定义类,类名首字母需大写
      def rows_to_file(rows)      #定义类方法
         @@data_rows  = rows   #定义类变量,无需申明变量类型
         @@content    = ''   

         @@filename   =  "c:\\filename.txt"   #定义文件路径
         @@data_rows.each do |x|              #遍历数组
          @@content = @@content + x.to_s + ‘-‘      #to_s:转换为字符串
        end
     #写文件,参数说明:"a+"  在原有内容后追加数据   "w" :先将文件清空,再写入
        File.open( @@filename, "a+" ) do |file|
          file.puts @@content
        end          
      end
    end

    rows = ['a','b','c']
    CreateFile = CreateFile.new
    CreateFile.rows_to_file(rows)

     

    require 'watir'

     

    #定义调用JS的类方法
    class Watir::IE
      def run_script(js)
        ie.Document.parentWindow.execScript(js)
      end
    end

     

    ie = Watir::IE.new  
    ie.goto("http://www.google.cn")  

    js_string =  "alert(\"测试调用Javascript!\");"      

    #调用类方法  
    ie.run_script(js_string)

     

    一、插入数据:

     require 'DBI'
    require 'jcode'
    $KCODE = 's' #设置汉字代码为EUC,windows环境为"s",linux环境为"e"#数据库变量
    db_host = 'DBI:OCI8:TEST'
    db_user = 'user
    db_psw = 'passwpord

    dbh = DBI.connect(db_host, db_user, db_psw) #连接数据库
    #插入数据
    insert_sql = "insert into table values('1','2')"
    begin
    rs = dbh.prepare(insert_sql)
    rs.execute #执行SQL
    dbh.commit #提交数据
    rs.finish
    rescue DBI::DatabaseError => e
    puts "Error code : #{e.err}"
    puts "Error message: #{e.errstr}"
    ensure
    dbh.disconnect if dbh
    end

     

    二、查询数据:

     

    require  'DBI'     #加载DBI文件
    require  'jcode'
    $KCODE = 's'    #设置汉字代码为EUC,windows环境为"s",linux环境为"e"

    #数据库变量
    db_host      = 'DBI:OCI8:TEST'
    db_user      = 'user'
    db_psw       = 'password'
    select_sql  = "select value1,value2 from table"
    begin
       rs = dbh.prepare(select_sql)
        rs.execute                                                               #执行查询
        value_rows                   = rs.fetch_all                      #获取表数据
        column_names_rows  = rs.column_names            #获取表列名
        DBI::Utils::TableFormatter.ascii(column_names_rows,value_rows)  #以表格的格式输出
        DBI::Utils::XMLFormatter.table(value_rows)     #以XML的格式输出
        rs.finish
    rescue DBI::DatabaseError => e
        puts "Error code : #{e.err}"
        puts "Error message: #{e.errstr}"
    ensure
        dbh.disconnect if dbh
    end

     

     

    三、删除数据:

     

    require 'DBI'
    require 'jcode'
    $KCODE = 'e'     #设置汉字代码为EUC,windows环境为"s",linux环境为"e"

    #数据库变量
    db_host      = 'DBI:OCI8:TEST'
    db_user      = 'user'
    db_psw       = 'password'

    dbh = DBI.connect(db_host, db_user, db_psw)  #连接数据库
    #删除数据
    delete_sql = "delete from table where value1 =? and value2=?"
    begin
       rs = dbh.prepare(delete_sql)
       rs.execute('1','2')
       dbh.commit
        rs.finish
    rescue DBI::DatabaseError => e
        puts "Error code : #{e.err}"
        puts "Error message: #{e.errstr}"
    ensure
        dbh.disconnect if dbh
    end

     

     

    文本框:
             <INPUT id="email" name="_fmu.u._0.e" value="" />
         方法1: ie.text_field(:id,'email').set("文本内容")
         方法2: ie.text_field(:name, 'email').set("文本内容")
         方法3: ie.text_field(:name,"email").clear

     

    下拉框:
             <SELECT name="cert_no">
               <OPTION value="身份证">身份证</OPTION>
             </SELECT>
        方法1: ie.select_list(:name,"cert_no").select("身份证")
        方法2: ie.select_list(:name,"cert_no").clearSelection

     

    超链接:
               <a href = "http://www.google.cn/">google</a> 
        方法1:ie.link(:text,"google").click
        方法2:ie.link(:url,"http://www.google.cn/").click

     

    复选框:
              <input type = "checkbox" name = "checkme" value = "1"> 
        方法1: ie.checkbox(:name,"checkme").set
        方法2: ie.checkbox(:name,"checkme").clear
        方法3: values = ie.checkbox(:name,"checkme").value
                          <input type = "checkbox" name = "checkme" value = "2"> 
         #多个同名的复选框处理
        方法1: ie.checkbox(:name,"checkme","2").set
        方法2: ie.checkbox(:name,"checkme","2").clear

     

    单选框:
              <input type = "radio" name = "clickme" id = "1"> 
         方法1: ie.radio(:name, "clickme").set
         方法2: ie.radio(:name, "clickme").clear

     

    一般按钮:
              <input type = "button" name = "clickme" value = "Click Me"> 
         方法1: ie.button(:value, "Click Me").click
         方法2: ie.button(:name,"clickme").click

     

    submit按钮:
              <form. action = "submit" name = "submitform" method = "post">
                 <input type = "submit" value = "Submit"></input>
              </form> 
        方法: ie.button(:value."Submit").click

     

    图片按钮:
              <form. action ="submit" name = "doitform" method = "post">
                 <input type = "image" src = "images/doit.gif" name = "doit">
              </form> 
        方法:ie.button(:name, "doit").click

     

    Form中无按钮:
              <form. action = "login" name = "loginform" method = "get">
                  <input name = "username" type = "text"></input>
              </form> 
        方法1:ie.form(:name,"loginform").submit
        方法2:ie.form(:action,"login").submit

     

    获取隐含对象值:                                                                                
              <INPUT type=hidden value="您的Email" name="field1">                  
         方法:values = ie.hidden(:name,'field1').value                                             
                                                                                                   
    获取窗口对象:                                                                                  
        方法1: ie2 = Watir::IE.attach(:url,'http://www.google.cn/')   #根据URL获取            
        方法2: ie3 = Watir::IE.attach(:title,'Google')                #根据窗口标题获取
        方法3: ie4 = Watir::IE.attach(:title, /google.cn/)              #正则表达式匹配获取  
                                                                                                   
    URL编码:                                                                                       
           require 'cgi'                                                                          
           string =  "URL编码"                                                                     
           string = CGI::escape(string)                                                            
           puts string                 # 转换结果: URL%B1%E0%C2%EB                                 
                                                                                                   
    URL解码:                                                                                       
          require 'cgi'                                                                            
           string =  "URL%BD%E2%C2%EB"                                                             
           string = CGI::unescape(string)                                                          
           puts string                  # 转换结果:URL解码                                        

     

    一、gem介绍:
          gem是ruby管理包的工具,是ruby安装后自带工具,在安装包时会经常用到该工具

     

    二、gem相关命令:
          显示gem的帮助:gem –h  
          显示gem版本号:gem –v
          更新gem版本:gem update --system 
          安装watir包:gem install watir
          运行build子命令构建gem包:gem build package.gemspec
          列出安装的gems:gem list 
          检查已安装的gem包:gem check
          卸载已安装的gem包:gem uninstall GEMNAME

     

    一、JDK安装及配置:
       (1)默认安装JDK,路径如:C:"jdk1.5.0_11

                   JDK下载地址http://java.sun.com/javase/downloads/index.jsp

        (2)配置环境变量:
               打开"我的电脑"右键属性--"高级"--"环境变量"页面,

              在系统变量里,添加变量JAVA_HOME,变量值:C:"jdk1.5.0_11

              在系统变量里,添加变量CLASSPATH,变量值:.;%JAVA_HOME%"lib
               在系统变量里,在变量Path变量值前增加:%JAVA_HOME%"bin;


    二、Eclipse下载安装: 
            下载地址: http://www.eclipse.org/downloads/

            安装方法:将下载的Eclipse解压到c:"eclipse


    三、RDT安装配置 : 
        下载地址:http://sourceforge.net/project/showfiles.php?group_id=50233
        安装方法:将RDT解压到eclipse目录:c:"eclipse
        安装说明: http://rubyeclipse.sourceforge.net/download.rdt.html
        相关配置方法: http://os.51cto.com/art/200605/26177.htm

     


    一、安装ruby:
          ruby下载地址:http://www.ruby-lang.org/zh_CN/downloads/

          下载Windows一步安装版,默认安装,安装成功后可以运行命令查看版本:ruby –v

     

    二、安装watir:
       1.运行命令先更新gem:gem update --system

        2.运行命令安装watir: gem install watir

     

    三、安装 oci
          ruby ruby-oci8-0.1.16-mswin32.rb   
         下载地址: http://rubyforge.org/frs/download.php/41043/ruby-oci8-1.0.3-mswin32.rb

     

    四、安装DBI
          下载地址: http://rubyforge.org/frs/download.php/33960/dbi-0.2.0.zip

           安装步骤:1.将下载的DBI解压到C:"dbi

                             2.分别在命令行中运行下面命令安装:

                                 cd c:"dbi

                                 ruby setup.rb config 

                                 ruby setup.rb setup

                                 ruby setup.rb install 

     

    五、安装IE Developer Toolbar(IE插件,可选)
         下载地址:http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&displaylang=en

     

    六、WatirRecorder++(watir脚本录制工具)
          下载:http://www.hanselman.com/blog/content/binary/WatirRecorder_Setup_lite.msi

  • 【转载】watir5分钟教程

    2010-02-10 16:47:30

    1. 启动irb。
    开始-运行-cmd,打开命令窗口,输入irb,可以看到如下提示:
    C:\Documents and Settings\Administrator>irb
    irb(main):001:0>

    2. 让ruby知道你想调用Watir。
    命令窗口中输入:require “watir”,回车
    可以看到如下提示:
    irb(main):001:0> require “watir”
    => true

    3. 启动IE浏览器。
    命令窗口中输入:ie = Watir::IE.new
    可以看到打开了一个新的IE浏览器
    并且命令窗口中出现如下提示:
    irb(main):002:0> ie = Watir::IE.new
    => #<Watir::IE:0×2d0c6b8 @url_list=["about:blank"], @typingspeed=0.08, @page_container=#<Watir::IE:0×2d0c6b8 …>, @error_checkers=[], @down_load_time=0.359
    , @rexmlDomobject=nil, @ole_object=nil, @ie=#<WIN32OLE:0×2d0c640>, @logger=#<Watir::DefaultLogger:0×2d0c5f8 @datetime_format=”%d-%b-%Y %H:%M:%S”, @progname=
    nil, @logdev=#<Logger::LogDevice:0×2d0c550 @shift_age=nil, @filename=nil, @dev=#<IO:0×284e7d0>, @shift_size=nil>, @level=2>, @speed=:slow, @activeObjectHigh
    LightColor=”yellow”, @defaultSleepTime=0.1>

    4. 打开Google首页。
    输入:ie.goto “http://www.google.com/”
    你将看到:
    irb(main):003:0> ie.goto “http://www.google.com/”
    => 1.062

    5. 检查打开的IE中的URL是否为http://www.google.com/
    命令窗口中输入:ie.url == “http://www.google.com/”
    你将看到:
    irb(main):004:0> ie.url == “http://www.google.com/”
    => true

    6. 点击包含“Images”字样的链接(在页面的左上角)
    命令窗口中输入:ie.link(:text, “Images”).flash
    你将看到:页面上的Images字样的背景有几秒钟时间是黄色的,并且命令窗口中显示
    irb(main):012:0> ie.link(:text, “Images”).flash
    => nil

    7. 现在已经找到了页面上的Images链接,可以点击打开了
    命令窗口中输入:ie.link(:text, “Images”).click
    Images页面被打开
    命令窗口中显示如下:
    irb(main):005:0> ie.link(:text, “Images”).click
    => 0.657

    8. 检查页面上是否有”The most comprehensive image search on the web的字样。
    命令窗口中输入:ie.text.include? “The most comprehensive image search on the web”
    你将看到:
    irb(main):006:0> ie.text.include? “The most comprehensive image search on the web”
    => true

    9. 在页面上的搜索框中输入Watir。(此处可以采用IEdeveloperToolbar来辅助查看搜索框的属性)。
    命令窗口中输入:ie.text_field(:name, “q”).set “Watir”
    可以看到页面的搜索框中被输入了Watir
    你将看到:
    irb(main):007:0> ie.text_field(:name, “q”).set “Watir”
    => true

    10. 点击Search Images按钮。
    命令窗口中输入:ie.button(:value, “Search Images”).click
    打开搜索结果页面
    命令窗口中输出如下:
    irb(main):008:0> ie.button(:value, “Search Images”).click
    => 15.454

    11. 检查search text field中是否有 Watir 的字样。
    命令窗口中输入:ie.text_field(:name, “q”).value == “Watir”
    命令窗口中输出如下:
    irb(main):009:0> ie.text_field(:name, “q”).value == “Watir”
    => true

    12. 在图片大小的下拉框中选择Large images
    命令窗口中输入:ie.select_list(:name, “imagesize”).select “Large images”
    命令窗口中输出如下:
    irb(main):010:0> ie.select_list(:name, “imagesize”).select “Large images”
    => “”

    13. 检查是否有来自Flickr的图片。
    命令窗口中输入:ie.image(:src, /flickr/).exists?
    命令窗口中输出如下:
    irb(main):011:0> ie.image(:src, /flickr/).exists?
    => true

    现在你已经了解了Watir的基本用法。如果想要详细了解Watir的使用,请阅读Watir的详细教程
  • 【转载】ruby和watir学习常用网站整理

    2010-01-18 14:07:50

  • 【转载】ruby+gem常用命令

    2010-01-18 14:05:24

    ruby -v #查看ruby 版本
    ruby -e 'require"watir"; puts Watir::IE::VERSION' #查看watir版本

    gem -v #gem版本
    gem update #更新所有包
    gem update --system #更新RubyGems软件

    gem install rake #安装rake,从本地或远程服务器
    gem install rake --remote #安装rake,从远程服务器

    gem install watir -v(或者--version) 1.6.2#指定安装版本的
    gem uninstall rake #卸载rake包
    gem list d #列出本地以d打头的包
    gem query -n '[0-9]' --local #查找本地含有数字的包
    gem search log --both #从本地和远程服务器上查找含有log字符串的包
    gem search log --remoter #只从远程服务器上查找含有log字符串的包
    gem search -r log #只从远程服务器上查找含有log字符串的包

    gem help #提醒式的帮助
    gem help install #列出install命令 帮助
    gem help examples #列出gem命令使用一些例子

    gem build rake.gemspec #把rake.gemspec编译成rake.gem
    gem check -v pkg/rake-0.4.0.gem #检测rake是否有效
    gem cleanup #清除所有包旧版本,保留最新版本
    gem contents rake #显示rake包中所包含的文件
    gem dependency rails -v 0.10.1 #列出与rails相互依赖的包
    gem environment #查看gem的环境
  • [转载] 软件测试自动化的现状分析和自动化引入条件

    2009-09-24 20:54:21

        软件测试自动化,已经成为国内软件工程领域一个众所周知的课题;不言而喻,软件测试从业者都意识到软件测试这项工作走向成熟化、标准化的一个必经之路就是要实施自动化测试。也许您认为实施自动化测试不是必须,也许您认为测试的思想是开展该工作的精髓、而工具只是辅助,那么我要告诉你我的想法:从计算机这一庞大学科发展至今,它最根本的意义是解决人类手工劳动的复杂性,成为替代人类某些重复性行为模式的最佳工具;我们不可推翻测试思维在测试工作中的指导思想地位,但如何将思想转化成可操作的方案,本文也许会给您一些启示。
      以前听过北京中软的一个业内专家讲一句话,觉得挺经典:凡是说既是科学又是艺术的学科,就是说明它是不成熟的学科!他将软件工程和建筑行业做类比,让我们深深体会到软件工程走向成熟化的任重与道远。而软件测试,更是一个新兴的领域,虽然近几年得到了快速发展,也随着该领域从业者数量的与日俱增,培养了一批高级的人才;但是依然有多少企业和个人工作在迷茫中:这种困惑是因为工程师们手中的测试工作与理想的测试模式造成的强烈反差,这种无奈是因为他们和开发人员一样的努力却有不同的待遇,这种迷茫是因为测试工作者不知道这个领域里是否还有自己的发展空间和人生价值的体现!笔者认为:如今的软件测试行情,正处在群雄逐鹿的混战岁月,每个人、每个有测试部门或从事测试业务的企业,都该发扬百花齐放、百家争鸣的精神,多多借鉴国内外先进的测试经验,参考业界流行的行业标准,找到适合自己团队的测试方法和模式,创造更大的社会价值,发挥更大的人生价值。

      实施软件测试自动化的理由分析

      首先,测试人员的工作比以往任何时候都更加困难,因为公司和组织希望以更快的速度和更低的成本开发出高质量的应用程序。
      此外,在很多项目中,测试人员的所有任务实际上都是手动处理的,而实际上,有很大一部分重复性强的测试工作,是可以独立开来自动实现的。
      还有,在大型项目中测试团队和其他的团队之间没有足够的合作,无法促进彼此的工作。
      最后,从个人角度来说,测试人员通常很难花费大量时间来学习新技能;这是目前国内测试从业者的现状,太多的企业为了节约成本而将刚刚走出校门的毕业生作为测试工程师,他们每日做着繁忙的重复工作,又基于自身技能的不深,虽怀博览群书的心愿却不知从何出入手。所谓光阴似箭,因为一转眼我们就说到未来的5年、10年后,我们这些技能不深的测试工程师能做什么呢?而软件测试自动化,也是未来测试工程师或即将成为测试工程一项强有力的工作技能。
      可以说,实施测试自动化是软件行业一个不可逆转的趋势,如果在这个领域走在了前列,无论从企业的核心竞争力还是个人的工作技能来说,都有巨大的优越性,而国内众多的软件厂商也的确在纷至沓来的着手开展着这项工作。

      国内软件测试自动化实施现状分析

      随着众多具有了一定优秀实施自动化测试经验的企业陆续出现,也伴随着很多组织对这项工作依然是丈二的和尚-摸不着头脑。对当前国内软件企业实施或有意向实施测试自动化时面临的主要问题,按实施的不同层次来说:
      ——干脆认为测试自动化是个遥不可及的事情,我们这样的小公司不必实施,人员、资金、资源都不足,以后再说吧!
      ——热血沸腾的实施测试自动化,购买了工具,推行了新的测试流程;几个月后,工具放在那里成了共享资源,测试流程又涛声依旧,回到原来的模式。
      ——公司实施了自动化测试;然而开发与测试之间,甚至与项目经理之间矛盾重重,出了事情不知如何追究责任;虽然还在勉强维持的自动化测试,但实施的成本比手工测试增加了,工作量比从前更大了,从而造成项目团队人员怨声载道,更怀念起那段手工测试的悠闲岁月,唉!那一场风花雪月的事,既然要结束又何必开始…
      ——自动化测试实施相对比较成功,但或多或少还有些问题,比如工具选择不准确,培训不到位,文档不完备,人员分配不合理,脚本可维护度不高等等,造成一种表面上的自动化测试流程,是一幅空架子,如同山间竹笋,嘴尖皮厚腹中空。

      国内软件测试自动化实施不成功原因分析

      ——公司高层意识不到软件测试自动化的重要性;殊不知,其他竞争对手们都大张旗鼓的开展这方面研究和策划的时候,自己还对此持漠视态度,等到整个行业都提高到一个新的层次,那时再着手做,可能就是热锅上的蚂蚁了。
      ——所谓凡事预则立,不预则废。一个软件企业实施测试自动化,绝对不是拍脑袋说干就能干好的,它不仅涉及测试工作本身流程上、组织结构上的调整与改进,甚至也包括需求、设计、开发、维护及配置管理等其他方面的配合。
      ——软件开发是团队工作,在这一领域要尤其注重以人为本;所以人员之间的配合、测试组织结构的设置非常重要,每个角色一定要将自己的责任完全担负起来,这也是减少和解决前述团队矛盾的必要手段。
      ——对开展自动化测试的监督和评估相当重要,也包括对工作产品的检查和人员的考核。一定要将自动化测试全面深入的贯彻到测试工作中,不能敷衍了事,不能做表面工作。这项工作在CMM三级里规范的很好,只可惜我们的很多公司对CMM真的只是“过级”!

      正确认识国内未实施软件测试自动化的根源

      目前国内的软件公司,很多还是处于获取资本的原始积累阶段,我们不能说公司领导完全不重视测试,而是测试整体行业都没有被重视起来,这是其一;其二是公司高层有更需要重视的环节,例如寻找客户签订单,或者开发,这些是直接关系公司存亡的命脉性东西。
      即便企业重视测试,如果公司做一番比较全面的评估(在后续的测试自动化引入入条件里,再详细说明),也不一定非要实施自动化测试。笔者认为一些中小软件公司在大刀阔斧推行自动化测试之前,在测试流程管理、测试缺陷流程、测试人员技能培训等方面做工作,这样可以用比较少的成本投入来获取相对较大且长期的收益回报。
      最后,针对普通测试工程师的一些建议,在这样的公司里,其实有着很多意想不到的优越性:
      (一)这样的公司测试如果不正规,那么你就有更大更多的发挥空间。
      (二)你可以单独学习自动化测试技术,自己先试着应用到日常工作的软件项目中。
      (三)你可以直接和开发人员沟通,甚至向他们学习开发技术,这对将来的自动化测试中开发脚本很有好处。
      (四)每个优秀测试工程师的成长都是个循序渐进的过程。我遇到很多测试界的新手向我发牢骚,很惭愧我没有什么可以告诫他们的,只是希望这样的新人克服浮躁情绪,稳扎稳打练好基本功,想成为优秀的测试专家,就要经历这个阶段。

      软件测试自动化的引入条件

      如果你的测试部门有意向引入自动化测试,那么首先要从思想上统一认识。
      一、 软件测试自动化的正确认识
      1) 自动化测试能大大降低手工测试工作,但决不能完全取代手工测试。完全的自动化测试只是一个理论上的目标,实际上想要达到 100% 的自动化测试,不仅代价相当昂贵,而且操作上也是几乎不可能实现。一般来说,一个 40-60% 的利用自动化的程度已经是非常好的了,达到这个级别以上将过大的增加测试相关的维护成本。
      2) 测试自动化的引入有一定的标准,要经过综合的评估,绝对不能理解成测试工具简单的录制与回放过程。实际上,从实现成熟度来说,自动化测试分五个级别:

    级别 说明 优点 缺点 用法
    一级 录制和回放 自动化的测试脚本能够被自动的生成,而不需要有任何的编程知识 拥有大量的测试脚本,当需求和应用发生变化时相应的测试脚本也必须被重新录制 当测试的系统不会发生变化时,实现小规模的自动化
    二级 录制、编辑和回放 减少脚本的数量和维护的工作 需要一定的编程知识;频繁的变化难于维护 回归测试时,用于被测试的应用有很小的变化
    三级 编程和回放 确定了测试脚本的设计,在项目的早期就可以开始自动化的测试 要求测试人员具有很好的软件技能,包括设计、开发 大规模的测试套件被开发、执行和维护的专业自动化测试
    四级 数据驱动的测试 能够维护和使用良好的并且有效的模拟真实生活中数据的测试数据 软件开发的技能是基础,并且需要访问相关的测试数据 大规模的测试套件被开发、执行和维护的专业自动化测试
    五级 使用动作词的测试自动化 测试用例的设计被从测试工具中分离了出来 需要一个具有工具技能和开发技能的测试团队 专业的测试自动化将技能的使用最优化的结合起来

      3) 自动化测试能提高测试效率,快速定位测试软件各版本中的功能与性能缺陷,但不会创造性的发现测试脚本里没有设计的缺陷。测试工具不是人脑,要求测试设计者将测试中各种分支路径的校验点进行定制;没有定制完整,即便事实上出错的地方,测试工具也不会发觉。因此,制订全面、系统的测试设计工作是相当重要的。
      4) 自动化测试能提高测试效率,但对于周期短、时间紧迫的项目不宜采用自动化测试。推行自动化测试的前期工作相当庞大,将企业级自动化测试框架应用到一个项目中也要评估其合适性,因此决不能盲目的的应用到任何一个测试项目中,尤其不适合周期短的项目,因为很可能需要大量的测试框架的准备和实施而会被拖跨。
      5) 实施测试自动化必须进行多方面的培训,包括测试流程、缺陷管理、人员安排、测试工具使用等。如果测试过程是不合理的,引入自动化测试只会给软件组织或者项目团队带来更大的混乱;如果我们允许组织或者项目团队在没有关于应该如何做的任何知识的情况下实施自动化测试,那将肯定会以失败告终。
      如果软件企业有意向实施自动化测试,那么应该具备什么样的条件才可以引入自动化测试呢,才可以最大可能的减少引入风险,并能够可持续性的开展下去呢?
      二、对企业自身现状的评估分析
      
    第一,从企业规模上来说,没有严格限制。无论公司大小,都需要提高测试效率,希望测试工作标准化,测试流程正规化,测试代码重用化。所以第一要做到的,就是企业从高层CTO开始,直到测试部门的任何一个普通工程师,都要树立实施自动化测试的坚定决心,不能抱着试试看的态度。一般来说,一个这样的软件开发团队可以优先开展自动化测试工作:测试-开发人员比例合适,比如1:1到1:1.5;开发团队总人数不少于10个。当然,如果你的公司只有三五个测试人员,要实施自动化测试绝非易事;不过可以先让一个、两个测试带头人首先试着开展这个工作,不断总结、不断提高,并和层层上司经常汇报工作的开展情况,再最终决定是否全面推行此事。
      第二,从公司的产品特征来说,一般开发产品的公司实施自动化测试要比开发项目的公司要优越些。原因很简单,就是测试维护成本和风险都小。产品软件开发周期长,需求相对稳定,测试人员可以有比较充裕的时间去设计测试方案和开发测试脚本;而项目软件面向单客户,需求难以一次性统一,变更频繁,对开发、维护测试脚本危害很大,出现问题时一般都以开发代码为主,很难照顾到测试代码。但决不是说做项目软件的公司不能实施自动化测试,当前国内做项目的软件公司居多,有很多正在推行CMM等级标准,这是好事情;只要软件的开发流程、测试流程、缺陷管理流程规范了,推行自动化测试自然水到渠成。
      第三,说说标准化的开发和管理流程。不管是CMM还是ISO,不管是开发流程、测试流程还是缺陷管理流程,这里不能一一阐述,可以参考RUP(Rational Unified Process, Rational 统一过程),可以参考很多业界文献,我只说明一点,也是我们IT从业人员甚至任何从业人员一个很好的工作原则:
      a、 把你想做的写下来(计划管理)
      b、 按照你写下来的去做(行为管理)
      c、 把做的事情记录下来(报告管理)
      d、 出现的问题要设法解决(跟踪管理)
      在测试流程里,这几个要点都一一有所落实;如果你的软件开发团队据此开发软件,那么完全具备实施自动化测试的条件。当然,也许一些公司的测试管理比较混乱,出了问题不知道谁负责,测试人员或开发人员整日碍

    测试阶段 描述 备注
    单元测试/组件测试 这个测试工作通常是开发人员的职责,很多不同的方法能够被使用,比如"测试先行",它是一个测试框架,开发人员在编写代码前编写不同的单元测试,当测试通过时,代码也被完成了。 通过使用正式的单元测试,不仅能够帮助开发人员产出更加稳定的代码,而且能够是软件的整体质量更加的好。
    集成测试 这里的测试工作集中在验证不同的组件之间的集成上。 这种类型的测试通常是被测试系统的更加复杂测试的基础,大量的边缘测试被合并以制造出不同的错误处理测试。
    系统测试 这种测试是通过执行用户场景模拟真实用户使用系统,以证明系统具有被期望的功能。 这里不需要进行自动化的测试。安装测试、安全性测试通常是有手工完成的,因为系统的环境是恒定不变的。
    其它两种非常重要的测试

    回归测试

    回归测试实际上是重复已经存在的测试,通常如果是手工完成的化,这种测试只在项目的结尾执行执行一到两次。 这里完全有潜力应用自动化的测试,你能够在每次构建完成后执行自动化的回归测试,以验证被测试系统的改变是否影响了系统的其他功能。

    性能测试

    性能测试包括以下不同测试形式:
    - 负载测试
    - 压力测试
    - 并发测试
    -.....
    如果没有自动化的测试工具,你将不能执行通过模拟用户的负载实现的高密集度的性能测试。

      其三是软件自动化测试切入方式的风险。正如前面所言,一定要记住将自动化测试与手工测试结合起来使用,不合理的规划会造成工作事倍功半。首先,对于自动化测试率的目标是 10/90 (10% 的自动化测试和 90% 的手工测试)。当这些目标都实现了,可以将自动化测试的使用率提高。对于何种测试情况下引入自动化测试,何时依然采用手工测试,我们分开阐述。
      一般这样的测试条件下使用自动化测试:
      · 项目没有严格的时间压力
      · 具有良好定义的测试策略和测试计划(知道要测试什么 ,知道什么时候测试 )
      · 对于自动化测试你拥有一个能够被识别的测试框架和候选者
      · 能够确保多个测试运行的构建策略
      · 多平台环境需要被测试
      · 拥有运行测试的硬件
      · 拥有关注在自动化过程上的资源
      · 被测试系统是可自动化测试的
    如下条件是宜采用手工测试:
      · 没有标准的测试过程
      · 没有一个测试什么、什么时候测试的清晰的蓝图
      · 在一个项目中,你是一个新人,并且还不是完全的理解方案的功能性和或者设计
      · 你或者整个项目在时间的压力下
      · 在团队中没有资源或者具有自动化测试技能的人· 没有硬件
      其四是企业软件的开发语言风险。当前业界流行的测试工具有几十种,相同功能的测试工具所支持的环境和语言各不相同,这里笔者总结了当前国际上流行的几个软件测试工具生产厂商及一些主要IDE产品,读者可根据参考网址去了解列举工具和更多工具的详细资料。

    生产厂商 工具名称 测试功能简述 网址链接

    Mercury
    Interfactive
    Corporation

    Winruner

    功能测试

    http://www.Mercury.com/
    us/products

    Loadrunner

    性能测试

    QuickTest Pro

    功能测试

    Astra LoadTest

    性能测试

    testdirector

    测试管理

    IBM Rational

    Rational root

    功能测试和性能测试

    http://www.900.ibm.com
    /cn/software/rational/
    us/products

    Rational XDE tester

    功能测试

    Rational testmanager

    测试管理

    Rational purifyplus

    白盒测试

    Compuware
    Corporation

    QARun

    功能测试

    http://www.compuware.com/products

    QALoad 性能测试
    QADirector 测试管理
    DevPartner Studio Professional

    白盒测试

    Seque software Silk Test 功能测试 http://www.Seque.com/products/index.asp
    Silk 性能测试
    SilkCentral Test
    /Issue Manager
    测试管理
    Empirix e-Tester 功能测试 http://www.Empirix.com/Empirix/
    /Web+Test+Monitoring/Testing+Solutions/
    Integrated+Web+Testing.html
    e-Load 性能测试
    e-Monitor 测试管理
    parasoft Jtest Java白盒测试 http://www.parasoft.com/jsp/
    products.jsp?itemID=12
    C++test C/C++白盒测试
    .NETtest .NET白盒测试
    RadView WebLOAD 性能测试 http://www.radview.com/products
    WebFT 性能测试
    MicroSoft Web Application 
    Stress Tool
    性能测试 http://www.microsoft.com/technet/archive/
    itsolutions/downloads/webtutor.mspx
    Quest Software benchmark Factory 性能测试 http://www.quest.com/benchmark_factory
    Minq Software Pure 功能测试 http://www.minq.com/products/
    Pure 性能测试
    Pure 测试监控
    Seapine Software QA Wizard 功能测试工具 http://www.seapine.com/products
    TestTrack Pro 缺陷管理工具

      其五还要做时间估算。在评估完前面几项指标后,需要估算实施测试自动化的时间周期,以防止浪费不必要的时间,减少在人员、资金、资源投入上的无端消耗。虽然到测试自动化步入正轨以后,会起到事半功倍的效果,但前期的投入巨大,要全面考虑各种因素,明确实施计划并按计划严格执行,才能最大限度降低风险。
      其六是工作流程变更风险。测试团队乃至整个开发组织实施测试自动化,或多或少会因为适应测试工具的工作流程,带来团队的测试流程、开发流程的相应变更,而且,如果变更不善,会引起团队成员的诸多抱怨情绪;所以应该尽量减少这种变更,并克服变更中可能存在的困难。
      其七是人员培训与变更风险。简单而言,就是测试团队人员的培训具有风险性,例如每个角色的定位是否准确,各角色人员对培训技能的掌握程度是否满意,尤其实施途中如果发生人员变更等风险,都要事先做出预测和相应的处理方案。
      一个企业或软件团队实施测试自动化,会有来自方方面面的压力和风险,但是凭借团队成员的聪明才智和公司高层的大力支持,事先做好评估,做好风险预测,那么可以告诉你一个激动人心的消息:你的团队成功引入了测试自动化!有了测试自动化,我们即可享受它带来的超凡价值和无穷魅力:我们的测试工作变得更简单、更有效,我们工作在一个专家级的团队里,因此我们每天都在享受这种成功的喜悦!

  • 国内软件自动化测试现状分析及展望(转载)

    2009-09-24 20:38:02

    此文转载自测所:http://www.cesoo.com
    在软件测试日新月异发展的今天,自动化测试正在成为软件测试领域里的一个非常瞩目的趋势和潮流,很多软件公司正在或已经在企业测试团队内部实施软件自动化测试流程和框架,同时也把自动化技能作为人才衡量和业绩考核的重要技能指标,这些都不是偶然的事情,因为:
    1. 软件质量的重视和提高。
    软件产业虽然只有短短几十年的历程,但是其应用范围已经从最初的科研专用转变为渗透入我们社会中生产生活各个方面,起着非常重要的作用,我们人类社会对软 件的依赖正在越来越强,根据牛顿第的反作用力定律,那么软件问题对我们的影响也在越来越大。比如2007年发生的奥运订票网站在开通首日不能登陆的问题, 导致上百万人购票失败;中国工商银行黄金交易系统出现漏洞,两名大学生通过低买高卖获利三千多万元,这样的新闻在报纸或网络上还能找到更多,要避免这样的 事情发生,就要使这些问题能够在软件上线之前被发现和解决,换句话说,软件质量必须要提高,而软件测试就是保证软件质量的一个重要并且非常有效的手段。因 此现在软件公司越来越重视软件测试,体现在老板那里就是对软件测试”舍得花钱,舍得投人“,测试执行起来就是”多测“,”测多”,“多测”就是时间上测试 执行频率加快,以前一个版本测一轮,现在一次编译就要测一轮,“测多”就是测试更加完整,覆盖更多的功能模块。这就为软件自动化测试提供了强有力的需求和 生长空间。

    2. 软件系统规模的扩大,复杂性的提高
    我们记得在单机系统时代时,几千行代码就能写出一个商业软件,比如WPS,CCED这些一代软件枭雄。但随着网络时代的到来,分布式系统的发展,软件系统 越来越重视交互和协作,多个模块服务的交叉调用,网间的交互安全等等,这大大提高了软件系统的复杂度和规模。Oracle曾经开发过一个邮件客户端 Outlook的插件,这个插件是安装在outlook上,提供一些常用功能,比如收发mail,calendar创建等等。但oracle的测试部门仅 仅为这个插件就设计了6000多个test case!这个数目是如此巨大,使得测试执行和产品周期产生了深刻的矛盾。这个矛盾体现在:当每个新版本发布时,如果做一遍完整测试,一个人手工测试执行 一遍6000多个test case就要半个月,而产品版本的发布周期也就一周左右,也就是说测试的速度远远跟不上产品的发布速度。在这种情形下,如果没有自动化测试帮忙,手工测试 只能望洋兴叹了!

    以上两个软件的根本现状,决定了软件测试自动化的趋势不是人云亦云,昙花一现,而会蓬勃发展,强劲有力,成为势不可挡的潮流。很多软件公司已经看到了这个 潮流,很早就开始做软件自动化测试的预研和实施,比如微软,oracle等已经在企业内部测试团队整合了自动化测试流程,实施了自动化测试框架,并且已经 按时更新换代,进入稳定应用的周期。但在国内,由于软件自动化测试时间不长,测试人员技能水平等因素影响,软件自动化测试的研究和实施大多还处于一个起步 摸索的阶段,我们看到普遍的情形是”做的人不少,成功的不多“,这种现状一方面有技术的问题,另外也有方向上的问题。因为在业界可供借鉴的成功实施经验或 案例比较少,所以在起步阶段可能就会走弯路,这是摸索必然要付出的”学费“。
    那么怎样能够把握软件自动化测试方向和思路呢?下面笔者结合业界的现状分析,以及未来展望,对软件自动化测试的作出三个层次的划分:

    第一阶段:测试的自动化
    这是最原始的起步阶段,其目的就是将原先手工测试所作的工作转化为自动化代劳。显著的特征就是以工具为中心,比如QTP的应用,原先靠人工来执行的测试案 例,比如点击,录入等,现在由QTP来完成,如果QTP不能支持我们的系统,我们就要寻找解决方案,或改用其他工具,总之大多数的自动化工作重点是在每个 case上,也就是技术层面上的问题。但随着技术上的解决,自动化测试规模的进一步增大,我们很快就面临下面的问题之一或全部:
    1. 自动化测试脚本的类型和数量越来越多,怎样有效管理和复用这些脚本?比如有1000个脚本,有QTP的,有Winrunner的,还有perl的等等,每 种脚本又实现了多个case,那我们怎样统一管理和调度这些脚本,使之能够组成一个大的自动化测试目标?要知道单个的测试脚本和单个的测试案例一样,对于 公司的老板来说,他们是不关心这些细节的,只有它们组合起来成为一个壮丽的图本,才能体现出来它们的价值。也许老板们刚开始对自动化的执行感到新奇和惊 喜,但当他们意识到这些并不能为他带来什么价值时,他就会厌倦并放弃。
    2. 自动化测试如何与手工测试整合?我们知道自动化测试是不能100%完全替代手工测试的,那么自动化测试必须要和手工测试整合在一起,才能反映出其价值。这 意味着,自动化测试要全方位和手工测试执行,包括前期的案例管理,测试的执行,以及最后的报告呈现。
    这些问题是助产士,它们促成软件自动化测试第二个阶段的到来。

    第二阶段:自动化的测试
    如果说第一阶段是在一个点上下功夫,那么第二阶段就是在一条线上作战了。“自动化的测试”的内涵更加丰富,它意在将软件测试里的所涉及的各个环节作为一个 统一的整体考虑,从测试案例的管理,测试案例的执行到测试报告的展现都有相应的策略及自动化实现,故称“自动化的测试”。在这里,自动化测试框架横空出 世,自动化测试框架是一系列策略思想,规范和代码的集合。它要解决第一个阶段的困局,就要回答下面这些问题:
    1.怎样管理多个自动化测试案例?
    2.怎样无人职守地运行测试脚本?
    3.怎样呈现自动化测试报告?
    AC(Automation Center)是“www.cesoo.com"提供的基于QTP的软件自动化测试框架,它的回答是:
    1.回答:测试组件的创建和划分
    2.回答:增强自动化测试的健壮性,提供re-run机制,抓图策略等等
    3.回答:采用web服务接口和标准的xml技术,既可web页面展现,又可灵活地与手工测试报告整合
    其中在Oracle等公司已经成功实施了AC,并取得了非常好的效果。

    第三阶段:软件流程框架
    这个阶段可以说是软件自动化测试炉火纯青的时候了,达到了”天人和一”,经过多年修炼,在这里软件自动化测试和软件开发再次做一个整合,从自动化流程上, 能够达到真正的测试驱动开发,比如coding与unit testing做整合。目前已经达到这个阶段的有微软,IBM等。

    评论                                    
    目前国内软件公司软件自动化测试的实施情况大多处于第一阶段或从第一向第二过渡的阶段。所以我在下面着重谈谈软件自动化测试框架的设计原则和一些风险的规避:

    1.框架要集中精力解决自动化测试中的问题
    看起来这是个很简单明了的原则,不是么?自动化测试框架本质是一个软件产品,它旨在满足自动化测试中的必然需求,而不是大包大揽软件工程中所有的问题。我 在某个测试网站曾看过一个测试框架的设计原型,真叫人叹为观止,从脚本代码的版本同步管理到bug的提交和存储,都通通塞入框架解决方案之中,包罗万象, 无所不能。我虽猜不中这框架的开始,但我能猜到这框架的结局,无非两种情形,要么技术资源不够而流产,要么实施起来太过复杂,自动化成本大大高于产出,总 之结局一个字:死。
    一个经验丰富的自动化测试架构师应该既能够敏锐捕捉到当前自动化测试中的关键问题,又能巧妙利用现有企业资源为我所用,在上面的例子中,可以把脚本版本管 理工作交给企业中已有的源码管理系统,比如clearcase,Vss,把bug的存储交给bug管理系统,而框架集中精力解决自动化测试中的无人值守运 行,报告生成等问题,总之在框架设计的初期阶段,一个明确切实的实施目标是十分重要的。
    以AC为例,紧紧以QTP自动化测试为中心,全力解决最实际最关键的问题:
    1.自动化测试案例的管理
    a)基于xml的测试组件的定义
    b)基于xml的被测实例管理
    2.无人值守的案例执行
    a)案例关联关系校验,大大缩减自动化测试执行时间
    b)Case级别Transaction的定义及实现,提供transaction的re-run和超时设定机制,从而减少因测试环境不稳定引起的失败
    c)Recovery自定义机制,大大提高脚本的健壮性
    3.基于xml的测试报告和测试日志
    a)Xml标准,极强的扩展性,提供标准接口,用户可二次开发与手工测试报告进行合并,或直接写入数据库。
    b)灵活的抓图机制,所有抓图最后生成一个网页,作为测试报告的一部分提交。

    2. 框架设计中的扩展考虑
    毫无疑问,自动化测试框架是一个软件,在设计时同样遵循软件设计原则:模块的高内聚和低耦合,这些都是基本原则,不再赘述。需要注意的一点是由于框架作为 企业环境的一部分,必然涉及与其他系统的多种接口,比如和case数据库连接实现自动化测试案例自动获取,和mail服务器连接实现邮件实时通知,和 bug数据库连接实现bug的自动提交,因此,在接口设计上要尽量保证扩展性和兼容性。
    AC采用的数据接口为xml,这有两个显然的好处
    1.xml是数据存储的标准规范,可与其他系统保持非常强的兼容性
    2.xml的utf-8可支持多种字符,不用担心乱码的问题

    3.框架实现中的数据驱动思想
    数据驱动在这里有两层意思,第一,框架实现上完全数据驱动,不能存在hard-code的问题,比如被测server信息,测试案例等信息以xml配置文 件的形式放在框架外面,要换个server或运行另外一套测试案例,只需更改xml文件即可;第二,框架要提供规范和策略,使得脚本同样必须遵守数据驱动 的原则。
    AC提供excel数据全局加载机制,所有的数据都可以放在外部的excel里,AC会在case运行时加载数据,case则只需调用接口即可获得数据,数据驱动实现十分方便。
    自动化测试与手工测试流程的整合
    我们的企业不是试验的学校,也不是花拳绣腿的作秀场,在企业里做事往往从务实和实际效益出发,以结果为导向,因此,“自动化测试”在我们看来,重点在“测试”,而“自动化”只是一种手段而已。我们更关心测试整体的效果,不是么?
    下图是自动化测试与手工测试的整合流程,在此流程架构中,自动化测试以smoke test为中心,旨在保证产品版本的稳定性;手工测试以negative test为中心,意在验证产品的功能和健壮性。两种测试互为补充,相得益彰,大大提高了测试整体的效益
  • 【转载】WebLOAD Open Source 从入门到精通

    2009-06-08 15:22:09

    在jackei的博客上面看到了WebLOAD开源的消息,正好最近也有做自动化测试的需要,利用一天的时间学习了一下WebLOAD的使用方法。

     准备写一个简单的教程,一方面把自己的学习过程记录下来,另一方面把学习的经验分享给别人。

     首先在http://www.webload.org/上面进行注册,下载WebLOAD Open Source安装文件。

     RadView 
    www.radview.com/ 是个不错的公司,教程做的非常的专业,不需要注册就可以打开教程来学习,非常方便,值得夸奖。

     先给WebLOAD Open Sourece做个简介,然后咱们开始教程(其实链接了RadView的教程),最后我自己总结了一下。

     一.WebLOAD简介
     1.可以进行Web Application性能测试
     2.可以进行Web Application功能测试
     3.可以进行Html的分析
     4.Open Source如果想进行测试工具的开发也是不错的参考
     

     二.WebLOAD教程

     WebLOAD动画教程地址 
    http://radview.cachefly.net/Tutorials/menu_page.html

     1. Recording an Agenda

    2. Debugging an Agenda

    3. Correlation Adjustments

    4. Parameterization

    5. Load Template Definitions

    6. Cruise Control Wizard (Goal-Oriented Testing)

    7. Mix of Agendas

    8. Running the Test

    9. Functional Testing

    3.WebLOAD总结:利用一天时间把这个系列教程学习完毕,来谈谈收获吧。

    1.学会了利用WebLOAD来录制测试脚本,脚本可以进行编辑,WebLOAD IDE分为脚本编辑模式和脚本调试模式,对WebLOAD映象不错,工具做的不错挺专业的。

    2.学会了利用WebLOAD IDE进行脚本调试,用过VS的程序员都很容易上手,调试的快捷键都与VS相同,支持断点,查看调用栈,查看变量等功能。

    3.Correlation Adjustments在WebLOAD Open Source版本中没有找到这个功能挺遗憾的,这个地方是专业版与Open Source版本的差别之处。

    4.学会了在WebLOAD中如何使用参数,在Web Application测试过程中,不同的客户端的Session是不同的,需要将Session变量化,WebLOAD介绍了智能拷贝和参数化Session的方法,我个人的理解一个Session对应着一个虚拟的客户端,必须将Session变量化才能模拟多个客户端同时在线的场景。

    5.从Load Template Definitions就开始讲解WebLOAD的另一个重要的组件 WebLOAD Console,WebLOAD IDE侧重于脚本的录制及编辑调试等功能而WebLOAD Console侧重于加载生成的脚本,定义LOAD客户端的策略,例如线性提高,随机变化加载虚拟客户端的数量,设定LOAD时间,而且可以生成随着时间和LOAD数量的报告,帮助我们找出系统瓶颈,在测试时可以动态加载监视对象,例如相应时间,CPU处理时间,内存占用率等等

    6.Cruise Control Wizard (Goal-Oriented Testing)  这个功能WebLOAD中没有,挺可惜的。

    7.Mix of Agendas可以在一个测试方案中添加多个测试脚本,这样可以模拟多个客户端的使用,例如:我们可以模拟10个客户端在登录,10个客户端在浏览网页,10个客户端在添加商品到购物车,然后每种功能的客户端还在不断的增长,这样的测试方案可以尽量的接近真实的环境,WebLOAD这个功能确实不错。值得夸奖。

    8.运行测试脚本,进行综合设置

    9.WebLOAD不仅可以进行性能测试,而且可以进行功能测试,功能测试的原理是可以查找相应的Html中的信息来判断测试脚本是否成功,例如:如果用户登录失败会显示为登陆失败,我们可以查找如果发现失败在Html的响应文本中我们就认为测试例失败了。另外对Html的学习也有帮助的。
  • 【资料】err.number的代码表

    2009-05-19 16:36:00

    错误代码   信息    
      5   无效的过程调用或参数    
      6   溢出    
      7   内存不够    
      9   下标越界    
      10   数组长度固定或临时锁定    
      11   被零除    
      13   类型不匹配    
      14   字符串空间溢出    
      28   堆栈空间溢出    
      35   Sub   或   Function   未定义    
      48   加载   DLL   时出错    
      51   内部错误    
      53   文件未找到    
      57   设备   I/O   错误    
      58   文件已存在    
      61   磁盘已满    
      67   文件太多    
      70   没有权限    
      75   路径/文件访问错误    
      76   路径未找到    
      91   未设置对象变量或   With   块变量    
      92   未初始化   For   循环    
      94   无效的   Null   使用    
      322   无法创建必要的临时文件    
      424   要求使用对象    
      429   ActiveX   部件无法创建对象    
      430   类不支持   Automation    
      432   Automation   操作过程中,未找到文件名或类名    
      438   对象不支持此属性或方法    
      440   Automation   错误    
      445   对象不支持此操作    
      446   对象不支持命名的参数    
      447   对象不支持当前区域设置    
      448   未找到命名参数    
      449   此参数必选    
      450   参数个数错误或无效的属性赋值    
      451   对象不是集合    
      453   未找到指定的   DLL   函数    
      455   代码资源锁定错误    
      457   此键已和集合中的元素关联    
      458   VBScript.   中不支持使用   Automation   类型的变量    
      500   变量未定义    
      501   非法赋值    
      502   用此对象进行   Script.   编程会出错    
      503   对象不能安全初始化    
      1001   内存不够    
      1002   语法错误    
      1003   缺少“:”    
      1004   缺少“;”    
      1005   缺少“(”    
      1006   缺少“)”    
      1007   缺少“]”    
      1008   缺少“{”    
      1009   缺少“}”    
      1010   缺少标识符    
      1011   缺少“=”    
      1012   缺少“If”    
      1013   缺少“To”    
      1014   缺少“End”    
      1015   缺少“Function”    
      1016   缺少“Sub”    
      1017   缺少“Then”    
      1018   缺少“Wend”    
      1019   缺少“Loop”    
      1020   缺少“Next”    
      1021   缺少“Case”    
      1022   缺少“Select”    
      1023   缺少表达式    
      1024   缺少语句    
      1025   语句未结束    
      1026   缺少整型常数    
      1027   缺少“While”或“Until”    
      1028   缺少“While”、“Until”或语句结尾    
      1029   局部变量或参数过多    
      1030   标识符过长    
      1031   无效的编号    
      1032   无效的字符    
      1033   未终止字符串常数    
      1034   未终止注释    
      1035   嵌套的注释    
      1037   “Me”关键字使用无效    
      1038   “Loop”缺少“Do”    
      1039   无效的“Exit”语句    
      1040   无效的“For”循环控制变量    
      1041   名称被重定义    
      1042   必须是行中的第一个语句    
      1043   无法为非   ByVal   参数赋值    
      1044   调用   Sub   时不能使用括号    
      1045   缺少字母常数    
      1046   缺少“In”    
      32766   True    
      32767   False    
      32811   未找到元素    
  • 【转载】框架经理-FrameworkManager简介

    2009-05-19 16:12:50

    框架经理-FrameworkManager简介

    作者:陈能技

    前言
        FrameworkManager是由Yaron Assa(www.AdvancedQTP.com)开发的一个开源的QTP自动化测试框架,目的是让QTP的脚本编写更为优雅和清晰(for elegant, clean scripting with QTP)。

    一、FrameworkManager简介
        FrameworkManager处理了应用程序的UI层的所有麻烦和细枝末节的琐碎事情,让你编写出更好、更清晰、更简介的测试脚本。FrameworkManager除了提供一个极为简单的接口用于构建和维护脚本之外,还解决了QTP的对象库和描述性编程的问题。
     
        通常我们构建的代码会变得很臃肿,过于复杂而难以维护,例如写了很多的Select-Case或If结构的语句(如果输入域仅能接受Email格式数据,则这样;如果只能接受地址,则那样...)。按照这种方式写的脚本会难以维护,因为一旦被测试的应用程序添加了新的输入域,则需要重复很多代码修改和调整的工作,使用FrameworkManager则能让这些工作成为过去。
     
        FrameworkManager仅仅关注脚本需要的信息,从而保持脚本代码的简单,避免凌乱的代码。决策判断的结构语句被分解成独立的小类,这些小类可以被轻易地维护和更新,而不至于引入大量的BUG。更重要的是,FrameworkManager是环境无关的,能被轻易地扩展用于处理那些尚未被识别的对象和控件。

    二、FrameworkManager的特点
        下面列举FrameworkManager的一些功能特性:
    1.保持脚本简洁明了。处理对象变成了简单的oObject.Input(“New Value”)。
    2.在内部自动处理不同输入类型,例如两个文本输入框,一个仅能输入Email,一个仅能输入数字。
    3.在内部自动处理相互关联的操作,也就是说,把两个或多个对象操作组合成一个逻辑顺序的操作,例如单击一个按钮来验证输入框的数据;输入密码紧跟着验证密码。

    4.在内部自动选择值验证的方式,例如:
    Delegation – 在某个对象中输入一个值,但是在另外一个对象中显示出来。 Regular Expressions – 输入一个值,但是以前缀或后缀显示出来。
    5.在内部自动处理条件输入-你可以很容易地设置一个标记来标识某个对象是不可输入的或不可操作的(untouchable),例如你有两个输入域,通过一个按钮来控制其“enabled”和“disabled”属性。
    6.在内部自动处理随机值-例如从一个combo-box或list-box控件中随机选择其中的一项。
    7.可轻易地为应用程序对象添加个性化的属性,例如标志某些输入域为强制性的(mandatory),把这些输入域与某个查询窗口中的数据域关联,然后在脚本中利用这些数据,快速填充这些强制性输入域的数据。
    8.被测试应用程序的对象都被结构化成一个树状,让你可以在脚本中做复杂的对象搜索和操作,例如在某个TAB页下的所有输入框输入所有数据;从一个WebTable转到其父级的Frame中。
    9.为了更好地组织对象树,可以添加一些虚拟的层次,从而得到一个可读性更强的对象树。
    10.可扩展性强-可以在不修改已有代码的情况下添加新的数据类型产生和输入方法。FrameworkManager可以处理你添加的任何扩展、不可识别的控件和针对被测试应用程序的业务逻辑处理。
    三、获取FrameworkManager
        FrameworkManager目前的最新版本是0.81,可到以下地址下载:
    http://www.advancedqtp.com/knowledge-base/projects/frameworkmanager/frameworkmanager-version-081/ 下载后把文件解压出来,可看到FrameworkManager的文件结构如下所示: \Documentation 帮助文档。 \Libraries FrameworkManager框架的代码,包括对象树类、输入类等。 \Resources 包含对象树的Excel文件。 \Demo App 用于演示FrameworkManager用法的Demo小程序。 \Tests 用于演示FrameworkManager用法的Test。

    四、FrameworkManager框架的组成
    FrameworkManager框架主要由3大部分组成:
    1.对象树文件(ObjectTree)
    这个Excel文件作为可扩展的对象库(Object-Repository),它包含FrameworkManager识别对象所需要的所有数据,以及所有对象的元数据(meta-data),例如强制输入域等。
    2.对象树类(clsTreeLevel)
    这个类包含FrameworkManager的真正机制。在运行时,根据对象树Excel文件生成对象树实例,所以对象操作都是通过树节点进行封装的。
    3.子类(Min、i-classes)
    对于树中的每一个节点(例如clsTreeLevel类中的每一个实例),都可以“插入”(plugged)一个这样的子类(mini-class)。它们控制相关的程序对象如何输入数据、操作,如何产生随机的数据等。

    对象树Excel文件
         可以在\Resources\ObjectTree.xls中找到该Excel文件,如果要让clsTreeLevel.vbs正确地运行起来,请确保把clsTreeLevel.vbs文件中的sExcelFile这个常量的值修改为Excel文件所在的实际路径,对象树类与对象树就是通过这个常量关联起来的。
    打开Excel文件可看到如图1所示的内容
        

        可以看到Excel文件分成两部分,左边部分是具有层次结构关系的对象树,右边部分是对象的相关属性,例如QTPClass、InPutType等。 下面解释一下Excel表中右边部分的各个列名所代表的属性的含义:
    ? Mandatory – True/False:用于标识该输入域是否为强制性的。
    ? Condition-只有当该输入域的条件得到满足时,才输入。在Excel单元格中填写的格式是:FieldName>Expected Value| FieldName>Expected Value(多个条件用“|”隔开),例如VB Demo_Example 2_Field 1_Enable_Flag>False表示在对象数中该节点的值必须为False。对于负条件,则使用:FieldName>%NOT%UnExpectedValue
    ? PreActions – 在输入之前必须完成的操作,填写格式为:FieldName>Value|FieldName>Value(多个前置的操作用“|”隔开),输入空值可用“%EMPTY%”表示。
    ? PostActions-与PreActions类似,用于表示在输入之后必须完成的操作。
    ? DPID-对象的描述性编程字符串,例如:vbname:=Something|visible:=True。如果不想使用描述性编程,而是希望通过自己编写的函数来指向一个QTP对象的话,则可使用“%FunctionName%”来获取,例如下面的GetBrowser函数:
        Function GetBrowser(sRedundentParam)
         If Browser("Something").Exist then
        Set GetBrowser = Browser("Something") 
        Else Set GetBrowser = Nothing End If End Funtion

    QTPClass-指定对象的类型(micclass),例如VBCombobox、Browser等。
    ? InputType-当给对象树的某个节点输入时采用的子类,例如Text、Combo。这里填入的子类名加上前缀“Input”和后缀“Class”就成为脚本中能识别的子类(mini-class),对应IputClasses.vbs中的InputTextClass、InputButtonClass等。
    ? Type-对象树节点的业务逻辑意义,例如Field、Tab、SaveButton等。
    ? RandomValueType-当给对象树的某个节点随机输入时采用的子类,例如Text、Combo等。这里填入的子类名加上前缀“RandomValue”和后缀“Class”,就成为脚本中能识别的子类,对应RandomValueClasses.vbs中的RandomValueTextClass、RandomValueCheckboxClass等。
    ? ValueInObject-对象树节点的输入操作被验证时所需的标识。有时候在一个字段输入一个值后,需要访问另外一个字段或对象,以便检查输入是否成功。
    ? ValidatePattern-用于验证输入操作的正则表达式。用%Value%表示原本的输入值。用“.*%Value%.*”表示实际值中只要包含了原本的值即为成功。

    ? clsTreeLevel类
        clsTreeLevel类用于构建Excel文件中所描述的对象树的实例。实例化的对象树用一个公共变量oRoot来保持,通过oRoot,可以访问到对象树中的任何一个指定的节点,例如:oRoot.GetLeaf(Identifier),这个方法返回对象节点的实例。 对象树的每个节点都有一个GetChildList和GetParentList方法,用于返回当前节点的儿子对象列表或父亲对象列表,通过这两个方法可以实现对象树节点的导航,访问任何需要的节点。 通过oNode.QTPObject.GetROProperty可以获取某个节点对象的属性,

        例如QTPObject.GetROProperty("enabled")返回对象节点的enabled属性。 每个节点对象都有一个Input方法,用于对被测试应用程序中的相应对象做输入操作,例如单击一个按钮、设置日期等。 每个节点对象都有一个Value属性,可以返回对象的当前值。 如果你想对节点对象做额外的非标准的输入操作,则可以在各输入子类(mini-class)中定义个性化的操作,然后通过ExecuteCustom命令来激活它们。

    ? 输入子类(InputClasses)和随机值子类(RandomValueClasses)
    为了保持主类(clsTreeLevel)的代码稳定、清晰和简洁,处理实际对象的操作和输入并没有在主类中实现,而是在单独的子类中处理,每一个子类负责特定类型的对象的任务处理,例如InputTextClass用于处理标准的文本输入框,InputComboboxClass则用于处理标准combo-box输入框。 目前为止,FrameworkManager提供两种类型的子类(mini-class):输入类(Input)和随机值类(RandomValue)。输入类用于处理对象,随机值类用于产生随机值。每个节点对象通过Excel表格中的设置的InputType和RandomValueType来关联相关的子类。

         可以为FrameworkManager扩展新的子类。如果碰到未处理的控件,可以立即编写一个新的子类,在Excel文件中设置相关的类名即可,而不需要更新那些select-case或if结构语句。

    五、FrameworkManager的使用方法
        基于前面对FrameworkManager框架的分析,我们基本上明白了FrameworkManager的整体框架的原理。下面简单介绍一下FrameworkManager的使用方法。

        首先,需要在Test的Resources中添加FrameworkManager框架文件目录中的Libraries下的几个文件,包括clsTreeLevel.vbs、General.vbs、InputClasses.vbs、RandomValueClasses.vbs,如图2所示。
               
           添加了这些库文件后,就可以使用FrameworkManager了。针对被测试应用程序,我们还需要为其建立对象树,这个需要在ObjectTree.xls文件中进行编辑。包括各个对象节点以及对象节点所对应的输入操作等。 有了对象树后,我们就可以通过类似下面的脚本来使用FrameworkManager进行对象的测试: Call oRoot.GetLeaf("VB Demo_Example 1_Field 1").Input("Random") 读者可以先参考FrameworkManager框架所附带的Demo程序来了解FrameworkManager的使用方法。然后再修改ObjectTree.xls文件,替换成自己的测试项目中的对象和所需的输入操作。

       
     

  • 庆祝51Testing软件测试网成立五周年

    2009-05-05 14:15:48

    5周年了,陪伴我们不断成长~

    期待下个5年~

  • 自动化测试内功修炼心法

    2009-04-08 09:13:04

    声明本文属于原创,请勿随意转载,如有需要,请先经过笔者同意.尊重原创,鼓励原创.

    内功心法前提条件

    修炼此功必先戒骄戒躁,

    要想练成此功需要多想多做.

    一.初级阶段,

    在这个阶段除去了刚开始时候新鲜感以后,坚持是很重要的,学习在线帮助时很枯燥的,很多东西看不懂,很多东西是懂非懂的,特别是看英文的帮助对于一部分英文基础比较薄弱的测试人员会望而却步,其实不妨学习的时候看看中文版本的,然后拿手头的项目练习,有问题先思考,查英文帮助(因为英文的描述最地道),自己找答案,最后才提问。往往能成为高手的人,自己解决的问题都很强的.于是找一个好的学习文档很重要,笔者推荐论坛里的精华文章,同时也期待一本可以结合实践的书来指导大家的学习.

    二.中级阶段

    三人行必有我师,学习别人是一条捷径.现在网络上积累了很多很好的知识,去学习前人积累的经验,特别是别人的问题和解答的办法。最关键是自己要去实践,掌握了才是自己的.积累的过程是漫长的,捷径就是自己找一个项目去练习,巩固知识点,同时收获很多心得.

    三.高级阶段

    去尝试帮助别人解答问题,从中提高自己解决问题的能力,同时增加自己的积累。在帮助别人的时候,自己往往能提高的更多,并享受其中的成就感.这时候除了国内的几个大网站,不妨去国外的网站走走看看,总能看到一些让自己兴奋不已的东西.这个阶段,我们要求精益求精的提高我们脚本的质量,包括一些特殊功能方面的研究,比如框架管理,日志系统,研究DLL等等.此时你需要掌握至少一门开发语言,测试并不只是写用例,点鼠标的黑盒缺陷杀手,今后的趋势要求测试人员具备更多技能,比如开发,设计,管理,专业背景等知识.

    四.最终阶段

    学无止境,其实单单QTP有很多方面可以研究,开发插件,拓展自己的知识面,不可以停顿自己前进的步伐,开拓研究还没被大家熟悉的领域。引领潮流,或许几年里QTP会被更先进的东西替代,不变是我们追求知识的执著.不骄傲不自满,乐于分享,收获更多.

     

  • 也谈单元测试

    2009-03-25 09:20:09

    也谈单元测试

    Founding测试工作室

    引子

    一般的业界认为,80%的缺陷将会在单元测试阶段(Unit Test)被发现并解决,而系统集成测试(SIT)只能发现总缺陷数的15%,最终在客户验收测试(UAT)只会发现少于5%的缺陷,而这3个阶段修改的成本也是成几何级数增长,比如在单元测试阶段花1块钱能修复的缺陷,到了系统集成测试阶段就需要至少10块钱,因为经过测试人员的发现,开发人员确认修复,最后测试人员的关闭,经历了一系列的流程,成本自然会很高,至于到了客户验收测试的时候,除去了修改缺陷,内部回测以外,大量缺陷往往会遗失客户的信心,危害巨大.于是本文将着力介绍单元测试,希望对广大开发人员有所帮助.

     

    关键字

    单元测试,系统集成测试,用户接收测试

     

    单元测试的定义

      单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。例如,你可能把在出生日期的输入框中输入我爱方正”,那么我们的程序需要截获这样的异常,并在页面给与客户友好的提示信息。

      单元测试通常是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。

      工厂在组装一台电视机之前,会对每个元件都进行测试,这,就是单元测试。

      其实我们每天都在做单元测试。你写了一个函数,除了极简单的外,总是要执行一下,看看功能是否正常,有时还要想办法输出些数据,如弹出信息窗口什么的,这,也是单元测试,我们把这种单元测试称为临时单元测试。只进行了临时单元测试的软件,针对代码的测试很不完整,代码覆盖率要超过70%都很困难,未覆盖的代码可能遗留大量的细小的错误,这些错误还会互相影响,当BUG暴露出来的时候难于调试,大幅度提高后期测试和维护成本,也降低了开发商的竞争力。可以说,进行充分的单元测试,是提高软件质量,降低开发成本的必由之路。

      对于程序员来说,如果养成了对自己写的代码进行单元测试的习惯,不但可以写出高质量的代码,而且还能提高编程水平。

     

    为什么要使用单元测试

      我们编写代码时,一定会反复调试保证它能够编译通过。如果是编译没有通过的代码,没有任何人会愿意交付给自己的老板。但代码通过编译,只是说明了它的语法正确;我们却无法保证它的语义也一定正确,没有任何人可以轻易承诺这段代码的行为一定是正确的。

      幸运,单元测试会为我们的承诺做保证。编写单元测试就是用来验证这段代码的行为是否与我们期望的一致。有了单元测试,我们可以自信的交付自己的代码,而没有任何的后顾之忧。

      什么时候测试?单元测试越早越好,早到什么程度?XP开发理论讲究TDD,即测试驱动开发,先编写测试代码,再进行开发。在实际的工作中,可以不必过分强调先什么后什么,重要的是高效和感觉舒适。从我们的经验来看,先编写产品函数的框架,然后编写测试函数,针对产品函数的功能编写测试用例,然后编写产品函数的代码,每写一个功能点都运行测试,随时补充测试用例。所谓先编写产品函数的框架,是指先编写函数空的实现,有返回值的随便返回一个值,编译通过后再编写测试代码,这时,函数名、参数表、返回类型都应该确定下来了,所编写的测试代码以后需修改的可能性比较小。

      由谁测试?单元测试与其他测试不同,单元测试可看作是编码工作的一部分,应该由程序员完成,也就是说,经过了单元测试的代码才是已完成的代码,提交产品代码时也要同时提交测试代码。测试部门可以作一定程度的审核。

      

      单元测试不仅仅是作为无错编码一种辅助手段在一次性的开发过程中使用,单元测试必须是可重复的,无论是在软件修改,或是移植到新的运行环境的过程中。因此,所有的测试都必须在整个软件系统的生命周期中进行维护。

      经常与单元测试联系起来的另外一些开发活动包括代码走读(Code review),静态分析(Static analysis)和动态分析(Dynamic analysis)。静态分析就是对软件的源代码进行研读,查找错误或收集一些度量数据,并不需要对代码进行编译和执行。动态分析就是通过观察软件运行时的动作,来提供执行跟踪,时间分析,以及测试覆盖度方面的信息。

    现状分析

      工作中,笔者也遇到了很多开发人员会有一些理由来证明可以不做单元测试,下面罗列了一部分,和大家分享.

      1 编写单元测试太花时间了。

      我们知道,在开发时越早发现BUG,就能节省更多的时间,降低更多的风险。

      如果你仍然认为在编写产品代码的时候,还是没有时间编写测试代码,那么请先考虑下面这些问题:

      1)、对于所编写的代码,你在调试上面花了多少时间。

      2)、对于以前你自认为正确的代码,而实际上这些代码却存在重大的bug,你花了多少时间在重新确认这些代码上面。

      3)、对于一个别人报告的bug,你花了多少时间才找出导致这个bug 的源码位置。

      回答完这些问题,请你一定不再以太花时间作为拒绝单元测试的借口。

      2 运行测试的时间太长了。

      合适的测试是不会让这种情况发生的。实际上,大多数测试的执行都是非常快的,因此你在几秒之内就可以运行成千上万个测试。但是有时某些测试会花费很长的时间。这时,需要把这些耗时的测试和其他测试分开。通常可以每天运行这种测试一次,或者几天一次。

      3 测试代码并不是我的工作。

      你的工作就是保证代码能够正确的完成你的行为,恰恰相反,测试代码正是你不可缺少的工作。

      4 我并不清楚代码的行为,所以也就无从测试。

      如果你实在不清楚代码的行为,那么估计现在并不是编码的时候。如果你并不知道代码的行为,那么你又如何知道你编写的代码是正确的呢?

      5 但是这些代码都能够编译通过。

      我们前面已经说过,代码通过编译只是验证它的语法通过。但并不能保证它的行为就一定正确。

      6 公司请我来是为了写代码,而不是写测试。

      公司付给你薪水是为了让你编写产品代码,而单元测试大体上是一个工具,是一个和编辑器、开发环境、编译器等处于同一位置的工具。

      7 如果我让测试员或者QAQuality Assurance)人员没有工作,那么我会觉得很内疚。

      你并不需要担心这些。请记住,我们在此只是谈论单元测试,而它只是一种针对源码的、低层次的,为程序员而设计的测试。在整个项目中,还有其他的很多测试需要这些人来完成,如:功能测试、验收测试、性能测试、环境测试、有效性测试、正确性测试、正规分析等等。

      8 没有真实的环境运行单元测试。

    有时候因为模块开发计划的问题,有的模块没办法走通正常的流程,但是我们现在所讨论的只是针对开发者的单元测试。也就是说,你可以自己在数据库创建测试数据,或者使用mock 对象,来完成测试。

      

    题外话

      写这篇文章,没别的意思,就想来说明,单元测试的重要性,呼吁公司上下重视起测试工作,为提交一个高质量的应用系统给客户而努力.

  • What's Agile Test?

    2009-02-23 09:59:20

    What's Agile Test?Please check it.

  • You are not working on an Agile Project.
  • You are working on an Agile project and the iteration size is > 30 days.
  • Your iteration size is > 2 weeks.
  • You are not working in an open office or lab.
  • You have no unit tests.
  • You are not writing unit tests first.
  • You have no acceptance tests whether automated or manual.
  • You have no continuous build process.
  • You have no automated acceptance tests.
  • You are not pairing
  • Less than 100% of your features are defined by automated acceptance tests. 
  • You do not develop features in an order chosen by the customer
  • You do not deploy to production at the end of each iteration
  • You do not talk to your customer every day
  • The customer does not sit alongside the developers
  • Customer cannot reprioritises features at the end of each iteration. 
  • SaaS是什么

    2009-02-06 10:50:37

    SaaS是什么  
      SaaS是Softwareasaservice(软件即服务)的简称,它是一种通过In鄄ternet提供软件的模式,用户不用再购买软件,而改用向提供商租用基于Web的软件,来管理企业经营活动,且无需对软件进行维护,服务提供商会全权管理和维护软件,对于许多小型企业来说, SaaS是采用先进技术的最好途径,它消除了企业购买、构建和维护基础设施和应用程序的需要,近年来,SaaS的兴起已经给传统套装软件厂商带来真实的压力。
      SaaS服务模式
      SaaS服务提供商为中小企业搭建信息化所需要的所有网络基础设施及软件、硬件运作平台,并负责所有前期的实施、后期的维护等一系列服务,企业无需购买软硬件、建设机房、招聘IT人员,只需前期支付一次性的项目实施费和定期的软件租赁服务费,即可通过互联网享用信息系统。服务提供商通过有效的技术措施,可以保证每家企业数据的安全性和保密性。企业采用SaaS服务模式在效果上与企业自建信息系统基本没有区别,但节省了大量用于购买IT产品、技术和维护运行的资金,且像打开自来水龙头就能用水一样,方便地利用信息化系统,从而大幅度降低了中小企业信息化的门槛与风险。
      SaaS服务优势
      对企业来说,SaaS的优点在于:
      ⒈从技术方面来看:企业无需再配备IT方面的专业技术人员,同时又能得到最新的技术应用,满足企业对信息管理的需求。
      ⒉从投资方面来看:企业只以相对低廉的“月费”方式投资,不用一次性投资到位,不占用过多的营运资金,从而缓解企业资金不足的压力;不用考虑成本折旧问题,并能及时获得最新硬件平台及最佳解决方案。
      ⒊从维护和管理方面来看:由于企业采取租用的方式来进行物流业务管理,不需要专门的saas平台维护和管理人员,也不需要为维护和管理人员支付额外费用。很大程度上缓解企业在人力、财力上的压力,使其能够集中资金对核心业务进行有效的运营。
      SaaS八大关键词
      1、多重租赁
      多个公司将其数据和业务流程托管存放在SaaS服务商的同一服务器组上,相当于服务商将一套在线软件同时出租给多个公司,每个公司只能看到自己的数据,由服务商来维护这些数据和软件。
      2、跨界混搭
      把多个不同的在线应用软件服务搭建成为一种新型的整合服务。用户通常只需要登录一次就可以使用集成好的应用软件组合。
      3、集成器
      可让你从一个应用程序中读取数据,然后下载到saas解决方案中(同样可以用于将数据送回到另一个应用程序中)。这种数据传送通常用于实时或批量传送的情况,企业完成初始数据的导入或导出,然后根据需要定期更新这些数据。
      4、解决方案扩展
      SaaS解决方案具有的扩展性让用户能够在已存在的软件结构上,按需再增加额外的工具或功能。
      5、垂直应用
      指为某一个领域(例如银行,医药等)建立一个专门的平台。
      6、参数应用
      传统软件模式下,改变软件服务功能需要重新编写相应代码。但在SaaS模式下,用户可通过输入新的参数变量,或者制定一些数据关联规则来开启一种新的应用。
      7、模块化
      IT经理可以像选择菜单那样任意地选择功能,关闭某些不需要用到的功能,也可以根据需求增加新的功能。
      8、在线SaaS
      这是相对于SaaS的前身——ASP(Ap鄄plicationServiceProvider,应用服务提供商)来说的,是一种早期的远程软件托管形式。跟如今直接在网上使用的系统相比,ASP时代的用户可能觉得通过专线或专用加密设备访问的系统来得更安心。
      SaaS特性
      1、互联网特性
      一方面,SaaS应用具备典型互联网技术特点;另一方面,SaaS极大缩短了用户与软件提供商之间的距离,使SaaS服务的营销、交付与传统软件相比有着很大不同。
      2、多租户(Multi-tenancy)特性
      SaaS服务通常基于一套标准软件系统为成百上千的不同客户(又称租户)提供服务。由于软件服务同时支持多个租户,每个租户又有很多用户,这对支撑软件的基础设施平台的性能、稳定性、扩展性提出很大挑战。
    3、服务特性
      SaaS使得软件以互联网为载体的服务形式被客户使用,所以服务合约的签定、服务使用的计量、在线服务质量的保证、服务费用的收取等等问题都必须考虑。

  • [转载]自动化测试ROI分析

    2008-12-03 10:52:41

    1.   介绍

    很多领导将自动化测试视为银弹。他们认为自动化测试能解决诸如测试规划、测试成本、缺陷报告等很多问题。自动化测试在很多方面会带来积极的效果,并且已经有很多成功的案例能使人们认为自动化测试能节省成本和解决一些测试方面的问题。但是,同样存在很多恐怖的故事,失望大于期望、过程的痛苦,甚至出现在某些获得了收益的案例里。我就曾经遇到过很多自动化测试项目最终不幸失败的案例。这些项目进行了巨大的投入,最终都舍弃了花费数年的时间开发出来的自动化测试成果。

    本文的目的就是基于有实际意义的指导,使人们能够理解和计算进行自动化测试工作所需的投入和可能获得的回报。它描述了在建设自动化测试的过程中将会遇到的诸如商务、组织和管理、以及测试工作方面的影响。

    在规划自动化测试的时候,要从多方面来考虑。例如,自动化测试将会改变测试的复杂性,也将会改变从测试设计到测试运行的测试组织和管理方法。它通常在组织管理方面带来广泛的影响,诸如任务执行、测试方法、甚至在产品的特性上。

    在考虑自动化测试的收益和能力上,我们可以将影响因素分为有形的和无形的两类。

    在自动化测试的前后可以用现有的测量技术(例如代码覆盖分析)来评估和计算测试的效果。自动化测试可以达到非常有效的程度,可以增加代码覆盖的程度,可以提供一个新的角度来观察被测软件。同时,自动化测试为我们提供了一种手工测试无法实现某些特定测试的解决途径。自动化测试可以产生无数的指令和组合方式,仅仅受限于电脑的能力和可用来运行测试的时间而已。这些测试可以在覆盖了100%的代码基础上去发现缺陷。自动化的探针程序可以看到程序的内部,诸如中间处理的结果、内存中的数据、内部程序的状态,从而能判断被测软件是否能完成期望的功能。

    2.   管理的观点

    我们需要在多个方面设置管理上的期望值:无形成本和收益、不切实际的收益期望、手工测试和自动化测试的共同因素、组织的影响。我们也要注意测量和计算的方法。

    无形成本是非常难于合理的计算的。在可衡量它们的点上,当我们确定它们的财务上的价值时会存在很大的变数。在衡量自动化测试能带来多大的改变时也很难计算实际的数值。通常情况下,有的无形成本是绝对的,有时是相对的,但是绝大部分是无法区分的,这要取决于一个人的观点和处理的方式。基于这个理解,建议在大多数的案例中,尽量将这些无形成本从投入回报比的计算中省去。

    一些无形成本的例子:

    1              无用户干预的测试。尽管人的成本很容易计算,但是附加的计算机控制行为的成本是很难量化的。

    2              测试机构的经过改良的方法。这一点通常能提高生产力,但随之而来的是自动化测试所需的新规则和新任务。

    3              测试机构的可观察到的骤然生产力的降低。这个观察一般基于测试工作启动后人员开始逐渐增加时出现了停滞的现象,安装测试工具和创建自动化测试脚本的延迟。

    4              并非所有测试组里的人都期望改变。自动化测试会迫使个人习惯产生很大的改变,甚至某些测试人员在仍需继续执行手工测试时,还得进行自动化测试。

    5              发布前软件产品测试循环的次数。自动化测试能对产品的构建(Build)进行快速确认,并能鼓舞人们多次使用。但是往复循环虽然能提高生产力和提高质量,也可能导致人员的懒散、关注力逐渐降低、和质量逐渐降低的情况。

    6              测试覆盖率。既能增加测试覆盖率,也可能反之,主要取决于手工测试的效率,自动化的测试工具,和自动化的测试。

    a)        某些测试只能用自动化测试来实现

    b)        测试覆盖率改变的数值难于测量

    c)        好的探索性的测试或许比一般的自动化测试更能发现一些不同寻常的情况

    d)       手工测试可能使得某些情况或者环境难于进行自动化

    自动化测试管理的期望值往往在设定上受到媒体、会议、厂商的大肆宣传、相关书籍上对自动化优点的宣扬。部分信息是准确的和可适用的,但是大部分信息是出现在某些特定的环境下,适用于某些特定的项目,并且被过分的强调了成功这个字眼。自动化测试不是一个银弹。它不能解决所有的测试方面的问题,需要进行小心细致的规划。不正确的期望会最终导致一个获得了收益的自动化测试变成了失败的案例。

    例如:

    1所有的测试都要自动化。这是不切实际和可望不可即的。

    2从自动化测试获得立即的回报。某些自动化测试可能能看到立即的效果,例如Build测试,但通常情况下,回报总是在投入一段时期后才能看到。需要花费很多的时间和努力来创建大多数的自动化测试内容,而收效总是在一遍又一遍的测试运行之后才能获得。

    3零启动时间。将测试自动化是要花费时间的。要选择测试工具、搭建、安装,而规划和实现自动化测试则要花费数倍于手工测试的功夫。

    4自动化所有测试规划的内容。自动化测试工具无法做所有的事情。

    5使用录制/回放进行回归测试。这种情况仅适用于被测软件非常稳定,即将来只有极少的测试案例会发生改变。这种情况非常少。

    6自动缺陷报告(无需用户干预)。这通常会给测试的组织或开发带来很大的问题。包括判断是否与已有缺陷重复,错误的失效原因探测,一个错误引起多个测试的失效,无法重现的错误等等。

    组织管理方面的影响包括设计自动化测试和执行自动化测试所需的技能、自动化测试工具、自动化测试环境。开发和维护自动化测试与手工测试之间是有很大的区别的。在建设自动化测试时,工作技能变了、测试方法变了,甚至测试本身也发生了变化。自动化测试还会对被测的产品、开发过程和发布过程产生潜在的影响。我们不得不仔细考虑和分析这些影响中的积极和消极的因素。

    自动化测试若想成功,要从管理上设置合理的期望值,要正确地认识到将要从自动化测试中获得哪些益处。关键是要牢记自动化测试的目标是要在某些方面将测试做的更好。自动化测试仅仅是一个手段,借助这个手段来完成我们的任务测试一个软件产品。在管理测试工作和向测试工作进行投入方面,成本/收益的分析向我们提供了非常有用的信息。

    我们也要看到,不同的自动化测试实施行为将会带来好处,也会带来问题。例如,自动化测试将会减少测试所需的人力资源,从而节省运行测试过程中的人力耗费。但是,自动化测试也可能会产生各种各样的结果,需要耗费更多的人力进行分析,从而产生比手工测试更多的人力成本耗费。通常情况下,获得自动化测试的结果后,需要更长的时间去分析和隔离所发现的缺陷。

    3.   投入回报比的影响要素

    投入回报比(ROI)通常用获得的收益除以投入成本来计算。如果我们开始一个新的项目,我们就用测试的价值除以测试的成本来计算测试的投入回报比。有时,自动化测试的引入发生在手工测试已经完成的一段时间之后。

    自动化测试的经济成本通常可以描述为固定成本或者可变成本。固定成本包括设备、工具、培训等。固定成本不受自动化测试的成果数量和运行次数的影响。而可变成本随着所开发出来的自动化测试的成果数量以及自动化测试的运行次数而增加或者减少。

    自动化测试固定成本的例子:

    1硬件

    2应用软件的许可证

    3应用软件的技术支持

    4自动化测试环境的设计和搭建

    5自动化测试环境的维护

    6脚本开发工具软件

    7脚本开发工具的许可证

    8测试工具的培训

    9测试工具的引入和启动

    自动化测试可变成本的例子:

    1自动化测试用例的设计

    2自动化测试用力的实现

    3自动化测试的维护

    4自动化测试用例的执行

    5自动化测试结果的分析

    6缺陷的报告

    7测试结果的报告

    8测试执行数据的保存

    9自动执行的测试

     

    手工和自动化测试具备一些共同的要素。

    共同要素的例子:

    1被测软件的分析

    2测试的规划

    3基础测试的设计

    4缺陷的报告

    5测试结果的报告的管理

     

    我们在计算自动化测试的经济要素时,可以将它与两个事物进行比较:手工测试或不进行测试(接受未知的风险而不进行测试)。

     

    在计算回报时,我们需要选定计算的时间周期(t)。通常情况下,可以根据一个项目的里程碑来确定计算的时间周期。而且,自动化测试的回报是发生在新版本发布之后的,也可以基于版本的发布来确定计算周期,同时要与下一个版本发布、下下一个发布保持一致。以这两种计算周期来计算自动化测试的回报,可有助于我们非常清楚的了解长期和短期的自动化测试收益。

    自动化测试的固定成本不是绝对值。这些成本需要在他们的有用生命周期内进行阶段性的分配,并且用时间周期(t)来调整。t的值要基于管理因素进行选择,例如产品发布之间的时间间隔、ROI的计算、对工具使用寿命的期望、对测试的寿命的期望等等,以达到使t值被计算时的合理性、有用性和简易性。这些成本的分配是以成本乘以t 查看(671) 评论(0) 收藏 分享 管理

  • [转载]自动化测试实施时的关键概念

    2008-12-03 10:44:03

    在进行自动化测试实施时,由于要涉及软件开发方、业务方、手工测试方、自动化测试方、测试管理方等不同的机构或单位,尤其是业务方的人员和软件测试的人员对软件测试的认识处于不同的理解层次,因此,需要自动化测试的实施组事先对自动化测试中要使用的一些概念向各个机构或单位普及,才能使大家在脑海中建立相同的概念范畴,使得自动化测试的实施事半功倍。

      我把曾经在建立自动化测试体系的过程中规定的一些主要的自动化测试名词分享给大家,以期参考:)

    (1)测试需求:

      是指在一定的测试策略前提下,对应于验证某个系统的业务需求或功能需求的测试要求


      对应于不同的测试目的,分为验证业务过程的流程类测试需求和验证功能点的功能性测试需求


      对于功能性测试需求的业务规则是指测试功能点的属性描述,包括数据规则、业务逻辑规则、用户操作(输入和输出)的约束规则等;

      对于流程性测试需求的业务规则主要是指业务流程分支条件,及其对应的流程处理逻辑规则。


      在自动化测试体系中,测试需求按照树型结构进行组织,树上存在叶节点和非叶节点

    (2)交易分支:

      基于确定的交易,是交易执行中一个不可再分顺序路径。


      一般而言,一个交易被执行的时候,存在多个执行路径。例如:对于活期续存,信用卡续存、借记卡续存就是不同的执行路径。


      一个交易分支,就是一个交易的栏位的输入执行序列,包括在什么位置、输入数据的类型、限制约束、有效条件、格式要求等。

    (3)业务组件:

      一种易于维护且可重复使用的单元,该单元包含执行特定任务的一个或多个步骤。


      一个业务组件一般映射到一个交易分支,是自动化测试体系中颗粒度最小的工件


      定义业务组件的目的是为了封装固定的测试执行步骤,在测试过程中以“引用”的方式进行调用和复用,以减少测试过程设计开发的工作

      在自动化测试系统中,业务测试过程对业务组件的一次“引用”也是业务组件的一次实例化过程


      业务组件是一系列执行步骤,可以在不同测试过程中因为不同的目的(如边界值,无效等价值,有效等价值)使用不同组的数据完成输入,得到不同的业务组件实例。


      业务组件可能需要来自外部源或其他组件的输入值,并可向其他组件返回输出值

    (4)业务过程:

      业务过程是对业务流的实现


      业务过程是一组交易分支的序列,不是一个孤立的行为,如一次任务,一次输入或一次输出,而是以为用户带来附加值的输出或结果告终的一系列活动。


      例如:以开户交易开始,然后存款到相应的账户,最后能查询到此笔存款结束。


      一个业务过程对应于相应业务流中的一条“路径”即一个业务规则
    需要注意的是,业务过程是不存在由于业务逻辑不同而产生的分支的,如果在业务流程中存在分支,则应该拆分为不同的业务过程

    (5)业务测试过程:

      每个业务测试过程完成一个对流程类测试需求叶子节点的具体验证。

      每个业务测试过程是独立的,不允许嵌套,并且之间没有关系,业务测试过程原则上是可以独立执行的完整“业务流”。


      业务测试过程之间的关系是间接的,通过测试需求组合在一起的。


      业务测试过程由关联在一起的一系列业务组件组成,这些业务组件都需要在业务测试过程中指定明确的执行时输入、输出数据,以及业务组件和业务组件之间的数据依赖关系、顺序依赖关系、时序依赖关系等关联。
    可以说,业务测试过程是一组具有依赖关系的业务组件,和执行时数据的集合。

    (6)测试运行计划:

      主要描述为完成系统的测试,按照测试方案的设计思想,参照业务测试过程,如何对业务测试过程进行组织,以及执行时的先后组合操作顺序及业务测试过程间的关联数据


      (原则上不建议按照测试过程间有关联来设计测试)。

      如果测试方案或测试过程发生变化,则要对运行计划进行及时的更新

  • [转载]企业实施自动化测试的筹备工作简介

    2008-12-03 10:41:07

      最近老徐开始着手整理和完善“组织级软件自动化测试体系”,逐渐将部分内容共享给大家,期望和广大软件测试从业者及爱好者共同探讨。

    测试筹备活动用于在整体自动化测试活动执行开始前,判断项目可能达到的自动化率、分析项目的手工测试现状、协调资源初步建立自动化测试小组,应该包括以下内容。

    (一)    确定实施自动化测试的应用系统对象

    测试管理部门接受来自业务部门和开发部门的自动化测试的申请

    测试管理部门主动提出对某个已上线运营系统自动化测试的要求

    (二)    确定可能达到的自动化率目标

    计划控制经理使用自动化率分析模型判断自动化测试的可能达到的自动化率目标,编制《自动化测试的自动化率目标分析报告》

    (三)    分析手工测试的现状

    计划控制经理使用手工测试现状分析模型分析项目的当前手工测试状态,判断手工测试现状是否存在影响自动化测试可行性的情况,编制《自动化测试的手工测试现状分析报告》

    (四)    初步建立自动化测试小组

    计划控制经理根据自动化测试小组组长的可用资源指定自动化测试小组组长,将《自动化测试的自动化率目标分析报告》和《自动化测试的手工测试现状分析报告》传递给自动化测试小组组长

    计划控制经理与自动化测试小组组长共同确认:启动“项目级自动化测试流程”

  • 751/41234>

    数据统计

    • 访问量: 77815
    • 日志数: 78
    • 文件数: 1
    • 建立时间: 2006-12-11
    • 更新时间: 2010-04-19

    RSS订阅

    Open Toolbar