日历

« 2008-10-11  
   1234
567891011
12131415161718
19202122232425
262728293031 

统计信息

  • 访问量: 1363
  • 日志数: 20
  • 建立时间: 2007-09-13
  • 更新时间: 2007-12-10

RSS订阅

我的最新日志

  • Perficient...The purpose toward which an endeavor is directed

    2007-11-18

     

    Responsibilities:

     

    ·         Responsible for test strategy and planning, test engineering and test reporting on projects.

    ·         Execute functional/non-functional requirements review to identify and validate testability.

    ·         Effectively identify testing requirements for projects.  This includes the entry/exit criteria, test environment, test objectives (types of tests, coverage levels, pass/fail rates), issue tracking and management mechanisms, metrics gathering and reporting techniques, personnel and timelines

    ·         Create, maintain and manage/coordinate testing resources to execute test plans

    ·         Create, maintain and test the test case and test scrīpts

    ·         Establish test environments and test data

    ·         Demonstrated experience in organizing, prioritizing, and coordinating their own work and that of other testers.

    ·         Coach and train junior testers

    ·         Evaluate automatic test tools.

    ·         Help define and implement processes and best practices with regard to automated testing.

    ·         Create generic and reusable testing solutions that are maintainable and adaptable to fast changing environment.

    ·         Effectively and efficiently communicate test result with develop team

    ·         Do defects analysis and track defect status.

    ·         Work closely with management, as well as design and development resources to efficiently perform project tasks 

    ·         Promote and enforce the BoldTech project delivery methodology as well as its evolution

     

    Qualifications:

    ·         B.S. in Computer Science (or related field)

    ·         At least 3 years in testing and 1 year leading a team of at least 2 testers..

    ·         Ability to work in a fast moving / changing environment

    ·         Background in commercial software and/or Internet application projects

    ·         Proven effective use of wide range of testing methods, tools and standards

    ·         Knowledge of multi-tier application architectures, software design, development methodologies and related tools

    ·         Significant background in test environment creation and maintenance

    ·         Familiar with one or more of the following programming languages: C++, VB/VBA, Java, etc.

    ·         Expertise or certification in one or more of the following tools: Visual Test, SilkTest Suit, WinRunner, LoadRunner, Quick test Pro.

    ·         Led the automation of tests for multiple software systems

    ·         Solid debugging and problem solving capability

    ·         Use of UNIX and/or Windows NT

    ·         Experience with relational databases- Oracle, SQLServer, MySQL etc. (a plus)

    ·         Proficiency with Microsoft Excel, Word, and Project

    ·         Strong leadership, mentoring and interpersonal skills

    ·         Highly organized and conscientious; extremely motivated, cooperative and flexible

    ·         Experience in delivering in a CMM 3 level organization of higher preferred

    ·         Good communication skills in English (verbal and written)

  • Loadrunner函数中文解释

    2007-11-09

    web_url

    语法:
    Int Web_url(const char *name, const char * url, <Lists of Attributes>, [EXTRARES,<Lists of Resource Attributes>,LAST)

    返回值
    成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。

    参数:
    Name:VuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。

    url:页面url地址。

    List of Attributes

    EXTRARES:分隔符,标记下一个参数是资源属性的列表了。

    List of Resource Attributes

    LAST:属性列表结束的标记符。


    说明

    Web_url根据函数中的URL属性加载对应的URL,不需要上下文。

    只有VuGen处于URL-based或者HTML-based(此时A scrīpt containing explicit URLs only选项被选中时)的录制模式时,web_url才会被录制到。

    可以使用web_url 模拟从FTP服务器上下载文件。web_url 函数会使FTP服务器执行文件被真实下载时的操作。除非手工指定了"FtpAscii=1",下载会以二进制模式完成。

    在录制选项中,Toos—Recording Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the current scrīpt step”时,List of Resource Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。

    通过修改HTTP头可以传递给服务器一些附加的请求信息。使用HTTP头允许请求中包含其他的内容类型(Content_type),象压缩文件一样。还可以只请求特定状态下的web页面。

    所有的Web Vusers ,HTTP模式下的WAP Vusers或者回放模式下的Wireless Session Protocol(WSP),都支持web_url函数。


    web_image

    语法:
    Int web_image (const char *StepName, <List of Attributes>, [EXTRARES, <List of Resource Attributes>,] LAST );

    返回值
    成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。

    参数:
    StepName:VuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。

    List of Attributes(服务器端和客户端映射的图片):SRC属性是一定会被录制到的,其他的ALT、Frame、TargetFrame、Ordinal则是有的话会被录制到。

    1、ALT:描述图象的元素。用鼠标指向图象时,所浮出来的文字提示。

    2、SRC:描述图象的元素,可以是图象的文件名. 如: button.gif。也可以使用SRC/SFX来指定图象路径的后缀。所有拥有相同此后缀的字符串都会被匹配到。

    3、Frame:录制操作时所在的Frame的名称。

    4、TargetFrame:见List of Attributes的同名参数。

    5、Ordinal:参见Web_link的同名参数。

    List of Attributes(客户端映射的图片):

    1、AreaAlt:鼠标单击区域的ALT属性。

    2、AreaOrdinal:鼠标单击区域的顺序号。

    3、MapName:图象的映射名。

    List of Attributes(服务器端映射的图片):尽管点击坐标不属于属性,但还是以属性的格式来使用。
     
    1、Xcoord:点击图象时的X坐标。

    2、Ycoord:点击图象时的Y坐标。

    EXTRARES:分隔符,标记下一个参数是资源属性的列表了。

    List of Resource Attributes:参见List of Resource Attributes一节。

    LAST:属性列表结束的标记符。

    说明

    web_image模拟鼠标在指定图片上的单击动作。此函数必须在有前置操作的上下文中使用。

    在Toos—Recording Option,如果录制级别设为基于HMTL的录制方式时,web_image才会被录制到。
     
    web_image支持客户端(client-side)和服务器端server-side的图片映射。

    在录制选项中,Toos—Recording Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the current scrīpt step”时,List of Resource Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。

    通过修改HTTP头可以传递给服务器一些请求附加信息。使用HTTP头允许请求中包含内容,如同压缩文件一样。还可以只请求特定状态的web页面。

    web_image支持Web虚拟用户,不支持WAP虚拟用户。

    例子

    下面的例子模拟用户单击Home图标以回到主页(黑体部分):

    web_url("my_home", "URL=http://my_home/", LAST);

    web_link("Employees", "Text=Employees", LAST);

    web_image("Home.gif", "SRC=../gifs/Buttons/Home.gif", LAST);

    web_link("Library", "Text=Library", LAST);

    web_image("Home.gif", "SRC=../../gifs/buttons/Home.gif", LAST);

    下面的例子模拟用户在客户端映射的图片上单击:

    web_image("dpt_house.gif",


           "Src=../gifs/dpt_house.gif",


           "MapName=dpt_house",


           "AreaOrdinal=4",


           LAST);


    下面的例子模拟用户在服务端映射的图片上单击:

    web_image("The Web Developer's Virtual Library",


           "Alt=The Web Developer's Virtual Library",


           "Ordinal=1",


           "XCoord=91",


           "YCoord=17",


           LAST);

    下面是一个使用文件名后缀的例子:它指定了dpt_house.gif作为后缀,所以象../gifs/dpt_house.gif、/gifs/dpt_house.gif、gifs/dpt_house.gif、/dpt_house.gif等都会匹配到。

    web_image("dpt_house.gif",

            "Src/sfx=dpt_house.gif", LAST);


    web_link

    语法:
    Int web_link (const char *StepName, <List of Attributes>, [EXTRARES, <List of Resource Attributes>,] LAST );

    返回值
    成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。

    参数:
    StepName:VuGen中树形视图中显示的名称,在自动事务设置中也被用做事务名称。

    List of Attributes:支持下列的属性:

    1.Text:超链接中的文字,必须精确匹配。

    2.Frame:录制操作时所在的Frame的名称。

    3.TargetFrame、ResourceByteLimit:见List of Attributes一节。

    4.Ordinal:如果用给出的属性(Attributes)筛选出的元素不唯一,那么VuGen使用此属性来指定其中的一个。例如:“SRC=abc.gif”,“Ordinal=3”标记的是SRC的值是“abc.gif”的第3张图片。

    EXTRARES:表明下面的参数将会是list of resource attributes了。

    LAST:结尾标示符。

    说明

    模拟鼠标在由若干个属性集合描述的链接上进行单击。此函数必须在前置动作的上下文中才可以执行。

    web_link 仅仅在基于HTML的录制方式中才会被VuGen捕捉到。

    非HTML生成的资源的例子有.gif 和.jpg图像。对于List of Resource Attributes参数来说,仅仅当Recording Options--Recording --HTML-based scrīpt-- Record within the current scrīpt step选项被选中时,它们才会被插入到代码中。

    可以通过改变HTTP头信息给服务器传递一些附加信息。使用HTTP头信息可以,允许响应体中包含其他的内容类型(Content-Type),例如压缩文件,或者只有满足了特定的状态才去请求web页。

    此函数值支持Web虚拟用户,不支持WAP虚拟用户。


    web_submmit_form

    语法:
    Int web_submit_form (const char *StepName, <List of Attributes>, <List of Hidden Fields>, ITEMDATA, <List of Data Fields>, [ EXTRARES, <List of Resource Attributes>,] LAST );


    返回值
    成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。


    参数:
    StepName:Form的名字。VuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。
    List of Attributes:支持以下属性:

    1.Action:Form中的ACTION属性,指定了完成Form中的操作用到的URL。也可以使用“Action/sfx” 表示使用此后缀的所有Action。

    2.Frame:录制操作时所在的Frame的名称。

    3.TargetFrame、ResourceByteLimit:见List of Attributes的同名参数。

    4.Ordinal:参见Web_link的同名参数。


    VuGen通过记录数据域唯一的标识每个Form。如果这样不足以识别Form,VuGen会记录Action 属性。如果还不足以识别,则会记录Ordinal 属性,这种情况下不会记录Action属性。

    List of Hidden Fields:补充属性(Serves)。 通过此属性可以使用一串隐含域来标识Form。使用下面的格式:

    STARTHIDDENS,

    "name=n1", "value=v1", ENDITEM,

    "name=n2", "value=v2", ENDITEM,

    ENDHIDDENS,

    List of Data Fields

    Data项用来标识form。Form是通过属性和数据来共同识别的。

    使用下面的格式来表示数据域列表

    "name=n1", "value=v1", ENDITEM,

    "name=n2", "value=v2", ENDITEM,

    ITEMDATA:Form中数据和属性的分隔符。

    EXTRARES:一个分隔符,标记下一个参数是资源属性的列表了。

    List of Resource Attributes:参见List of Resource Attributes一节。

    LAST:属性列表结束的标记符。

    说明

    web_submit_form 函数用来提交表单。此函数可能必须在前一个操作的上下文中执行。在Toos—Recording Option,只有录制级别设为基于HMTL的录制方式,web_image才会被录制到。

    在录制选项中,Toos—Recording Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the current scrīpt step”时,List of Resource Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。

    通常情况下,如果录制了web_submit_form 函数,VuGen会把“name”和“value”一起录制到ITEMDATA属性中。如果不想在脚本中以明文显示“value”,可以对它进行加密。把“Value”改为“EncryptedValue”,然后把录制到的值改为加密后的值。

    例如:可以把 "Name=grpType", "Value=radRoundtrip", ENDITEM

    改为:"Name=grpType", EncryptedValue=409e41ebf102f3036b0549c799be3609", ENDITEM

    如果你完整的安装了LoadRunner,那么打开开始菜单--Mercury LoadRunner—Tools--Password Encoder,这个小工具是用来加密字符串的。把需要加密的值粘贴到Password一栏,再点Generate按钮。加密后的字符串会出现在Encoded string框中。接着点Copy按钮,然后把它粘贴到脚本中,覆盖原来显示的“Value”。

    加密的另一种方法时使用lr_decrypt函数。方法:选择整个字符串,例如“Value=radRoundtrip”(注意不要选择引号),右击鼠标,选择Encrypt string选现,脚本会变为:

    "Name=grpType", lr_decrypt("40d176c46f3cf2f5fbfaa806bd1bcee65f0371858163"), ENDITEM,

    web_submit_form支持Web虚拟用户,不支持WAP虚拟用户。

    例子:

    下面的例子中,web_submit_form 函数的名字是“employee.exe”。此函数提交了一个请求,此请求包含雇员信息John Green。此函数没有使用属性(Attributes)是因为通过数据项已经能唯一的标识这个Form了。

  • JAVA测试工具简介

    2007-11-06

    Java测试工具介绍
    现在有很多软件都是基于Java的,如何测试这些Java程序就成了一个测试工程师的新课题。以下介绍一些测试工具,可以提高Java 程序的测试效率。

    1. 美国Segue公司的Silk系列产品
    Segue公司一直专注于软件质量优化领域。在Segue的产品套件中,拥有业内最强劲且最容易使用的、用于企业应用测试、调优和监测的自动化工具,能够帮助用户保障应用在其生命周期内的可靠性和性能。
    (1) SilkPerformer——企业级性能测试工具
    企业级自动化测试工具能够支持多种系统,如Java、.Net、Wireless、COM、CORBA、Oracle、Citrix、MetaFrame、客户机/服务器、以及各种ERP/CRM应用
    多项专利技术精确模拟各种复杂的企业环境
    可视化脚本记录功能及自定义工具简化了测试创建工作
    SilkPerformer的Java/.NET浏览器以及JUnit/NUnit测试输入功能简化了对并发访问情况下远程应用组件的早期负载测试工作
    方便易用,工作流向导会逐步引导用户完成整个测试流程
    (2) SilkTest International——业内唯一的Unicode功能测试工具
    SilkBean 充分利用 Java 语言的“编写一次,随处使用”的优点,让用户不必修改现有的脚本而能够在多种基于 Unix 的系统上运行
    能够识别多种开发平台,如Java、Javascrīpt、HTML、ActiveX、Visual Basic 和C/C++等
    一套脚本可供所有支持的语言使用
    内置的错误恢复系统不仅具有自定义功能,可进行无人看守的自动测试
    赛格瑞(Segue)公司是全球范围内专注于软件质量优化解决方案的领导者。2005年,赛格瑞(Segue)公司在中国设立了专门的销售服务公司,因此,赛格瑞(Segue)公司的软件测试产品在中国有了更好的技术支持。
    参考网站:http://www.segue.com.cn/
    推荐指数:★★★★★

    2. MaxQ
    MaxQ是一个免费的功能测试工具。它包括一个HTTP代理工具,可以录制测试脚本,并提供回放测试过程的命令行工具。测试结果的统计图表类似于一些较昂贵的商用测试工具。MaxQ希望能够提供一些关键的功能,比如HTTP测试录制回放功能,并支持脚本。
    参考网站:http://maxq.tigris.org/
    推荐指数:★★★☆☆

    3. Httpunit
    HttpUnit是一个开源的测试工具,是基于JUnit的一个测试框架,主要关注于测试Web应用,解决使用JUnit框架无法对远程Web内容进行测试的弊端。
    HttpUnit提供的帮助类让测试者可以通过Java类和服务器进行交互,并且将服务器端的响应当作文本或者DOM对象进行处理。HttpUnit还提供了一个模拟Servlet容器,让测试者不需要发布Servlet,就可以对Servlet的内部代码进行测试。本文中作者将详细的介绍如何使用HttpUnit提供的类完成集成测试。
    参考网站:http://www.httpunit.org/
    推荐指数:★★★☆☆

    4. Junit
    是通用的测试 java 程序的测试框架JUnit可以对Java代码进行白盒测试。通过JUnitk可以用mock objects进行隔离测试;用Cactus进行容器内测试;用Ant和Maven进行自动构建;在Eclipse内进行测试;对Java应用程序、Filter、Servlet、EJB、JSP、数据库应用程序、Taglib等进行单元测试。
    提供了一个Java代码的单元测试框架,以方便Java程序员进行持续的单元
    测试。JUnit 是Open Source 的,在XP(Extreme Programming)圈子里颇受欢迎。
    参考网站:http://www.junit.org/
    推荐指数:★★★★★

    5. Jtest
    Jtest是Parasoft公司推出的一款针对java语言的自动化白盒测试工具,它通过自动实现java的单元测试和代码标准校验,来提高代码的可靠性。Jtest先分析每个java类,然后自动生成junit测试用例并执行用例,从而实现代码的最大覆盖,并将代码运行时未处理的异常暴露出来;另外,它还可以检查以DbC(Design by Contract)规范开发的代码的正确性。用户还可以通过扩展测试用例的自动生成器来添加更多的junit用例。Jtest还能按照现有的超过350个编码标准来检查并自动纠正大多数常见的编码规则上的偏差,用户可自定义这些标准,通过简单的几个点击,就能预防类似于未处理异常、函数错误、内存泄漏、性能问题、安全隐患这样的代码问题。
    JTest最大的优势在于静态代码分析,至于自动生成测试代码,当然生成测试代码框架也是不错的,但要做好单元测试用户还要做大量的工作。
    出品人:Parasoft 公司
    主要功能:功能很丰富,包括白盒测试、黑盒测试、回归测试,以及代码风格的检查。
    参考网站:http://www.parasoft.com/jsp/aep/aep.jsp
    推荐指数:★★★★☆

    6. Hansel
    Hansel 是一个测试覆盖率的工具——与用于单元测试的 JUnit framework 相集成,很容易检查单元测试套件的覆盖情况。
    参考网站:http://hansel.sourceforge.net/
    推荐指数:★★☆☆☆

    7. Cactus
    Cactus是一个基于JUnit框架的简单测试框架,用来单元测试服务端Java代码。Cactus框架的主要目标是能够单元测试服务端的使用Servlet对象的Java方法如HttpServletRequest,HttpServletResponse,HttpSession等
    针对外部可测试组件运行时,需要把JUnit测试运行为发送HTTP请求给组件的客户端进程。为了在服务器容器内部运行JUnit测试,可以用Cactus框架,它是一个免费的开源框架,是Apache Jakarta项目的一部分。Cactus 包含了关于JUnit客户端如何连接到服务器,然后使测试运行的详细信息。
    参考网站:http://jakarta.apache.org/cactus/
    推荐指数:★★★★☆

    8. JFCUnit
    JFCUnit使得你能够为Java偏移应用程序编写测试例子。它为从用代码打开的窗口上获得句柄提供了支持;为在一个部件层次定位部件提供支持;为在部件中发起事件(例如按一个按钮)以及以线程安全方式处理部件测试提供支持。
    参考网站:http://jfcunit.sourceforge.net/
    推荐指数:★★★☆☆

    9. StrutsTestCase
    StrutsTestCase(STC)框架是一个开源框架,用来测试基于 Struts 的 Web 应用程序。这个框架允许您在以下方面进行测试:
    在 ActionForm 类中的验证逻辑(validate() 方法)
    在 Action 类中的业务逻辑(execute() 方法)
    动作转发(Action Forwards)。
    转发 JSP
    STC 支持两种测试类型:
    Mock 方法 —— 在这种方法中,通过模拟容器提供的对象(HttpServletRequest、 HttpServletResponse 和 ServletContext),STC 不用把应用程序部署在应用服务器中,就可以对其进行测试。
    Cactus 方法 —— 这种方法用于集成测试阶段,在这种方法中,应用程序要部署在容器中,所以可以像运行其他 JUnit 测试用例那样运行测试用例。
    参考网站:http:// strutstestcase.sourceforge.net/
    推荐指数:★★★★☆

    10. TestNG
    TestNG是根据JUnit 和 NUnit思想而构建的一个测试框架,但是TestNG增加了许多新的功能使得它变得更加强大与容易使用比如:
    支持JSR 175注释(JDK 1.4利用JavaDoc注释同样也支持)
    灵活的Test配置
    支持默认的runtime和logging JDK功能
    强大的执行模型(不再TestSuite)
    支持独立的测试方法
    参考网站:http://testng.org/
    推荐指数:★★★★☆

    10.Bean-test
    出品人:RSW 软件公司
    网址:http://www.testmybeans.com/
    主要功能:对EJB 应用软件进行负载和压力测试(load/stress testing),以衡量它的扩展性(scalability)。

    11.EJBQuickTest
    网址:http://www.ejbquick.com/
    主要功能:模拟EJB 应用软件的客户程序,进行方法调用(method invocation)。支
    持回归测试(regression testing),测试数据的生成,以及性能和压力测试。

    12.JStyle
    出品人:Man Machine Systems
    网址:http://www.mmsindia.com/
    主要功能:分析Java 源代码的质量,包括产生源代码的有关统计信息和指标度量。

    13.JProbe
    出品人:Sitraka 软件公司
    网址:http://www.klgroup.com/
    主要功能:对Java 代码进行内存测试和性能剖析(profile),有针对EJB 的服务器端版本和针对普通Java 代码的客户端版本。

  • (转)选择测试自动化框架

    2007-11-06

       一种测试自动化框架(test automation framework)是由一些假设,概念和为自动化软件测试提供支持的实践组成的一个集合。这篇文章描述并演示了5种基本的框架。
     
    基于只使用一种捕获工具例如IBM Rational® Robot来录制并且回放测试用例而得出自动化测试工作量是有缺陷的。只使用一种捕获工具来运行复杂且巨大的测试是非常耗费时间和昂贵的。因为这些测试是随机创建的,他们的功能性是很难追踪和重现,而且维护成本也是非常昂贵的。
    对于一个刚刚起步的自动化测试小组,更好的选择是使用一种测试自动化框架,它已经定义好了由一些假设,概念和制定工作平台或为自动化测试提供支持的实践组成的集合。在这篇文章中我试着将一些我熟悉的测试自动化框架-特别是测试脚本模块化,测试库构架,关键字驱动/表格驱动测试,数据驱动测试和混合的测试自动化。我并不会评价哪一个框架更好或更差,而只是提供了一些关于他们的描述和演示,所适用的地方和如何使用IBM Rational工具集实现的一些技巧。
     
    测试脚本模块化框架(The Test scrīpt Modularity Framework
    测试脚本模块化框架需要创建能够代表测试下应用程序(application-under-test)的模块,零件(Section)和函数的小的,独立的脚本。然后用一种分级的方式将这些小脚本组成更大的测试,实现一个特定的测试用例。
    在我将提及的所有的框架中,这种框架应该是最容易精通且掌握的。就在一个部件前面构建一个抽象层以掩藏应用程序其他的部件方面,它是一个很著名的编程策略。它把应用程序从在部件的修改中隔离开来并规定了在应用程序设计中的模块性。为了提高自动化测试套件(test suite)的可维护性和可测量性,测试脚本模块化框架应用了抽象或封装的原则。
    为了演示这种框架的应用,我以自动化Windows计算器程序中的测试其基本功能(加,减,乘和除)的一个简单测试用例(如图)为例。
    脚本层次结构的最下层是独立的加减乘除的脚本。下面的第一个脚本是加法,第二个是减法。
     
     
    然后在层次结构中下一级的两个脚本用来代表视图菜单中的标准视图和科学视图。就像下面的关于标准视图的脚本中表现的一样,这些脚本调用了我们在之前创建的脚本。
     
    最后,在层次结构中最顶层的脚本应该是用来测试应用程序不同视图的测试用例。
     
     
    从这个简单的例子中你可以了解到这种框架是如何产生高度的模块化并且增加测试套件的全面的可维护性。如果以后计算器上的某一个控制键被移动了,你所需要改变的只是底层调用这个控制键的脚本,而不是测试这个控制键的所有测试用例。
     
    测试库构架框架(The Test Library Architecture Framework
    测试库构架框架和测试脚本模块化框架非常相似,有着同样的优势,但是它把测试下的应用程序分成过程和函数,而不是脚本。这种框架要求创建代表测试下应用程序模块,零件和函数的库文件(SQABasic libraries, APIs, DLLs等等)。然后这些库文件被测试用例脚本直接调用。
    为了演示这种框架的应用,我将自动化同上的测试用例,但使用了一个SQABasic的库文件。这个库文件包括执行操作的一个函数。以下是头文件(header file (.sbh))和库文件(library source file (.sbl))。
     
    使用这个库文件,产生以下测试用例脚本。
     
    从这个例子中,你能够看到这种框架也产生了高度的模块化,同样增加了测试套件的全面可维护性。就像在测试脚本模块化一样里,如果计算器中的一个控制键移动了,你所要做的只是更改库文件,这样同时也更新了所有调用控制键的脚本。
     
    关键字驱动或表驱动测试框架(The Keyword-Driven or Table-Driven Testing Framework
    关键字驱动和表格驱动测试是一种独立于应用程序的自动化框架,它们是可以互相替换的术语。这种框架要求开发于用来运行的自动化工具,驱动测试下应用程序和数据的测试脚本代码相独立的数据表和关键字。关键字驱动测试看上去非常象手工测试。在关键字测试里,应用程序的功能特性被写在表格和每个测试的详细指引里了。
    如果要映射出手工测试Windows计算器功能过程中用鼠标执行的操作,我们可以创建如下的表格。” Window”一列包含了我们执行鼠标操作的应用程序窗口的名字(在这个例子中,他们都发生在计算器窗口里)。” Control”一列指出了鼠标点击的控制键的类型。” Action” 一列列出了鼠标的操作(或是测试人员的)。”Arguments”列指出了特定的控制键(1, 2, 3, 5, +, -等)

    Window
    Control
    Action
    Arguments
    Calculator
    Menu
    View, Standard
    Calculator
    Pushbutton
    Click
    1
    Calculator
    Pushbutton
    Click
    +
    Calculator
    Pushbutton
    Click
    3
    Calculator
    Pushbutton
    Click
    =
    Calculator
    Verify Result
    4
    Calculator
    Clear
    Calculator
    Pushbutton
    Click
    6
    Calculator
    Pushbutton
    Click
    -
    Calculator
    Pushbutton
    Click
    3
    Calculator
    Pushbutton
    Click
    =
    Calculator
    Verify Result
    3

     这个表格代表了一个完整的测试,为了表示一系列测试可以根据需要增加。一旦你创建了数据表,你就可以简单地编写用来读取每一个步骤的程序或脚本集,基于Action字段中的关键字执行步骤,完成错误检查,然后记录任何相关的信息。这种程序或脚本集看上去象下面的伪代码:
     
    Main scrīpt / Program
    Connect to data tables.
    Read in row and parse out values.
    Pass values to appropriate functions.
    Close connection to data tables.
    Menu Module
    Set focus to window.
    Select the menu pad option.
    Return.
    Pushbutton Module
    Set focus to window.
    Push the button based on argument.
    Return.
    Verify Result Module
    Set focus to window.
    Get contents from label.
    Compare contents with argument value.
    Log results.
    Return.

    从这个例子里你可以看到为了生成许多的测试用例,这种框架只要求非常少的代码。用数据表生成不同的测试用例却可以重用相同的代码。IBM Rational工具集可以通过使用交互式的文件读取,查询或数据池延伸开来,或者你可以连同IBM Rational一起使用其他的工具(免费,其他的开发工具等)来构建这种类型的框架。
     
    数据驱动测试框架(The Data-Driven Testing Framework
    数据驱动测试是测试从数据文件(数据池,ODBC源,cvs文件,Excel文件,DAO对象等)中读取输入和输出数值并载入到捕获的或手工编码的脚本中变量里的一种框架。在这种框架里,输入数值和输出验证数值都使用变量。在测试脚本中编写贯穿程序的导航,数据文件的读取,记录测试状态和信息的日志的代码。
    测试用例包含在数据文件里而不是在脚本里的方面上,这种框架和表格驱动测试有些相似;脚本只是一种“驱动器”(driver)或传送数据的机制。尽管导航的数据不包含在表结构中,但和表格驱动测试还是不同的。在数据驱动测试里,只有测试数据包含在数据文件中。
    如果使用SQABasic语言和IBM Rational的数据池功能,IBM Rational工具集里有自带的数据驱动功能。为了演示这种框架的使用,我们将测试一个简单应用程序中的订单表格。
     
     
    如果我们录制这个窗口中的数据输入,得到以下脚本:
     
     
    我们可以使用数据池来设置测试有效和无效信用卡号和过期日期的测试用例。例如,下图中是用于测试数据字段的测试用例中的数据池,
     
     
    为了接收这些数据,我们修改脚本如下:
     
     
    为了使用数据池,我增加了SQABasic命令,还增加了“While”循环来处理在数据池中每一行数据。我必须说明一下在“If…Then”语句中的Ucase(SQABasic命令)函数。Ucase用于将参数(在这个例子里是指数据池返回的数值)全部转换成大写。这种方法不是大小写敏感的,所以代码更强壮。
    这个框架趋向于减少你为了实现所有测试用例而需要的全部的脚本数量,并且在开发绕开错误的办法(Workaround)和维护方面提供了最好的灵活性。和表格驱动测试非常相似的是,表格驱动测试只需要非常少的代码就可以产生大量的测试用例。用IBM Rational工具集实现这种框架是非常容易,并且它也提供了大量的关于指引和例子的详细文档。
     
    混合的测试自动化框架(The Hybrid Test Automation Framework
    最常见的已实现的框架是上述技术的组合,抽取它们的优点,剔除其弱点。这种混合的测试自动化框架是发展时间较长且应用项目最多的框架。下图可以让你对如何用IBM Rational工具集组合不同的框架有初步的认识。
     
    总结
    我描述了自动化测试小组可以考虑使用的5种测试自动化框架,而不是依赖某一种捕获工具。你可以使用一种或它们之间的组合。你可以通过嵌套测试脚本实现模块化并使用SQABasic库文件来实现功能和过程。不管你选择哪一种数据驱动技术,你都可以使用数据池,或者你还可以扩展Robot来处理其他数据存贮类型。应用最好的框架的窍门和解决他们的唯一方法是投入进去并开始使用它们。
  • Software Test Automation

    2007-11-06

    Session 1: Tools That Can Help

     Tools throughout the lifecycle: Where in the software development life cycle test activities take place and which are tool supportable.

     Tool support for testing: The different types of tool support for testing activities throughout the software development lifecycle.

     Benefits and pitfalls: The benefits and pitfalls that can be expected with the different types of test tool.

    Session 2: How Much Help Can Tools Provide?

     What help is required?: The reasons for introducing a test tool and whether this is the best solution to the problem.
     
     Are tools the best solution?: Two different approaches to comparing different solutions against a set of problems.

     Quantifying the return on investment: A simple approach to estimating the costs and benefits of testing with and without tool support.

     Example business cases: A few simple business cases for different tool types.

     Assessing readiness: How to assess the best time to Introduce change

    Session 3: Introducing a Test Tool

     Choosing the right tool: The need for a project to select a test tool and the steps involved.

     Role of a pilot project: The test tool implementation process and the importance of a pilot project.

     Developing best practices: A few objectives for the pilot project and the areas where early adoption of best practices is key to long term success.

     Lessons to learn: A few case histories where things went wrong and the lessons that can be learnt from them.

    Session 4: Automating the Test Process

     The test process: A detailed descrīption of the steps taken when creating and performing tests and their suitability for automation.

     Example application: A brief descrīption of a simple application with an explanation of one simple test that could be performed on it.

     Automating test execution: The problems incurred by using record / playback facilities alone.
     Automating test verification: Some of the many and varied choices that can be made.
     Automated but not Automatic: The problems involved in making the same automated test work under different situations and an introduction to possible solutions.

    Session 5: Case History

     Background: The reasons behind one organisation's decision to automate testing and the solutions they implemented.

     Results: The effort put into automation and the savings achieved.
     Lessons: Things learnt in this case history that need to be addressed by most other test automation projects.

    Session 6: scrīpting Techniques

     Example application: A brief descrīption of a simple application with an explanation of one simple test that could be performed on it.

     Introduction to scrīpting: A few facts about scrīpting that help explain its importance in test execution automation.
     
     scrīpting techniques: Five approaches to scrīpting (linear, structured, shared, data-driven and keyword-driven). The pros and cons of each technique using examples to illustrate the points made.

     scrīpt pre-processing: An explanation of scrīpt pre-processing and the benefits that can be achieved.

    Session 7: Automated Comparison

     Automated test verification: Some simple guidelines that can help you avoid making costly mistakes.

     Test sensitivity: The importance of achieving the right degree of verification and how it should be varied across different test cases.

     Implementing post-execution comparison: Alternative approaches to automating post-execution comparison.

     Simple versus complex comparisons: The benefits and pitfalls of using simple and complex comparisons and a few approaches to achieving them.

     Post execution comparisons: A practical approach to implementing comparisons

    Session 8: Testware Architecture

     Introduction: How testware is organised and structured. Three key issues that have to be addressed in order to avoid serious problems. An approach to organising testware that addresses each of these three issues.

     Implementation ideas: Explains one possible implementation of testware architecture.

    Session 9: Pre- and Post-Processing

     Introduction: The activities that are collectively called pre- and post-processing and the importance of automating them. Examples of pre- and post-processing.

     Implementation: Two different approaches to implementing pre- and post-processing.

    Session 10: Other Issues

     Test selection: The order in which tests should be run and how to efficiently select them for execution.

     Order of running: Considerations to take account of when executing a number of automated test cases.

     Test status: The end result of a test should not be limited to a simple pass or fail.

     Monitoring progress: Metrics for reporting progress and how to obtain and present them.

    Session 11: Test Suite Maintenance

     Attributes of test maintenance: Common reasons for high maintenance costs and how to deal with them
    Strategy and tactics: The general approach to keeping on top of test suite maintenance costs

  • QTP关键技术(六) - 嵌套Action间的参数传递

    2007-11-06

    参数传递思路:
    将Action1的输入参数InAction1传递给Action2的输入参数InAction2,
    将Action2的输出参数OutAction2传递给Action1的输出参数OutAction1。
      
    1)创建两个Action,嵌套关系,在关键字视图,拖动Action2到Action1下面有缩进的地方
     
    2)右键Action1,选Action Properties,
    在Input Parameters中添加参数InAction1,
    在Output Parameters中添加参数OutAction1,点OK
     
    3)右键Action2,选Action Properties,
    在Input Parameters中添加参数InAction2,
    在Output Parameters中添加参数OutAction2,点OK
     
    4)在Action1和Action2间建立关联
    右键Action2,选Action Call Properties,弹出Action Call Properties窗口;
     
    选中InAction2的Value,弹出Value Configuration Options窗口;
    在Parameter中共有四项可供选择,选择Test/Action parameter,
    在Parent action parameters的parameter中选择Action1
    同理,OutAction2的Store In值为OutAction1
     
    以上的操作就是把输入值 通过Action1的输入参数,传递给Action2的输入参数进行使用,
    然后Action2运行后,将输出参数通过Action1的输出参数传递出去。
    这里只是对嵌套Action进行最基本的讲解,在实际使用当中还要灵活运用。
  • QTP关键技术(五) - 并列Action间的参数传递

    2007-11-06

    思路:将Action1的输出参数,传递给Action2作为输入参数。
     
    1)创建两个Action,关系是并列关系,不是嵌套的.
    2)右键Action1,选Action Properties,在Output Parameters中添加参数OutAction1,点OK
     
    3)右键Action2,选Action Properties,在Input Parameters中添加参数InAction2,点OK
     
    4)将Action1的输出OutAction1,传递给Action2的输入InAction2
     此文右键Action2,选Action Call Properties,弹出Action Call Properties窗口;
    选中InAction2的Value,弹出Value Configuration Options窗口;
    在Parameter中共有四项可供选择,选择Test/Action parameter,
    在Output from previous call(s)中的Action选择Action1,Parameter中选择OutAction1;
    表示Action2中的参数InAction2,是由Action1中的参数OutAction1传递而来。
    以上就完成了两个并列Action间参数的传递,Action2只能调用Action1的输出参数,而不能调用Action的输入参数。
  • QTP关键技术(四) - Test和Top-Level Action间参数传递

    2007-11-06

    以下讲述一个关于QTPTest参数和Top-Level Action参数的使用例子,
      有些人不知道这个参数做什么用的,尤其是Test的output不知道怎么取。
    其实它是外部对象传给它的(这个外部对象可以是Quality Center,也可以是vbs这样的驱动程序)。
    以下给大家讲解一个关于QuickTest的Flight的例子。
    首先,在QTP里录制一段脚本,代码如下:
    SystemUtil.CloseProcessByName "Flight4a.exe"
    SystemUtil.Run Environment.Value(
    "ProductDir"& "\samples\flightapp\flight4a.exe"
    Dialog(
    "Login").WinEdit("Agent Name:").Set Parameter("InAction1")
    Dialog(
    "Login").WinEdit("Password:").SetSecure "46f1f4259cf01348f5a4c630bcee96084f3d1619"
    Dialog(
    "Login").WinButton("OK").Click
    Window(
    "Flight Reservation").Close
    Parameter(
    "OutAction1"= true
      
       然后在QTP中进行参数设置,
    1)设置Action的参数
    鼠标选中Keyword View中的Action1,
    点右键---Action Property,
    在Parameters的Tab标签下,分别加入:
    输入参数 InAction1 ,类型String;
    输出参数 OutAction1,类型 Boolean。
     
    2)设置Test的参数
    在QTP的菜单File--->>Settings的Parameters的Tab标签下,分别加入:
    输入参数 InTest1 ,类型String;
    输出参数 OutTest1,类型 Boolean。
     
    3)将Test和Action间参数进行关联传递
    鼠标还是选中Keyword View中的Action1,点右键,
    这次点“Action Call Properties”,
    在Parameter Values里进行参数化传递设置,
    把InTest1的值传递给InAction1,
    把OutAction1的值传递给OutTest1。
     
    以上设置完毕后,点“保存”,保存到C:\下,存为Test1好了。
     
    最后,在你的硬盘上新建一个vbs文件,文件内容如下:
    Dim qtApp ,pDefColl,pDef ,rtParams,rtParam 
    Set qtApp = CreateObject("QuickTest.Application"
    qtApp.Launch 
    qtApp.Visible 
    = True 
    qtApp.Open 
    "C:\Test1" 
    Set pDefColl = qtApp.Test.ParameterDefinitions 
    cnt 
    = pDefColl.Count 
    Indx 
    = 1 
    While Indx <= cnt 
        
    Set pDef = pDefColl.Item(Indx) 
        Indx 
    = Indx + 1 
    Wend 
    Set rtParams = pDefColl.GetParameters() 
    Set rtParam = rtParams.Item("InParam1"
    rtParam.Value 
    = "songfun" 
    qtApp.Test.Run , 
    True, rtParams
    MsgBox rtParams.Item("OutParam1").Value
     
    做完这步之后,保存这个vbs文件,双击执行这个vbs文件,你会发现它自动启动了QTP,而且进行了自动测试,最后还取到了运行成功与否的布尔值。
    这就是关于Test、Top-Level Action参数使用的例子,它的参数的整个传递过程是:
    外部vbs文件 传参数给QuickTest的Test的输入参数InTest1,然后InTest1传参数到InAction1去驱动了Action1的测试,
    然后通过这个Action1得出了OutAction1的值,然后通过OutAction1传给OutTest1,最后再传回到vbs文件中。
    示例用MsgBox来打出重新传回到vbs文件中的字符串。
  • QTP关键技术(三) - 对同步点的理解

    2007-11-06

    1)QTP的脚本语言是VBscrīpt,脚本在执行的时候,执行语句之间的时间间隔是固定的,也就是说脚本在执行完当前的语句之后,等待固定的时间间隔后开始执行下一条语句
     
    2)问题:假设后一条语句的输入是前一条语句的输出,如果前一条语句还没有执行完,这时候将要导致错误的发生!
     
    3)措施:加入同步点、加入Wait语句
     
    4)同步点Synchronization Point
    QTP脚本在执行过程中如果遇到同步点,则会暂停脚本的执行,直到对象的属性获取到了预先设定的值,才开始执行下一条脚本。
    如果在规定的时间内没有获取到预先设定的值,则会抛出错误信息。
     
    例如:
    Window("Flight Reservation").ActiveX("Threed Panel Control").WaitProperty "text", "Insert Done...", 10000
    执行到上面这条语句时,QTP会暂停执行,直到显示”Insert Done…”,
    如果在规定的时间10,000ms后text的值没有等于”Insert Done…”,则会抛出错误信息
     
    5)如何获取Synchronization Point
           A.在Recording状态下,通过Insert è Synchronization Point实现
           B.非Recording状态下,在Expert View下,通过Insert è Step Generator è Category(Test Objects)è Object(The Object you’re Testingè Operation(WaitProperty)è PropertyName、PropertyValue、TimeOut分别填写"text", "Insert Done...", 10000
     
    6)Wait
           总的来说就是死等,比如说wait 10,当运行到这条语句时,等待10秒钟后,才开始再读下面的语句。所以说写脚本的时候一定要估计好时间,否则的话会浪费运行的时间,或者出现等待时间不足的现象。
  • QTP关键技术(二) - 对Check Point的较为深入理解

    2007-11-06

    1. 定义:
    将特定属性的当前数据与期望数据进行比较的检查点,用于判定被测试程序功能是否正确
    Check Point可以分两类:QTP内置验证点和自定义验证点
     
    2. QTP内置验证点实现原理及优缺点
           A.录制时,根据用户设置的验证内容,记录数据作为基线数据
           B.回放时,QTP捕获对象运行时的数据,与脚本中的基线数据进行比较
           C.如果基线数据和运行数据相同,结果为PASS,反之为Failed.
           D.优点是 操作简单方便
           E.缺点是 QTP默认的检查的属性有时不符合自己的要求,如希望得到检查的属性没有在里面, 而默认的属性不需要检查等。
     
    3. QTP内置验证点结果的应用
           A.录制的验证点在没有进行调整前,仅仅是给出了检查结果是通过还是错误的
           B.实际的测试过程中,可以根据验证点的结果进行不同的操作
           If Window("Flight Reservation").WinEdit("Name:").Check(CheckPoint("Name:")) = True then
                  msgbox "oh, success!"
    Else
                  msgbox "oh, failure!"
    End If
     
    4. 自定义验证点的应用及优缺点
           A.使用条件语句对实际值和期望值进行对比,然后用Reporter对象报告结果
           '检查Ticket Number
    If CStr(dbTicketNumber) = CStr(DataTable("oTicketNumber", dtLocalSheet)) Then
           Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
    Else
           Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
    End If
           B.优点是 非常灵活,前者实现的所有检查都可以用此方法来实现;
           C.缺点是 代码量大,对测试人员的要求高。
     
    5. 对Check Point的深入理解
     
    A.个人认为在比较简单的和有Active Screen的情况下可以使用QTP内置的Check Point,在比较复杂的情况下可以通过编程和使用Reporter来完成.
    B.在使用check方法时,必须先在Keyword View或者Active Screen中新建CheckPoint。否则无法对该对象进行check,系统报错说无法在对象仓库中找到此对象。如果插入检查点,系统会自动把相关的对象添加到对象库中。
    我认为检查点并不是一个实实在在的对象。因为你可以对同一个对象设置不同的检查点,可以把它的某个属性既设定成True,也可以设定为False。而对象库中的对象的属性值是必须依赖于对象的实际属性值的。如果随意更改有可能无法识别。还有就是可以针对同一个对象设定多个检查点。在测试窗口中可以看到这两个检查点的名称是区分开来的。所以我认为检查点并不是实际存在的对象,而是一些类似映射的东西。
    尽管检查点并不是对象库中的实在的对象,但是它必须对应到对象库中的某个实实在在的对象,好像它的一个映像一样,而且在实际的操作过程中,QTP还是把它作为一个对象来处理的。
    因为我们无法像其他对象一样把“检查点对象”添加到对象库中,而QTP又认为它是个对象,所以我们无法在专家视图中直接添加检查点脚本。但是我们可以采用编成描述的方式来实现检查点的功能。
    CheckPoint 是一个依赖于Object Repository(对象库)中的某个对象的“虚拟对象”。其具体含义是:如果它所依赖的QTP 对象库中的对象没有了,那么此CheckPoint 也就不存在了;这个“虚拟对象”的属性是从它所依赖的对象的属性中“抽取”出来的,它具有它所依赖的对象的一个或几个属性,但不能增加它所依赖的对象没有的任何属性。
    CheckPoint 是一个“虚拟对象”的重要原因是:每个Object都能在Object Repository找到它的Name、Class Properties,而CheckPoint 在Object Repository中就根本不存在。选择脚本中的某个对象后,在Object Property 的对话框里面有个Respository按钮,点击它后,你会看到此对象在Object Respository 的Name、Class 和 Properties。
    选择一个CheckPoint后,在CheckPoint Properties 的对话框里没有 Respository 按钮,在Object Respository中也找不到此CheckPoint的Name、Class 和 Properties(因为它在对象库中根本就不存在!)。
Open Toolbar