自动测试实战项目案例(曹炼).ppt
第十四章一个自动测试实战项目案例,主讲人:徐光侠,本章内容提要,测试项目案例介绍 自动测试计划 自动测试用例的设计 自动测试脚本开发 自动测试脚本的运行和调试 自动测试结果分析,14.1 测试项目案例介绍,本测试项目案例是软件学院前期制作的一个小型学习交流平台(如图10-1所示),它是基于J2EE开发代码的内容管理系统(CMS)上搭建的。该学习交流平台实现的主要功能是发布信息、交流论坛、下载文件等,使得学院内之间建立更活跃的互动关系。,和大多数的论坛管理系统一样,本系统的主要功能可以分为用户管理、技术文章管理、论坛管理和文件下载这几个主要模块和其他非功能模块。根据用户的实际需求,使用面向对象技术分析一下各主要功能模块的用例(Use Case)图。,项目案例-在线学习交流平台,1用户管理:用户管理模块主要实现用户的注册、登录、用户信息修改、用户短信的发送和接收、用户好友的添加和删除、管理员对用户信息和权限的维护。如图所示,这里有两种不同的角色,即一般用户(会员)和管理员(admin),管理员通过后台的用户管理模块对一般用户的权限、短信、好友进行管理。他们的操作过程如下:,(1)一般用户:注册登录用户信息维护。(2)管理员:后台登录用户信息维护用户权 限管理。,2会员中心管理:会员中心模块主要实现用户短信的发送和接收、用户好友的添加和删除。如图10-3所示,这里有两种不同的角色,即一般用户(会员)和管理员(admin),管理员通过后台的用户管理模块对一般用户的短信、好友进行管理。他们的操作过程如下:,(1)一般用户:登录用户短信收发(2)管理员:后台登录用户短信管理(3)一般用户:登录用户好友维护(4)管理员:后台登录用户好友管理,3技术文章管理:技术文章管理分为技术文章维护和技术文章查看两部分。如图10-4所示,管理员可以对发布信息进行维护,一般用户只能在前台查看信息。,4论坛管理:论坛提供几个版块的设置,如学习交流、社会生活等,能够实现发帖和回帖等功能。如图所示,版块的设置和管理是管理员独有的权限,发帖和回帖是一般用户的权限。,5文件下载:文件下载分为下载内容管理和下载文件两部分。如图10-6所示,管理员可以对下载内容进行维护,一般用户只能查看下载内容和下载文件。,6访客留言:分为访客留言管理和访客留言两部分。管理员可以对访客留言进行管理,一般用户和其他非登录用户只能查看留言或进行访客留言。7站内搜索:任何用户在系统的首页可以使用关键字对技术文章的标题进行站内搜索。8在线论坛搜索:一般用户在在线论坛的版块主题下,可以对发帖的标题进行关键字搜索。,14.2 自动测试计划,自动测试计划是整个项目计划的一部分,更是整个测试计划的重要组成部分。作为一个小型项目,自动测试计划可以作为测试计划的一部分来说明。,14.2.1 自动测试方案的选择,首先,结合“重要事情优先做”的原则,要先要握自动化产品的关键和基本功能。在选择自动测试用例的时候,一定要选择比较适合自动测试的用例,这对于整个项目都有很多好处,不仅能提供软件测试的能效比,还可以降低自动测试的引入风险和成本,让自动测试在软件测试中真正地、循序渐进地应用。,其次,在选择自动测试脚本编写方法时要结合“降低测试成本”的原则。在刚刚入门编写自动测试脚本时,往往会感到整体代码不规范,代码复用性很差。这样会增加项目成本,因此有必要采用结构化的编码方法。测试脚本的结构化对项目而言有很多好处,能使代码结果清晰、便于脚本维护、降低维护成本;增加复用程序,降低开发成本;能够实现代码的统一管理,降低管理成本。但是过于追求结构化,放弃很多QTP提供的“录制”功能,这本身又是一种对开发成本的无谓增加。怎样找到这个平衡点,是自动测试成本分析的工作目的。,本测试项目案例所选用的软件属于中小型应用软件,其特点为运行周期较短,版本更新较快,需求变更较频繁。针对此软件的自动测试创建遵循如下规则:,选择重要功能的测试用例作为高优先级。选择需求不经常变更的模块的测试用例作为高优先级。选择自动化可测试性高、符合团队技术特点、容易实现自动 化的测试用例作为高优先级。选择重复执行比率高的测试用例作为高优先级。鉴于读者都是初次接触自动测试,采用录制回放和结构化的测试脚本编写方法。对于用户界面的输入可引入数据驱动的脚本编写方法。,14.2.2 自动测试计划的内容,1测试目标 根据自动测试需求分析的结果对可以自动化的模块及其手工测试用例进行自动测试。本次自动测试过程需要3名自动测试人员在15天内完成自动测试脚本并运行,分析运行结果,并提交“项目自动测试报告”。,14.2.2 自动测试计划的内容,2项目概述 本测试项目案例是软件学院前期制作的一个小型学习交流平台,它是基于J2EE开发代码的内容管理系统(CMS)上搭建的。该学习交流平台实现的主要功能是发布信息、交流论坛、下载文件等,使得学院内之间建立更活跃的互动关系。,14.2.2 自动测试计划的内容,3测试对象(1)注册(2)修改个人信息(3)登录(4)在线论坛管理 版块的设置 发帖 回帖,14.2.2 自动测试计划的内容,4测试环境 测试环境分为软件环境和硬件环境。由于兼容性等问题,不同的软硬件环境会产生不同结果,而一些客观的原因决定不可能对所有的环境进行测试,因此需要分析现在用户主流软件环境,以满足大部分用户的需求。同时,当软件升级时也可考虑更多的兼容性。对于硬件环境没有特殊的要求,只要配置的性能足够高。软件测试的软硬件环境可以按照如表14-1和14-2所示进行归类和划分。,14.2.2 自动测试计划的内容,14.2.2 自动测试计划的内容,由于自动测试工具本身也存在兼容性等问题,因此需要选择适合于自动测试工具运行的客户端软件环境。QTP10.0对应Window 2003、FireFox等软件环境的兼容性比较差,为适应工具的运行,可以指定一类客户端测试环境。本项目的客户端软件配置如表14-3所示。,5项目通过标准,自动测试项目的通过标准如下:,自动测试用例和数据包达到100%需求覆盖。自动测试用例100%被执行。测试过程中缺陷率达到公司系统测试质量标准。经测试经理和资深自动测试工程师审核通过。,6项目挂起和恢复条件,自动测试项目的挂起条件如下:测试流程管理工具或测试工具等环境要素出现故障。基本功能出现致命问题,导致50%用例被堵塞,自动测试无法执行。用例版本质量太差,50%执行用例无法通过,自动测试执行无意义。出现其他突发事件,需要对其他产品优先测试。,自动测试项目的恢复条件如下:导致测试堵塞的问题被修复,并通过了回归测试。测试工具等环境因素被修复。用例版本质量得到较大改善。突发事件处理完成,可正常进行测试。,14.2.2 自动测试计划的内容,7资源分配物力资源为配有QTP10.0的Window XP计算机3台,人力资源的配置如表14-4所示。,14.2.2 自动测试计划的内容,8时间安排自动测试周期预计为15天,具体安排如表14-5所示。,14.2.2 自动测试计划的内容,9各阶段提交文档,自动测试计划。自动测试用例。自动测试工作周报。自动测试报告。,14.2.2 自动测试计划的内容,10风险管理启动自动化测试的假设如下:手工测试用例100%执行并通过。E测论坛至少上线运行3周并且被测模块没有发生致命缺陷。可能存在的风险如下:计算机软件/硬件故障。规避方案:准备备用机器(虚拟机)。测试人员没有实际参加过项目,可能对测试产生一定的影响。规避方案:增加评审的频率和力度。自动测试人员突发性事假/病假/离职导致项目无法继续开展。规避方案:从其他组抽取1名资深自动测试工程师或高级自动测试工程师,一直参与自动测试项目的所有会议并作为应急人员。,14.3 编写自动测试用例,14.3.1 自动测试用例的设计,在编写自动测试用例前需要对自动测试用例进行设计。我们采用分类设计是因为不管多么复杂的事情,只要按照某个原则对其进行分类,思路就会变得清晰,就会让复杂问题简单化。在分类时我们结合测试的对象、测试的内容和测试的方法进行综合分析。在上一节测试计划中我们按照功能模块的划分选择了测试的对象。从测试内容的角度上讲又可以分为用户界面(UI)、功能、性能、产品的安装与卸载。我们的测试内容只考虑UI和功能测试。而测试方法有很多,在基础中我们用了很大的篇幅进行了叙述,像等价类划分法、边界值法、因果图法和错误推测法等。,14.3.1 自动测试用例的设计,下面我们采用测试用例分类设计的方法,选取重点模块,即测试的对象分类;每个对象都要从测试的角度进行测试内容的分类;每个内容都要以熟悉的测试方法进行测试方法的分类。测试的内容包括如下:(1)注册(2)修改个人信息(3)登录(4)在线论坛管理 版块的设置 发帖 回帖,14.3.1 自动测试用例的设计,同时在设计测试用例的时候还要遵循以下的原则:(1)场景选择的方法:选择操作过程相同的一些测试需求,来组成用例场景,使用测试用例结构化指导测试脚本的结构化。(2)场景包含用例的复杂度:场景包含的用例不能太多,当一个场景包含的用例数大于15时,可以考虑对场景进行分拆。相互独立的测试用例,使测试用例之间在逻辑上没有线性关系,不至因一个用例的错误而导致连锁错误。基于拥有前置数据的测试用例,每一个用例需要有前置的数据,避免这些数据必须通过其他脚本的执行来生成,这样从数据上消除脚本的线性依赖。基于同一起始点的测试用例,需要让每个用例都从一个已知的条件出发。当程序第一次执行时,会从一个前置条件出发,生成一定的测试结果,这样已经对前置数据进行了修改,因此需要提供数据恢复方法,保证测试执行每一次出发点是相同的。不要设计相同的测试用例。每一个用例的设计不是随意选择的组合,需要根据一些测试用例的方法来开发完成,这些常用的技术包括等价类划分、边界值分析、决策逻辑表等,通过这些方法的组合来达到使用最少的测试用例来测试最大的测试覆盖面的目的。接下来,我们对被测试的对象模块进行举例。,14.3.1 自动测试用例的设计,1注册测试对象:注册。测试内容:UI测试。测试方法:等价类划分、边界值。一般用户注册的UI如图所示,从图14-1的主页上单击“注册”,就会显示用户的注册页面。,14.3.1 自动测试用例的设计,注册模块的场景一为注册页面的各个输入域。使用等价类划分和边界值法对“用户名”域进行设计,我们可以得到如表14-6所示的5个测试用例。,14.3.1 自动测试用例的设计,使用等价类划分和边界值法对其他3个必填项“密码”、“重复密码”、“电子邮件”进行设计,可以得到和表14-6类似的测试用例。对6个选填项用同样的设计也可以得到类似的测试用例。对于“验证码”,输入为空和输入不匹配都提示“验证码对比错误”提示框。对于重复密码是否和密码一致的一致性检查也要作为测试用例。至此,我们对注册页面场景一的测试用例设计完毕。场景二是提交注册信息,即在注册页面填入合法信息,单击“提交”,注册信息提交成功,页面显示注册的个人信息,检查显示的个人信息是否与刚才填入的信息一致。在设计测试用例时我们设计的是黑盒测试用例,不需要知道输入的注册信息是否成功地写入数据库,用户通过浏览器是否成功地读取数据库中的注册信息,只需要检查浏览器上显示的个人信息是否与输入的一致。,14.3.1 自动测试用例的设计,2登录测试对象:登录测试内容:功能测试。测试方法:错误推测、等价类划分。该系统有两大类用户,一个是超级用户admin,一个是一般用户。一般用户通过软件学院在线交流平台的页面登录,超级用户admin通过后台的网站内容管理系统进行登录。由于他们各自的权限不同,所以只能登录各自的系统。超级用户的登录页面如图所示。,14.3.1 自动测试用例的设计,3在线论坛管理发帖测试对象:发帖。测试内容:功能测试。测试方法:等价类划分。在超级用户设置好在线论坛版块后,一般用户登录在线学期交流平台,单击在线论坛,进入在线论坛主页面。,14.3.1 自动测试用例的设计,该论坛有4个主版块,在“学习交流”主版块下又设有2个分版块“Java学习”和“数据库”。单击“Java学习”进入“Java学习”分版块,如图所示。,14.3.1 自动测试用例的设计,单击“发帖子”进入发帖页面,如图所示。,14.3.1 自动测试用例的设计,使用等价类设计该测试用例,如表14-7所示。,14.4 使用QTP开发自动测试脚本,我们在选择自动测试方案时谈到本项目采用录制回放和结构化的测试脚本编写方法。测试用例的实现主要采用录制的方法,在录制之前需要做必要的准备,在录制后的基础上增强脚本时采用结构化的编写方法。,14.4.1 录制前的准备,由于我们的项目是个小型项目,产品周期较短,所以需要快速地创建有效脚本,并迅速投入使用。在录制脚本之前还需要进行如下前期准备:,(1)加载插件 QTP默认包含3种插件,分别是ActiveX、Visual Basic和Web。安装好QTP后,打开QTP应用程序,默认选择的插件是Web。当只有一些Web控件时,可以只选择该项,但是通常网站的控件比较丰富,如既有JavaScript弹出框,又会引用一些第三方的插件,可以选择所有插件。在菜单中选择,就会在弹出的窗口中看到已选择的插件,如图所示。,14.4.1 录制前的准备,(2)录制模式设置Web录制模式设置是在菜单中选择,在弹出的窗口中单击标签,选中单选按钮,如图所示。如果单选单选按钮,就会在开始录制时默认打开一个指定地址的网站。,14.4.1 录制前的准备,(3)浏览器设置如前面所述,脚本的设计是基于同一个出发点的,但是浏览器会集中用户第一次操作的信息,因此需要取消浏览器的自动完成设置。取消的步骤如下:启动IE浏览器。选择菜单中的,弹出窗口。单击标签,单击的,弹出窗口。取消勾选选项组中的复选框,如图所示。,14.4.2 录制回放,打开IE浏览器输入测试系统的网址,单击“注册”打开注册页面。在“用户名”、“密码”、“重复密码”、“电子邮件”等文本框和选择框中分别输入测试数据。这些操作使用手工执行会很繁琐,使用QTP就会变得很简单。首先需要使用录制回放功能录制用户注册的操作过程,步骤如下:(1)运行QTP。(2)启动IE浏览器,在地址栏中输入网址,在线交流平台首页打开。(3)单击QTP工具栏中的按钮,之后的操作都会被QTP记录下来生成相应的脚本,直到单击按钮。(4)开始手工注册用户的操作。单击,打开用户注册页面。在注册窗口中按照测试用例的设计数据,分别输入用户名、密码、重复密码、电子邮件。根据窗口中的验证码输入验证码,单击按钮。,14.4.2 录制回放,(5)单击QTP工具栏中的按钮,停止录制。此时会发现在QTP的专家视图中的代码如下。,Browser(注册新用户-会员帐号-软件学院 在线学习交流平台).Page(首页-软件学院 在线学习交流平台).Link(注册).Click Browser(注册新用户-会员帐号-软件学院 在线学习交流平台).Page(注册新用户-会员帐号-软件学院 在线学习交流平台).WebEdit(username).Set Mary Browser(注册新用户-会员帐号-软件学院 在线学习交流平台).Page(注册新用户-会员帐号-软件学院 在线学习交流平台).WebEdit(password).SetSecure 4d18a3c6226b749dd3b663b850aa Browser(注册新用户-会员帐号-软件学院 在线学习交流平台).Page(注册新用户-会员帐号-软件学院 在线学习交流平台).WebEdit(cpassword).SetSecure 4d18a3c99f92f4b63f1e6e05723b Browser(注册新用户-会员帐号-软件学院 在线学习交流平台).Page(注册新用户-会员帐号-软件学院 在线学习交流平台).WebEdit(email).Set Browser(注册新用户-会员帐号-软件学院 在线学习交流平台).Page(注册新用户-会员帐号-软件学院 在线学习交流平台).WebEdit(valcode).Set 1038 Browser(注册新用户-会员帐号-软件学院 在线学习交流平台).Page(注册新用户-会员帐号-软件学院 在线学习交流平台).WebButton(提交).Click,14.4.2 录制回放,(6)单击QTP工具栏中的按钮,QTP开始自动执行刚才的用户注册的操作。回放刚才录制的用户注册脚本后发现,单击按钮后,出现“验证码对比错误”的提示框。这是因为验证码每一次都是动态生成的,刚才录制的验证码和这次的不匹配。所有我们遇到了录制回放编程方法的局限性,需要使用自主编程来修改刚才录制的脚本。这里我们首先要去了解为什么会有图片验证码。其实验证码的本质作用就是防止有人利用工具(灌水机、注册机,当然也不小心包括了我们的自动化测试工具)恶意猜解登录或者不停的注册和灌水的。因此如果我们完全依赖通过GUI识别来获取内容是不切实际的。解决办法有两个:程序员提供一个万能验证码,测试可以绕过这一关。结合QTP的新特性给,利用它的OCR机制抓取文本内容来解决图片验证码。这里我们采用第一个方法,让程序员提供一个万能验证码。这样在回放刚才录制的脚本时系统会提示“当前需要注册的用户名已存在”,这是因为先前录制过程中已经注册过该用户名了。,14.4.3 增强脚本的易读性,前面的实例中已经录制了注册的操作过程,但是再次回放的时候已经不能继续注册了,因为数据库中已经有了一条同样的记录,如果不做进一步的处理,就会影响测试用例设计中的原则。每次脚本的起点都是相同的。另外还可以看到,脚本中的自动命名非常混乱,对于输入的密码,用户并不能直接看到实际密码情况,看到的只是假密码。也正由于自动录制中出现的一些问题,很多自动测试脚本开发人员更愿意自己编写脚本,而不采用录制方式。但对于一些时间紧且编程能力偏弱的测试人员来说,录制也是一种非常好的办法,只要在录制的基础上增强脚本的易读性和处理能力即可。,14.4.3 增强脚本的易读性,(1)利用模板 在上面的脚本中看不到脚本的作用、作者信息、日期等一些脚本自身属性的信息,这些信息可以根据公司自身的特点进行模板定制,格式如下:,*脚本名称作用:前提:影响的功能点:作者:编写日期:修改者修改日期:修改原因:*,模板定制的方法如下:把上述模板信息复制到任意一个文件编辑器中。保存文件名为“ActionTemplate.mst”,注意这里的文件名只能为此名称。把文件复制到目录QuickTest Installation Folderdat下,这样每次新建Action时都会生成这样的模板。,14.4.3 增强脚本的易读性,(2)添加注释 单行注释:用来表示关键语句的说明。区域注释:可以表达一段脚本的作用,可以用起始注释和结束注释来表示。良好的编码风格。常量以变量的方式实现,字母全部大写,以便和其他变量区分,常量中的多个单词可以用下划线_”来区分,如下列形式。MY_FUNTION_NAME由于VBScript中的变量可以不定义变量类型,可以使用变量前缀来表示变量类型,后面的每个单词以大写字母开始,如下列形式。strProject=“自动测试项目实例”numInteration=3;还应该统一控件类型书写格式,对QTP来说,下面两种形式是相同的。,Browser(注册新用户-会员帐号-软件学院 在线学习交流平台).Page(注册新用户-会员帐号-软件学院 在线学习交流平台).WebButton(提交).Click browser(注册新用户-会员帐号-软件学院 在线学习交流平台).Page(注册新用户-会员帐号-软件学院 在线学习交流平台).WebButton(提交).Click这时需要使用统一的命名方式,可以统一为如下形式。Browser(注册新用户-会员帐号-软件学院 在线学习交流平台).Page(注册新用户-会员帐号-软件学院 在线学习交流平台).WebButton(提交).Click,14.4.3 增强脚本的易读性,(3)对象库(Object Repository)的命名规范 前面介绍注册脚本的实例可知,实际上GUI的自动测试脚本都是对页面对象的操作。只有识别出来页面对象,才能正确地实现自动测试脚本成功运行,在QTP中就产生了对象库的概念。Browser(注册新用户-会员帐号-软件学院 在线学习交流平台).Page(注册新用户-会员帐号-软件学院 在线学习交流平台).WebEdit(username).Set Mary在上述赋值语句中,Browser(注册新用户-会员帐号-软件学院 在线学习交流平台).Page(注册新用户-会员帐号-软件学院在线学习交流平台).WebEdit(username)是操作对象;set是QTP已经封装好的操作方法;Mary是操作数据。整句连贯起来的读法即为“在xxx对象上设置值yyy”。,14.4.3 增强脚本的易读性,下面简单介绍对对象识别的原理及操作过程。(1)通过对象库中的对象来识别页面控件。QTP中两个Object的实例图如图14-14所示。一个是前面提到的QTP对象,称之为Test Object,保存在对象库中。另一个是被测体的实际对象,称之为Runtime Object。在注册页面中实时显示的就是Runtime Object。,14.4.3 增强脚本的易读性,(2)QTP脚本中的对象操作过程如下。根据脚本中对象名称找到对象库中的对象,即Test Object中的对象。根据找到的对象属性查找Runtime Object中的对象。如果匹配,那么就对该对象进行操作,如果没有则不提示出错。QTP正是通过对象库的维护来达到对象识别的目的,因此对象库是QTP脚本的核心。对象库设计的好坏会影响到自动测试的效率,甚至会影响到QTP自动测试的成败。在描述性编程语言中,表面上脱离了对象库的概念,但是实际上对象识别的原理还是相同的。,14.4.3 增强脚本的易读性,(3)对象库的管理规范 当脚本录制时,QTP会自动生成对象库,记录所有录制过程中的操作对象,如图14-15中的Test Objcets所示。仔细观察此图可知,此对象库可以分为三层,分别为Browser、Page、Control(当然这里并不是一个绝对值,当前应用程序是三层,如果页面中存在Frame框时可能会出现四层或更多。)对象的命名规则如下:对象名称宜简不宜繁。对象的名称不宜过长,过长的对象名称本身就是一种资源的浪费。例如,Browser(注册新用户-会员帐号-软件学院 在线学习交流平台)这个对象名称长度、写作方式、易读性都非常缺乏。最好达到见字知意的效果,注意事项如下:避免一些特殊字符的出现(如”!$%避免文不对题;尽量与被测体的名称相同。同样命名原则,最好统一为中文或英文。,14.4.3 增强脚本的易读性,根据上面的原则重新定义对象库,如图所示。在对象库修改这些对象名称,测试脚本中的对象名称会与对象库名称自动同步。接下来我们在简单介绍一下对象库的开发。在一个脚本中可以分为本地对象库(Local Object Repository)和共享对象库的概念。在录制脚本的过程中,会自动生成对象库,这些自动生成的对象文件保存在Local Object Repository中,称之为本地对象。这些对象的作用范围为当前的Test以及当前的Action,如果其他Test或者Action也需要有这些对象,那么就有以下两种方法。(1)按照此前介绍的操作方法再操作一遍,如此就又生成一个同样的对象库。(2)把这个本地对象导出为共享对象,这样其他任何Test或者Action只有引用这个对象库就可以使用其中的对象了。很明显,第二种方法效率更高,更易维护,但被测试程序的某项对象发生改变时,只需要维护一个对象库就可以使所有引用的脚本都能正常使用。,14.4.3 增强脚本的易读性,本地对象库转换为共享对象库的方法如下:(1)选择QTP的菜单,进入对象库窗口。如图所示。,14.4.3 增强脚本的易读性,(2)在菜单栏中选择 命令,将对象保存为shareObject.trs文件,通过对象库的引用来使用这些对象。(3)对象库的引用:当设置完对象库后,可以通过引用对象库在各个Test或Action中使用,方法如下:a)选择QTP的菜单,进入对象库引用窗口,如图所示。,14.4.3 增强脚本的易读性,b)单击“+”按钮,选择共享对象库。c)在选择对象库之后,再在选择去夜总会选择适用的Action,然后单击“”按钮,这样区域中便显示了适用的Action,如图所示。,14.4.3 增强脚本的易读性,设置完成之后,单击按钮,可以在对象库中看到引用的对象已经存在,也可以在下拉列表框中选择各种类型的对象。QTP9.2以上版本出来支持对象的增加、删除、修改之外,有增加了对象库的合并以及对象库之间的互相复制功能,大大方便了对象库的维护,这些功能都可以在Object Repository Manager中实现。,14.4.4 输入数据的自动化,在前面的测试用例设计中,提到了使用结构化的测试用例。在用户注册的测试用例设计中已经实现了测试步骤和测试数据的分离,现在需要解决的是如何使测试用例的数据输入自动化,使这些结构化的用例能够快速地执行起来。通过QTP中的数据驱动方式可以很好地解决这样的问题。,14.4.4 输入数据的自动化,我们仍然以用户注册为例,首先把用例数据导入到DataTable的Action表格中,格式如表14-8所示。之前我们要求程序员提供万能验证码,该码为“0123”。,14.4.4 输入数据的自动化,针对这些数据,在测试脚本中进行参数化设置,设置方法如下。1在脚本编辑页面中单击标签切换到关键字视图,如图14-20所示。,14.4.4 输入数据的自动化,2单击栏,例如单击用户名中的“Kate”栏,弹出参数设置窗口,参数设置如图14-21所示,单击按钮完成设置。,14.4.4 输入数据的自动化,3与步骤2的操作类似,对其他参数进行设置,设置的脚步如下:,*填写用户注册信息*startBrowser(注册).Page(注册).WebEdit(用户名).Set DataTable(用户名,dtLocalSheet)Browser(注册).Page(注册).WebEdit(密码).Set DataTable(密码,dtLocalSheet)Browser(注册).Page(注册).WebEdit(重复密码).Set DataTable(重复密码,dtLocalSheet)Browser(注册).Page(注册).WebEdit(电子邮件).Set DataTable(电子邮件,dtLocalSheet)Browser(注册).Page(注册).WebEdit(验证码).Set DataTable(验证码,dtLocalSheet)Browser(注册).Page(注册).WebButton(提交).Click*end,14.4.4 输入数据的自动化,4设定Action的循环,步骤如下。(1)单击标签,切换到关键字视图。(2)选择,右击,在弹出的右键菜单中选择命令。(3)在弹出的窗口中单击标签。(4)点选单选按钮,如图14-22所示。,14.4.4 输入数据的自动化,点选单选按钮表示从第一行开始一直执行到最后一行。至此数据驱动的设置已经全部完成,数据输入的自动化得以实现。如果自动测试脚本的开发人员有一定的编程能力,还可以使用QTP提供的DataTable对象作为数据驱动的接口。将输入数据存放在Excel表格中,使用Datatable的ImportSheet函数将Excel表格中的数据导入到QTP的datatable中。ImportSheet函数的语法如下。Datatable.ImportSheet“参数1”,参数2,参数3 其中,参数1为要导入的Excel文件的绝对路径;参数2用于确定要导入的Excel文件的第几个Sheet;参数3用于确定要导入到本地datatable的第几个表中。可以通过Datable.ImportSheet(FileName,SheetSource,SheetDest)来将Excel中的数据导入,从而进行数据驱动调用。,14.4.5 测试结果比较的自动化,由于QTP提供了非常丰富的检查点功能,我们使用它可以实现测试结果比较的自动化。我们仍然以注册为例,在注册功能中提供以下3个检查点。(1)提交注册时,提示信息进行校验。(2)提交注册,确定后,返回页面进行校验。这2个检查点,第一个是窗口的校验,第二个是页面的校验,这两个都可以采用标准检查点方法。,14.4.5 测试结果比较的自动化,如果要实现窗口的校验,在Expert View面板中单击下面一行脚本。Browser(注册).Page(注册).WebButton(提交).Click 这里查看Active Screen区域,出现用户名不能为空的提示框,右击“用户名不能为空”文字,在弹出的右键菜单中选择命令,弹出校验对象选择框。单击按钮,单词检查点属性窗口,对检查点Text进行参数化设置,以便适合不同类型的校验。单击按钮,生成如下校验代码:Browser(注册).Dialog(注册).Static(用户名不能为空).Check CheckPoint(用户名不能为空)这里的校验值不一定校验成功,因此可以修改Static对象和检查点的名称,以增强脚本的易读性,修改后的代码如下:Browser(“注册”).Dialog(“注册”).Static(“提交注册”).Check CheckPoint(“校验提交注册”)需要注意的是,修改名称需要在对象库中进行,而不能直接修改脚本中的名称。,14.4.5 测试结果比较的自动化,再次执行,此时脚本已经可以自动校验所有关于提交注册的检查点了。然而会发现,所有执行的脚本检查点都出错了,出错原因为时间运行文本后面存在空格,导致预期校验结果与实际结果不一致。因此我们另外还需要采取以下两个措施。(1)在校验值中教师正则表达式的符号,在每个校验值后面加上符号”.*”,表示后面可以匹配任意字符。(2)在参数化过程中设置正则表达式效果,如图14-23所示。正则表达式在检查点的操作和对象识别中有着很广泛的应用。,14.5 运行和调试自动测试脚本,当编写完自动测试脚本,我们就可以运行它了。和编写程序代码一样,在运行代码时也存在调试代码。我们的自动测试脚本其实就是VBScript的程序代码,调试自动测试脚本就是调试VBScript的程序代码。和调试其他程序代码一样,我们可以给程序设置断点,通过Debug Viewer查看想要观察的变量的值。在脚本的关键字视图中想要设置断点的Step的左边界点击一下,就设置了红色小圆点的断点。再点击一下就取消了该断点。从QTP的菜单中选择,就可以打开Debug Viewer Pane。在脚本的关键字视图中选择想要观察的变量“a”,然后选择菜单,就把变量“a”添加到了Debug Viewer Pane的Watch Tab。当运行该脚本时,测试会在断点处停留,这时通过Debug Viewer的Watch Tab就可以观察到变量“a”的值,从而检验脚本的逻辑是否正确。,14.6 分析测试结果,当测试脚本运行结束时,QTP会自动生成测试结果Test Result。在测试结果中有许多“Pass”或者“Fail”信息,我们需要对其分析以便明确是测试脚本本身存在的缺陷引起的“Fail”,还是因为测试对象产品版本的改变引起的脚本不适应,还是测试对象产品真正存在的缺陷。我们仍然以在这之前用户注册的测试用例的脚本为例来说明。当脚本运行结束时的测试结果如图所示。,从测试结果中我们可以看到脚本运行时出现了Run Error,测试结果的详细信息中说明在提取DataTable中的值时出现失败,一栏不存在。我们回到图14-20的关键字视图,打开重复密码的参数配置,发现其参数名设置为了“密码”,而不是“重复密码”。修改该参数名为“重复密码”之后,再次运行该脚本。脚本运行结束时的测试结果改变为图14-25所示,测试结果中不再有“Failed”的Step,而且我们还可以清楚地看到在DataTable中设置的6组测试数据运行的情况。分析测试结果需要经验的积累,我们在这里只是触及一二。在发现测试对象存在缺陷时需要及时提交缺陷报告,这和手工测试一样,只是需要在缺陷报告中注明运行的自动测试脚本的名称和版本号。,14.7 自动测试执行,经过前面的测试脚本的开发,已经得到了一个可执行测试脚本,接下来的问题是如何维护这些测试资源并有效地利用他们。在项目中,被测试程序的变动时正常的,关键是如何有效地控制这些变动。同样道理,在被测试程序不断变化的情况下,测试脚本比如也会有相应的修改。在基于数据驱动的测试脚本中,即使一个提升信息的修改,也将改变QTP测试脚本的内容,因此普遍存在非常频繁的版本变动。为例脚本自身的安全和脚本本身修改量的统计,需要对脚本有一个版本的控制策略。为了管理方便,可以和开发使用相同的版本控制工具,存放到统一的代码库中。对于测试人员来说,测试执行的过程有喜有忧,既有发现缺陷的喜悦,也会因周而复始的重复操作产生烦恼。自动测试脚本的价值就在于解决这些重复的劳动。如前所述,执行次数越多,自动测试产生的效益越大。,对于如何有效地执行测试脚本,如前所述,测试脚本时基于数据驱动的,在不同的时期可以使用不同的回归策略。1项目初期的测试目标是覆盖主要的测试流程,这是在数据驱动中选择主流程的测试数据,目的是把产品的各个流程测试一遍,已发现流程缺陷为目标。2项目中期的测试目标是覆盖所有测试用例中写到的测试脚本,这里主要关注所有设计中数据类型的选择上,以尽可能多的发现缺陷为目标。3项目后期的目标是保证前面的测试体还是正确的,并补充测试一些后期添加的一些问题,这些问题是自动测试用例的有效补充。,