QTP 自动化测试践


QTP 自动化测试实践 第 8 章 数据驱动测试 测试脚本的开发和维护是自动化测试的重要环节,适当地调整和增强测试脚本,能提高测试脚本的灵活性,增加测 试覆盖面,以及提高应对测试对象变更的能力。数据驱动方式的测试脚本开发是解决这类问题的重要手段。 本章介绍如何在自动化测试过程中使用数据驱动的测试脚本开发方式,对测试脚本进行参数化,包括如何使用 QTP 的 Data Table 参数化、Action 参数化、环境变量参数化等脚本参数化的方法。 8.1 数据驱动测试方法 数据驱动的测试方法要解决的核心问题是把数据从测试脚本中分离出来,从而实现测试脚本的参数化。 8.1.1 什么时候使用数据驱动测试方法 自动化测试对录制和编辑好的测试步骤进行回放,这种是线性的自动化测试方式,其缺点是明显的,就是其测试覆 盖面比较低。测试回放的只是录制时做出的界面操作,以及输入的测试数据,或者是脚本编辑时指定的界面操作和测试 数据。 如何让测试脚本执行时,不仅仅局限于测试录制或编辑时的测试数据呢?数据驱动的测试方式是解决这个问题的最 佳方案。数据驱动测试把测试脚本中的测试数据提取出来,存储到外部文件或数据库中,在测试过程中,从文件动态读 入测试数据。 注意:如果希望测试的覆盖面更广,或者让测试脚本能适应不同的变化情况,则需要进行测试脚本的参数化,采用 数据驱动的测试脚本开发方式。 8.1.2 数据驱动测试的一般步骤 通常,数据驱动测试按以下步骤进行: (1)参数化测试步骤的数据,绑定到数据表格中的某个字段。 (2)编辑数据表格,在表格中编辑多行测试数据(取决于测试用例以及测试覆盖率的需要)。 (3)设置迭代次数,选择数据行,运行测试脚本每次迭代从中选择一行数据。 QTP 提供了一些功能特性,让这些步骤的实现过程得以简化。例如,使用“Data Table”视图来编辑和存储参数,如 图 8.1 所示。 图 8.1 Data Table 视图 另外,还提供“Data Driver 向导”,用于协助测试员快速查找和定位需要进行参数化的对象,并使用向导进行一步一 步的参数化过程。 8.2 参数化测试 在 QTP 中,可以通过把测试脚本中固定的值替换成参数的方式来扩展测试脚本,这个过程也叫参数化测试,能有 效地提高测试的灵活性。 8.2.1 通过参数化测试来提高测试的灵活性 可以通过参数化的方式,从外部数据源或数据产生器读取测试数据,从而扩大测试的覆盖面,提高测试的灵活性。 在 QTP 中,可以使用多种方式来对测试脚本进行参数化,数据表参数化(Data Table Parameters)是其中一种重要的方 式,还有环境变量参数化(Environment Variable Parameters)、随机数参数化(Random Number Parameters)等。 下面以 QTP 自带的“Flight”程序为例,介绍如何对测试脚本进行参数化。假设在名为“Flight Reservation”的订票界 面中,输入航班信息后,插入订票记录,然后,希望重新打开该记录,检查航班信息中的终点的设置是否正确,录制的 测试脚本如图 8.2 所示。 图 8.2 录制的测试脚本 提示:对于这样一个测试脚本,仅能检查特定的航班订票记录的正确性,如果希望测试脚本对多个航班订票记录的 正确性都能检查,则需要进行必要的参数化。 8.2.2 参数化测试步骤 首先,把测试步骤中的输入数据进行参数化,例如航班日期、航班始点和终点等信息。下面,以“输入终点”的测试 步骤的参数化过程为例,介绍如何在关键字视图中对测试脚本进行参数化。 (1)选择“Fly To :”所在的测试步骤行,单击“Value”列所在的单元格,如图 8.3 所示。 图 8.3 设置参数值 (2)单击单元格旁边的“<#>”按钮,或按快捷键“CTRL+F11”,则出现如图 8.4 所示的界面。 图 8.4 选择参数从 Data Table 读取 提示:在这个界面中,选择“Parameter”,在旁边的下拉框中选择“Data Table”,在“Name”中输入参数名,也可接受 默认名,在“Location in Data Table”中可以选择“Global sheet”,也可以选择“Current action sheet(local)”,它们的区别 是参数存储的位置不同。 (3)单击“OK”按钮,在关键字视图中可看到,“Value”值已经被参数化,替换成了如图 8.5 所示。 图 8.5 参数化后的值 (4)这时,选择菜单“View | Data Table”,则可看到如图 8.6 所示的界面。 图 8.6 Data Table 中的参数数据 可看到,在“p_Item”列中有一个默认数据“Frankfurt”,这是参数化之前录制的脚本中的常量,可以在“p_Item”列中继 续添加更多的测试数据。 提示:可以双击修改“p_Item”列名,让其可读性更强,例如,改成“FlyTo”。 (5)把其他几个数据也参数化后,如图 8.7 所示。 图 8.7 参数化后的测试步骤 QTP 运行时,就会从如图 8.8 所示的数据表格中提取数据来对测试过程中的各项输入进行参数化。 图 8.8 Data Table 存储的参数值 8.2.3 使用随机数来进行参数化 对于选择航班这个测试步骤的参数化来说会有所不同,因为航班会跟随所选择的起点和终点而变化,因此,需要做 特殊的处理。如下代码所示: ' 取得航班列表的行数 ItemCount = Window("Flight Reservation").Dialog("Flights Table").WinList("From").GetItemsCount ' 随机选取其中一项 SelectItem = RandomNumber(0, ItemCount) ' 选择航班 Window("Flight Reservation").Dialog("Flights Table").WinList("From").Select SelectItem 先通过访问 GetItemsCount 属性,获取航班列表的行数,然后使用 RandomNumber 随机选取其中一项,最后,再 通过 Select 方法选择航班。参数化后的测试步骤如图 8.9 所示。 图 8.9 参数化后的测试步骤 提示:使用随机数也是测试脚本参数化的一种重要方法,在 QTP 的测试代码中,可用 RandomNumber 来实现, 在关键字视图编辑的界面如图 8.10 所示,其效果与在脚本中直接编辑是一样的。 图 8.10 选择参数化方式为“Random Number” 8.2.4 参数化检查点 测试脚本的最后一个测试步骤是检查订票记录中的航班终点是否正确,同样需要进行适当的参数化,方法如下: (1)单击检查点所在测试步骤的“Value”列中的单元格,如图 8.11 所示。 图 8.11 设置检查点参数 (2)单击旁边的按钮,则出现如图 8.12 所示的界面。 图 8.12 检查点属性编辑界面 (3)在“Configure value”中选择“Parameter”后,可单击“OK”按钮接收默认的设置,也可单击旁边的编辑按钮,在如图 8.13 所示的界面中,进行参数化的详细设置。 图 8.13 参数化的详细设置 在“Parameter types”中,选择“Data Table”;可在“Name”修改参数名,或接受默认的命名,产生如图 8.14 所示的数 据列,也可以选择“FlyTo”,因为检查点所指的航班终点得到的预期值应该与测试步骤中选择航班终点时的输入数据一致, 否则认为错误。 图 8.14 Data Table 中存储的参数值 8.2.5 设置数据表格迭代方式 把测试步骤和检查点的参数化工作都完成后,可得到如图 8.15 所示的测试步骤。 图 8.15 参数化后的测试步骤 切换到专家视图,可看到如图 8.16 所示的测试脚本。 图 8.16 参数化后的测试脚本 运行这个测试脚本之前,还要做一些必要的设置,选择菜单“File | Settings”,出现如图 8.17 所示的测试设置界面,切 换到“Run”页,在“Data Table iterations”中,可设置数据表格的迭代方式。 图 8.17 设置运行迭代方式 提示:“Run one iteration only”是指仅运行一次迭代,也就是说,即使 Data Table 中有多条测试数据,也仅执行一 次;“Run on all rows”则是指按数据表格中的所有数据都运行一次;选择“Run from row…to row…”则可进一步设置运行 的测试数据范围。 选择“Run on all rows”,得到如图 8.18 所示的测试结果。 图 8.18 测试结果 8.3 Action 测试输入的参数化 对于重复使用的测试用例,可以转换成公共用例,适当参数化后,可被其他测试用例调用。在 QTP 中,可以把 Action 的输入适当参数化,转换成可重用的测试步骤。 8.3.1 编辑 Action 的属性 QTP 的“Flight”程序中的登录模块的测试步骤是在执行其他测试步骤之前都要经过的测试步骤,因此有“潜力”成为一 个可重用的 Action。对于如图 8.19 所示的测试步骤,可以进一步参数化后,成为可重用的测试步骤,被其他 Action 调用。 图 8.19 可重用的测试步骤 选择“Action1”所在的行,然后单击鼠标右键,选择菜单“Action Properties”,则出现如图 8.20 所示的界面。 图 8.20 Action 属性编辑窗口 在“Name”中输入新的 Action 名称,例如“Login_Action”,在“Description”中输入对 Action 的描述信息,如图 8.21 所示。 图 8.21 编辑 Action 属性 注意:把“Reusable action”勾选上,表示该 Action 为可重用的测试步骤,是可被其他 Action 调用的测试步骤。 8.3.2 添加 Action 的输入参数 切换到“Parameters”页,如图 8.22 所示。单击“+”按钮,添加调用 Action 需要输入的参数名和类型。 图 8.22 添加输入参数 提示:在这里,“Login_Action”需要两个参数,其中,“AgentName”表示代理机构登录名,“Password”表示登录密码。 添加完参数后,回到关键字视图,选择“输入代理机构名”所在的测试步骤,单击“Value”列的单元格旁边的“<#>”按钮,出现如图 8.23 所示的界面。 图 8.23 设置参数 在“Parameter”中,选择“Test/action parameter”,然后,选择刚才编辑好的参数“AgentName”,单击“OK”按钮。重复这个步骤, 为“输入登录密码”的测试步骤设置参数,得到如图 8.24 所示的测试步骤。 图 8.24 完成测试步骤 8.3.3 调用 Action 完成 Login_Action 的参数化后,就可以在其他 Action 中调用这个 Action,方法是在 Action 的测试步骤中,选择菜单“Insert | Call To Existing Action”插入现有的 Action,如图 8.25 所示。 图 8.25 选择 Action 在这个界面的“From test” 中选择“”,在 “Action”中选择“Login_Action”,单击“OK”按钮后,即可插入对“Login_Action” 测试步骤的引用,如图 8.26 所示。 图 8.26 插入对 Action 的引用 选中“Login_Action”所在的行,单击鼠标右键,选择菜单“Action Call Properties”,出现如图 8.27 所示的界面。 图 8.27 设置参数值 在“Parameter Value”页中,为每一个参数设置输入的参数值,也可以单击“Value”列旁边的“<#>”按钮,为输入绑定到 Data Table 中的数据。单击“确定”后,可在专家视图看到如图 8.28 所示的测试代码: 图 8.28 使用 RunAction 方法来调用 Action 该测试代码使用了 RunAction 方法来调用“Login_Action”,输入的第一个参数值和第二个参数值都为“MERCURY”。测试脚本的 运行结果如图 8.29 所示,可看到,“Login_Action”被成功地调用,测试结果中也列出了调用“Login_Action”所输入的参数值。 图 8.29 测试结果 8.4 使用环境变量的参数化 在 QTP 中,除了前面所讲的几种参数化测试的方式外,还可以使用环境变量来进行测试的参数化。下面介绍如何使用环境变量 来参数化如图 8.30 所示的测试步骤,将其中的“Agent Name”和“Password”的值从定义好的环境变量读入。 图 8.30 待参数化的测试步骤 8.4.1 定义和设置环境变量 在使用环境变量之前,需要定义好环境变量,方法如下: (1)选择菜单“File | Settings”,出现如图 8.31 所示的界面。 图 8.31 环境变量设置 (2)在这个界面中,切换到“Environment”页,在“Variable type”中选择“User-defined”,然后,单击旁边的“+”按钮,在如图 8.32 所示的界面中,定义环境变量名和输入的值。 图 8.32 添加环境变量 (3)重复这个步骤,定义“Password”的环境变量,得到如图 8.33 所示的结果。 图 8.33 成功添加自定义环境变量 8.4.2 在测试步骤中绑定环境变量值 定义好环境变量并设置好其值之后,就可以在测试步骤中使用该环境变量。方法如下: (1)在关键字视图中,定位到测试步骤的“Value”列,如图 8.34 所示。 图 8.34 定位到测试步骤的“Value”列 (2)单击旁边的“<#>”按钮,出现如图 8.35 所示的界面。 图 8.35 参数化选定的值 提示:在界面中,选择“Parameter”,并在下拉框中选择“Environment”,在“Name”中选择“AgentName”,在“Value”中输入对应的 值。 (3)重复这个步骤,设置“输入登录密码”的测试步骤所对应的环境变量,如图 8.36 所示。 图 8.36 设置“输入登录密码”的测试步骤所对应的环境变量 设置完后,可得到如图 8.37 所示的测试步骤。 图 8.37 参数化后的测试步骤 这样,QTP 在运行测试脚本时,就会读取测试步骤所绑定的环境变量值,来执行相应的数据输入动作。 8.4.3 导出环境变量到 XML 文件 选择菜单“File | Settings”,在如图所示的界面中,单击“Export”按钮,可把当前定义的环境变量导出到 XML 文件中,如图 8.38 所示。 图 8.38 导出环境变量 导出后的 XML 文件如图 8.39 所示。可看到,之间是一个个定义好的环境变量,包括变量名和变量值。 图 8.39 导出的 XML 文件 8.4.4 导入外部环境变量文件 对于导出的 XML 文件,可以再次导入,如图 8.40 所示。 图 8.40 导入环境变量 也可以在测试脚本中编写代码来加载,例如,下面的脚本在执行界面的测试步骤之前,先加载 D:\QTP\C8\ParameterizingTest3\Env 目录中的某个环境变量文件。 SystemUtil.Run "D:\Program Files\Mercury Interactive\QuickTest Professional\samples\flight\app\flight4a.exe" ' 启动 Flight 程序 Environment.LoadFromFile("D:\QTP\C8\ParameterizingTest3\Env\Login2.xml") '加载外部环境变量文件 Dialog("Login").Activate Dialog("Login").WinEdit("Agent Name:").Set Environment("AgentName") ' 输入代理机构名 Dialog("Login").WinEdit("Password:").Type Environment("Password") ' 输入登录密码 Dialog("Login").WinButton("OK").Click ' 确认登录 8.5 使用数据驱动器来参数化测试 为了简化测试脚本参数化的过程,QTP 还提供了名为“Data Driver”的功能,可自动检测脚本中可能需要进行参数化的变量。 8.5.1 数据驱动器的使用方法 “Data Driver”可以帮助测试人员快速找到需要参数化的测试对象、检查点的数据。例如,对于如图 8.41 所示的录制脚本,选择菜 单“Tools | Data Driver”,出现如图 8.42 所示的界面。 图 8.41 待参数化的测试步骤 图 8.42 数据驱动器 在这个界面中,列出了测试步骤中所有可能需要进行参数化的变量。 8.5.2 数据驱动向导 单击“Parameterize”按钮,出现如图 8.43 所示的数据驱动向导。 图 8.43 数据驱动向导 单击“下一步”按钮,则出现如图 8.44 所示的界面。 图 8.44 参数化选定的测试步骤 在这个界面中的左边窗口,定位到测试步骤所操作的界面控件,在右边显示参数化的名称和数据,单击“编辑”按钮,可在如图 8.45 所 示的界面中进一步设置参数。 图 8.45 参数化设置 单击“OK”按钮,回到向导界面,单击“下一步”按钮,则出现如图 8.46 所示的界面,表明测试步骤的参数设置完成。其他测试步骤也可 按类似的方式一步步地完成参数化。 图 8.46 完成参数化 第 3 章软件自动化测试工具 软件自动化测试工具是实现软件自动化测试必不可少的关键,因此,选择一个优秀的、适合自己的测试项目实际情况的测试工具 是实现成功自动化测试的第一步。本章介绍自动化测试工具的分类,以及如何选择一个合适的自动化测试工具,并且介绍自动化测试 工具的基本原理。 3.1 自动化测试工具类型 测试工具的种类很多,有用于管理测试的,有帮助实现测试自动化的,有开源的,有免费共享的。软件测试工具按照其用途,可 大致分成以下几大类: 测试管理工具 自动化功能测试工具 性能测试工具 单元测试工具。 白盒测试工具。 测试用例设计工具。 如果按测试工具的收费方式,又可分为以下几类。 商业测试工具。 开源测试工具。 免费测试工具。 3.1.1 商业测试工具 商业测试工具的特点是需要花钱购买,但是会相对成熟和稳定,并且有一定的售后服务和技术支持。但是,由于其价格昂贵,并 不是每一个企业都能负担得起。 商业测试工具主要集中在 GUI 功能测试和性能测试方面,目前流行的基于 GUI 的功能自动化测试工具有 Robot、QTP、 TestComplete 等。各种自动化测试工具实现的功能基本相同,但是在 IDE、脚本开发语言、支持的脚本开发方式、支持的控件等方面 则有很多不同之处。 3.1.2 开源测试工具 开源软件是指软件的源代码是公开发布的,通常是由自愿者开发和维护的软件。开源测试工具是测试工具的一个重要分支。越来 越多的软件企业开始使用开源测试工具。但是开源并不意味着完全的免费,开源测试工具同样需要考虑使用的成本,并且在某些方面 可能要比商业测试工具的成本还要高。 商业工具的价格在不断地提高。图 3.1 为 WinRunner 近几年的价格变化图。 图 3.1 WinRunner 近几年的价格变化 可以看到,价格在不断地增长。这对于那些中小型软件企业而言,无疑加大了测试的成本。开源测试工具相对于商业测试工具拥 有以下优势: 相对低的成本:大部分开源测试工具可免费使用,只要不做商业用途即可。 更大的选择余地:可以打破商业测试工具的垄断地位,给测试人员更多的选择空间。 可自己改造:源代码开放,意味着可对其进行修改、补充和完善,可对其进行个性化改造。 虽然开源测试工具拥有一定的优势,但是,同时也存在很多不足之处,包括以下几方面。 安装和部署相对困难:大部分开源测试工具的安装配置过程比较烦琐,需要测试人员付出一定的努力。 易用性:开源测试工具在易用性、用户体验方面做得不够完善。 稳定性:部分开源测试工具的稳定性不够强。 学习和获取技术支持的难度:大部分开源测试工具不提供培训指导和技术支持服务,联机帮助和用户手册不够完善,增加了测试人员 的学习难度。 3.1.3 自主开发测试工具 目前,很多软件测试组织其实已经具备了自己动手开发测试工具的条件: 市场对于测试工具的接受程度在不断提高,人们对测试工具的认识不断加强和深入,对测试工具原理的理解不断提高。从脚本化到数 据驱动,再到关键字驱动等,很多新的测试工具理念被引入并被广泛接受。 由于技术的成熟,测试工具变得容易构建。软件系统现在变得更容易测试,可测试性更强,COM、XML、HTTP、HTML 等标准化的 接口使得测试更加容易进行。托管程序(例如Java、.NET)的反射机制使得查找定位对象,以及捕捉对象和操作对象更加容易。 一些开源的框架可以被利用。利用开源框架平台来组合、搭建适合自己测试项目使用的测试平台和测试框架。 自己动手开发测试工具的优势有以下方面。 购买成本为零。 简便:只需要开发自己需要的那部分功能。 个性化:可自己定制需要的功能,随时修改,配置项目组成员的使用习惯。 可扩展性:可随时增加新的功能。 可充分利用项目组熟悉的语言开发,利用自己的技术优势。 可使用自己熟悉的脚本语言,不需要使用商业工具提供的“厂商脚本语言”。 然而,虽然自己动手设计和开发测试工具有很多好处,但是必须考虑随之而来的成本问题。自己开发测试工具的成本只是开发时 间和人员投入的成本,以及维护的成本。当然,如果把测试工具推广到其他项目组,则也会有学习和培训成本。另外,需要考虑测试 工具的实用性,不要做一个大而全的、面面俱到的、很多功能基本上不会被用到的测试工具。 3.2 自动化测试工具选型 为了保证在一个测试团队中成功地应用某款测试工具,尤其是对于大型商业工具的应用,应该首先进行工具的选型,通过分析实 际情况,确定选用范围。对选用范围内的几款测试工具进行试用。根据试用的反馈效果决定最终采用哪款测试工具。在大规模使用工 具之前,还应该对测试人员进行全面的工具培训。培训后,正式在项目中应用测试工具,制定相应的测试工具使用策略,并把工具融 入测试工作中。 3.2.1 测试工具评估 测试工具的选型是成功应用测试工具的第一步,测试工具的选型应该注意以下几点: (1)首先,分析项目的特点,软件系统采用的开发工具、语言、技术、平台等。还要结合测试的类型、测试的要求。 (2)同时还要了解目前存在的各种测试工具的情况,包括工具的生产厂家、价格、产品特性、技术支持和售后服务情况,还要 了解该工具的市场占有率、使用人群等情况,如果是国外厂商生产的测试工具,最好再了解清楚国内的代理机构的情况等。 (3)选型的最后一步是编写选型报告。通过综合分析所有收集回来的材料,横向比较测试工具的优势和劣势。 3.2.2 测试工具试用 在初步选型后,可定出几个满足要求的测试工具,然后进行深入的试用工作,应该尽可能尝试测试工具的所有功能,并且可能的 话,要尽量在项目的软件系统中尝试。 需要制定一份详细的测试工具的试用计划,因为这可能是一项长时间的、需要谨慎进行的工作,尤其是对于那些商业的测试工具, 动辄上百万的购置费用。很多公司由于没有谨慎进行前期的选型和试用工作,导致购买的测试工具不适用,或者使用效果不理想,最 后被测试人员扔在角落里。 注意:不要仅仅听信测试工具销售人员的介绍就轻易购买,一定要自己组织一次详细的试用活动,确认适合在项目中使用,才能 购买。 3.2.3 自动化测试工具的培训 确定了选用的测试工具后,正式在测试项目中使用该测试工具之前,还需要组织相关测试人员进行测试工具的培训。测试工具的 培训可包括以下内容。 (1)测试工具的总体介绍主要给测试人员讲解测试工具包括哪些主要的功能和特性,可用于哪些方面的测试。 (2)测试工具操作方法介绍主要给测试人员讲解测试工具的每一项功能的使用方法、操作步骤、注意事项等方面的内容。一般 可由工具厂商派遣的技术支持人员进行,也可由熟悉该工具的测试人员来介绍,例如,负责前期测试工具试用的测试人员。 (3)测试工具使用实践,则是结合某个具体的例子给测试人员演示测试工具的使用方法和使用经验等。一般可由负责该测试工 具试用的测试人员进行。 (4)对测试工具相关的测试理论进行讲解的目的是为了让测试人员了解该测试工具的原理,以及工具所应用的领域的相关理论 知识,让测试人员在理论知识的指导下能更好、更恰当、更充分、更正确地使用测试工具。 技巧:测试工具的培训是成功引入测试工具的关键环节,在正式使用测试工具之前,应该确保测试人员充分掌握测试工具的基本 使用方法,避免在使用过程中碰到很多工具操作和使用上的问题,导致测试进度缓慢 3.3 自动化测试工具的原理 测试工具的优势在于可部分地替代人工的测试过程,能重复不断地执行,能精确判断数值和字符对象。自动化测试工具把测试用 例用自动的方式执行,例如,自动地产生数据,自动地打开应用程序,自动地查找控件,自动地输入数据,自动地操作控件,自动地 收集测试结果,自动地与预期结果进行比较等。 自动化功能测试工具可基于 GUI 层面进行测试,也可基于代码层面进行测试。只要实现了自动化执行测试用例,自动化地检查 测试数据的测试工具,替代人工进行测试步骤的执行,从而验证应用程序是否满足了特定功能的测试工具,都可以称为自动化功能测 试工具。 3.3.1 基于代码层面的功能自动化测试工具 基于代码层面的功能自动化测试工具主要是一些单元测试工具,例如 JUnit、NUnit、MSTest 等,这些工具直接访问被测试的应 用程序的代码,对其中的类和函数进行调用,输入各种测试数据,检查函数的返回值,通过比较返回值与期待的值是否一致来判断测 试是否通过。图 3.2 所示的是 Visual Studio.NET 2005 中的单元测试管理界面。 图 3.2 Visual Studio.NET 2005 中的单元测试管理界面 这种类型的工具主要实现了测试代码框架产生的自动化,例如,下面代码是 Visual Studio.NET 2005 中的单元测试框架 MSTest 为某个类的方法自动产生的单元测试代码框架: // 以下代码由 Microsoft Visual Studio 2005 生成。 // 测试所有者应该检查每个测试的有效性。 using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Text; using System.Collections.Generic; using AUT; namespace TestProject1 { /// ///这是 AUT.Form1 的测试类,旨在包含所有 AUT.Form1 单元测试 /// [TestClass()] public class Form1Test { private TestContext testContextInstance; /// ///获取或设置测试上下文,上下文提供有关当前测试运行及其功能的信息。 /// public TestContext TestContext { get { return testContextInstance; } set { testContextInstance = value; } } #region 附加测试属性 // //编写测试时,可使用以下附加属性: // //使用 ClassInitialize 在运行类中的第一个测试前先运行代码 // //[ClassInitialize()] //public static void MyClassInitialize(TestContext testContext) //{ //} // //使用 ClassCleanup 在运行完类中的所有测试后再运行代码 // //[ClassCleanup()] //public static void MyClassCleanup() //{ //} // //使用 TestInitialize 在运行每个测试前先运行代码 // //[TestInitialize()] //public void MyTestInitialize() //{ //} // //使用 TestCleanup 在运行完每个测试后运行代码 // //[TestCleanup()] //public void MyTestCleanup() //{ //} // #endregion /// ///Add (int, int) 的测试 /// [DeploymentItem("AUT.exe")] [TestMethod()] public void AddTest() { Form1 target = new Form1(); TestProject1.AUT_Form1Accessor accessor = new TestProject1.AUT_Form1Accessor(target); int i = 0; // TODO: 初始化为适当的值 int j = 0; // TODO: 初始化为适当的值 int expected = 0; int actual; actual = accessor.Add(i, j); Assert.AreEqual(expected, actual, "AUT.Form1.Add 未返回所需的值。"); Assert.Inconclusive("验证此测试方法的正确性。"); } } } 在代码框架的背后,单元测试框架负责查找和调用被测试的类和方法,通过代码反射机制可以访问到被测试代码中的所有方法和 属性。另外,单元测试框架会提供一系列的 Assert 类,使用这些 Assert 类可以简化测试结果检查、判断的工具。 提示:在执行单元测试时,单元测试框架负责加载包含测试类的程序集文件,通过查找里面的测试类和测试方法标识来加载测试 方法,例如,上面代码中的“[TestMethod()]”就是用于标识其中的测试方法。 3.3.2 基于浏览器和 DOM 对象模型的功能自动化测试工具 另外一种自动化的功能测试工具是基于浏览器和 DOM 对象模型开发的,例如 Selenium、Watir 等,这些测试工具直接访问 Web 浏览器,利用脚本语言操纵浏览器和 Web 页面中包含的 DOM 对象,从而达到模拟用户控制浏览导航、页面元素的操纵等效果,并且 直接获取 DOM 对象的属性,从而获得 Web 页面元素的各种属性,通过这些属性可判断测试步骤的结果是否正确。图 3.3 所示的是可 作为插件嵌入到 Mozilla Firefox 浏览器中的 Selenium IDE 的测试界面。 图 3.3 Selenium IDE 的测试界面 HTML DOM(Document Object Model)是一个 HTML 文档的编程接口,它定义了 HTML 的标准对象集合,并且定义了标准的 访问和操纵 HTML 对象的方式。HTML DOM 接口让测试人员可以访问和操纵 HTML 文档的内容。图 3.4 所示的界面是使用了一个名 为“IE DOM Inspector”的工具查看到的 Web 页面中的 DOM 对象。 图 3.4 IE DOM Inspector 的界面 如果熟悉和了解 DOM 的原理,那么完全可以自己动手编写一个基于浏览器和 DOM 的 Web 页面自动化测试工具,例如,下面 的 C#代码就是一个简单的例子: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Diagnostics; using System.Threading; // 引用 Microsoft.mshtml 的 HTML 接口 using mshtml; // 引用 IE 对象 using SHDocVw; namespace WebAutomatedTest1 { public partial class Form1 : Form { static AutoResetEvent documentComplete = new AutoResetEvent(false); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { InternetExplorer ie = null; // 启动 IE 的进程 Process p = Process.Start("iexplore.exe", "about:blank"); // 等待一段时间,让 IE 启动 Thread.Sleep(3000); if (p == null) { MessageBox.Show("不能启动 IE!"); return; } SHDocVw.ShellWindows allBrowsers = new SHDocVw.ShellWindows(); // 附加到 IE 进程 int i = 0; while (i < allBrowsers.Count && ie == null) { InternetExplorer browser = (InternetExplorer)allBrowsers.Item(i); if (browser.HWND == (int)p.MainWindowHandle) ie = browser; ++i; } if (ie == null) { MessageBox.Show("不能附加到 IE!"); return; } ie.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete); object nil = new object(); ie.Navigate("http://127.0.0.1:9462/WebUT/default.aspx",ref nil,ref nil,ref nil,ref nil); documentComplete.WaitOne(); HTMLDocument Doc = (HTMLDocument)ie.Document; HTMLInputElement textBox = (HTMLInputElement)Doc.getElementById("TextBox1"); textBox.value = "123"; HTMLInputElement button = (HTMLInputElement)Doc.getElementById("Button1"); button.click(); // 验证,如果 Label1 的值等于 123,则表示测试通过 HTMLSpanElement label = (HTMLSpanElement)Doc.getElementById("Label1"); if (label.innerText == "123") { MessageBox.Show("测试通过!"); } else { MessageBox.Show("测试不通过!"); } } private static void ie_DocumentComplete(object pDisp, ref object URL) { documentComplete.Set(); } } } 3.3.3 基于 GUI 对象识别的测试工具原理 目前,大部分自动化功能测试工具,尤其是商业的测试工具,都是基于 GUI 对象识别技术来设计的。基于 GUI 层面的测试需要与 各种界面元素打交道,而且不同的编程语言和开发工具开发的应用程序在界面的表现、事件的响应上都略有不同,因此,设计基于 GUI 层面的自动化功能测试工具会更为复杂些。 Windows 的 API 中封装了很多可用于自动化测试编程的函数,例如 FindWindow、GetWindowRect 等函数。这些函数可在编程 语言或脚本代码中进行调用,从而实现自动化测试编程。例如,下面的 C#代码封装了 user32.dll 中的 FindWindow 函数, 实现查找 指定类型和名称的控件的功能: using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace LowLevelGUITest { public class Automation { // 引入 user32.dll 中的 FindWindow 函数 [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); // 查找控件方法 public IntPtr FindControl(string ClassName,string ControlName) { // 返回控件句柄 return FindWindow(ClassName, ControlName); } } } 可用下面的 C#代码来调用这个封装的函数: private void button1_Click(object sender, EventArgs e) { Automation automation = new Automation(); // 查找名为 AUT 的窗体 IntPtr p = automation.FindControl("WindowsForms10.Window.8.app.0.378734a","AUT"); // 判断是否找到控件 if (p == IntPtr.Zero) { Console.WriteLine("找不到指定的控件!"); } } 如果想进一步了解 GUI 对象识别的原理,可以打开 Visual Studio.NET 2005 自带的 Spy++,如图 3.5 所示。 Spy++中的搜索查找控件功能就是这种对象识别原理的体现。例如,在图 3.6 所示的界面中,可以看到某个指定的窗口的句柄、 标题、类。 3.3.4 反射机制在自动化功能测试工具中的使用 在基于 GUI 对象识别和控制的自动化测试工具中,过去一直依赖于 Windows API 函数的调用。而随着新的编程语言和平台的出 现,涌现了很多新的语言特性,这些语言特性可用于自动化测试工具的设计,例如反射机制就是其中一项技术。 程序集包括模块,模块包含类型,类型包含成员。在.NET 和 Java 中,都提供了反射的机制,反射提供了封装程序集、模块和类 型的对象,可以通过反射动态地创建类型的实例,将类型绑定到现有对象,或者从现有对象中获取类型,然后调用类型的方法或访问 其字段和属性。 反射机制可被用在测试中,通过反射来加载被测试程序,获取被测试程序的各种属性,触发被测试程序的各种事件,从而达到自 动化测试的目的。例如,下面的 C#代码通过反射机制读取程序中 textBox1 控件的 Text 属性: // 获取控件属性 static object GetControlPropertyValue(string controlName, string propertyName) { if (AUTForm.InvokeRequired) { Thread.Sleep(1000); return AUTForm.Invoke (new GetControlPropertyValueHandler(GetControlPropertyValue), new object[] { controlName, propertyName }); } // 获取类型 Type t1 = AUTForm.GetType(); // 获取类型中的成员 FieldInfo fi = t1.GetField(controlName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); object ctrl = fi.GetValue(AUTForm); Type t2 = ctrl.GetType(); // 获取成员中的属性 PropertyInfo pi = t2.GetProperty(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); // 返回控件属性值 return pi.GetValue(ctrl, new object[0]); } delegate object GetControlPropertyValueHandler(string controlName, string propertyName); 而下面的 C#代码则通过反射机制调用控件的方法,模拟用户点击按钮的过程: // 模拟用户点击按钮 InvokeMethod("button1_Click", new object[] { null, new EventArgs() }); // 调用控件方法 static void InvokeMethod(string methodName, params object[] parms) { if (AUTForm.InvokeRequired) { Thread.Sleep(1000); AUTForm.Invoke(new InvokeMethodHandler(InvokeMethod), new object[] { methodName, parms }); return; } // 获取类型 Type t = AUTForm.GetType(); // 获取类型中的指定方法 MethodInfo mi = t.GetMethod(methodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance; // 调用方法 mi.Invoke(AUTForm, parms); } delegate void InvokeMethodHandler(string methodName, params object[] arms); 3.3.5 UI Automation 在自动化功能测试工具中的使用 随着.NET 3.0 和 Vista 的发布,微软提供了一套崭新的 Windows 界面框架,名为“UI Automation”,UI Automation 在所有支持 Windows Presentation Foundation(WPF)的操作系统中都可以使用。 UI Automation 提供了一套对 Windows 界面的可编程的访问机制,同时也为测试自动化工具提供了一个新的思路。例如,在使用 QTP 的.NET 插件对 WPF 控件进行测试时,就可以使用 AutomationElement 来访问控件属性,再例如,下面脚本通过 AutomationElement 访问 Test4 窗体控件的 Name 属性: ' 通过 AutomationElement 访问控件属性 msgbox WpfWindow("Test4").AutomationElement.Current.Name 3.3.6 QTP 对象识别技术 有了前面的基础,就不难理解 QTP 的工作原理了。QTP 同样是通过查找应用程序界面中的各个控件的属性来判断是否与测试对 象匹配,例如 QTP 中提供的“Object Spy”功能,就可以把某个界面控件的基本属性列举出来,如图 3.7 所示。 另外,还可以根据控件的类型,把其拥有的可操作的方法列举出来,如图 3.8 所示。 针对不同平台和语言编写的控件,QTP 会采用不同的对象识别方法,但是共通的一点是,通过查找对象属性,依据该控件与其他控件 能区分的属性来判断其身份,例如控件的类名、控件的文本等。QTP 中的“Object Identification”界面中提供了一个可供测试员调整的 对象识别配置器,如图 3.9 所示。 图 3.7 QTP 的“Object Spy”功能 图 3.8 使用“Object Spy”查看控件可操作的方法 图 3.9 QTP 的“Object Identification”界面 提示:其中“Mandatory Properties”中的属性是强制性的判断准则,“Assistive Properties”中的属性用于辅助性地判断。 单击“Add/Remove”按钮,可在如图 3.10 所示的界面中添加更多的属性用于唯一地标识和区别某个控件实例。 图 3.10 添加属性 前面的章节介绍了 QTP 的安装和设置,并且利用录制功能创建了一个基本的自动化测试脚本。在本章,将基于这个基本的测试脚本介 绍 QTP 基本功能的使用,包括如何利用 QTP 提供的各种辅助功能来创建测试脚本,编辑和调试测试脚本,运行测试脚本,以及查看 和分析测试结果。 5.1 QTP 基本功能的使用 QTP 的基本功能包括两大部分:一部分是提供给初级用户使用的关键字视图;另一部分是提供给熟悉 VBScript 脚本编写的自动 化测试工程师使用的专家视图。但是,并没有严格的区分,在实际的自动化测试项目中完全可以两者结合着使用。 5.1.1 QTP 自动化测试的基本过程 使用 QTP 进行自动化测试的基本过程与使用其他自动化测试工具进行自动化功能测试的过程基本是一致的,一般包括以下 5 个步 骤: (1)录制测试脚本。利用 QTP 先进的对象识别、鼠标和键盘监控机制来录制测试脚本,测试人员只需要模拟用户的操作,像执 行手工测试的测试步骤一样操作被测试应用程序的界面即可。 (2)编辑测试脚本。主要包括调整测试步骤、编辑测试逻辑、插入检查点(CheckPoint)、添加测试输出信息、添加注释等。 (3)调试测试脚本。利用“Check Syntax”功能检查测试脚本的语法错误,利用 QTP 脚本编辑界面的调试功能检查测试脚本逻辑 的正确性。 (4)运行测试脚本。可运行单个“Action”,也可批量运行测试脚本。 (5)分析测试结果。使用 QTP 的测试结果查看工具查看测试结果,检查测试运行过程的正确性。 5.1.2 在关键字视图中编辑测试脚本 对于录制下来的测试脚本,需要进一步修改和调整,这些工作可在关键字视图(Keyword View)中进行,也可在专家视图(Expert View)中进行。 对于新手而言,关键字视图可能会更容易理解和使用一些,因为它不需要理解和熟悉测试脚本语言。例如,通过查看如图 5.1 所 示的关键字视图,可以很容易地知道这个测试经过了 4 个测试步骤,分别是: (1)让 Login 窗口处于激活状态。 (2)在“Agent Name”输入框中输入字符串“MERCURY”。 (3)在“Password”输入框中输入密码。 (4)单击“OK”按钮。 图 5.1 查看测试步骤 技巧:在录制过程中,QTP 为每一步操作自动生成操作文档,放到关键字视图的“Documentation”列中显示出来,在“Documentation” 列的列头单击鼠标右键,选择“Copy Documentation to Clipboard”可以导出测试步骤文档,生成测试用例,用于指导手工测试的进行。 5.1.3 在关键字视图中为测试步骤添加注释 虽然 QTP 能为每一个录制的测试步骤自动生成文档,但是,未必能满足对测试脚本的理解上的要求,因此,还需要为测试步骤添 加必要的注释。方法是:首先在关键字试图的表格列头中单击鼠标右键,选择“Comment”,则会多出一列名为“Comment”的列,在这 一列中可为每一个测试步骤添加注释,如图 5.2 所示。 5.1.4 在关键字视图中添加测试信息的输出 如果想在某个测试步骤完成后,输出相应的测试信息到测试报告中,则可单击鼠标右键,选择“Insert Step | Report”,出现如图 5.3 所示的界面。 图 5.3 插入报告 在界面中的“Status”下拉框中,选择写入测试报告的状态(可以是 Done、Passed、Failed、Warning 这 4 种状态中的一种);在“Name” 中输入信息摘要;在“Details”中输入详细的测试步骤信息。 例如,可在激活 Login 界面之前报告“开始登录操作”,在单击 OK 按钮后报告“完成登录操作”,如图 5.4 所示。 图 5.4 添加报告 5.1.5 插入检查点(Checkpoint) 如果想检查 Login 窗口的名称是否为“Login”,如果窗口名称不是“Login”,那么认为测试不通过。这可在关键字视图中通过 QTP 的检查点插入功能来实现。方式如下: (1)首先,定位到激活 Login 窗口所在的测试步骤。 (2)然后单击鼠标右键,选择菜单“Insert Standard Checkpoint”,出现如图 5.5 所示的界面。 图 5.5 插入标准检查点 (3)在界面中,选择需要检查的属性,例如,选择“Enabled”属性,设置为“True”,选择“Text”属性,设置为“Login”。单击“OK”按 钮后,则可在关键字视图中看到新添加的检查点步骤,如图 5.6 所示。 图 5.6 添加新的检查点步骤 前面的章节介绍了 QTP 的安装和设置,并且利用录制功能创建了一个基本的自动化测试脚本。在本章,将基于这个基本的测试脚 本介绍 QTP 基本功能的使用,包括如何利用 QTP 提供的各种辅助功能来创建测试脚本,编辑和调试测试脚本,运行测试脚本,以及 查看和分析测试结果。 5.1 QTP 基本功能的使用 QTP 的基本功能包括两大部分:一部分是提供给初级用户使用的关键字视图;另一部分是提供给熟悉 VBScript 脚本编写的自动 化测试工程师使用的专家视图。但是,并没有严格的区分,在实际的自动化测试项目中完全可以两者结合着使用。 5.1.1 QTP 自动化测试的基本过程 使用 QTP 进行自动化测试的基本过程与使用其他自动化测试工具进行自动化功能测试的过程基本是一致的,一般包括以下 5 个步 骤: (1)录制测试脚本。利用 QTP 先进的对象识别、鼠标和键盘监控机制来录制测试脚本,测试人员只需要模拟用户的操作,像执 行手工测试的测试步骤一样操作被测试应用程序的界面即可。 (2)编辑测试脚本。主要包括调整测试步骤、编辑测试逻辑、插入检查点(CheckPoint)、添加测试输出信息、添加注释等。 (3)调试测试脚本。利用“Check Syntax”功能检查测试脚本的语法错误,利用 QTP 脚本编辑界面的调试功能检查测试脚本逻辑 的正确性。 (4)运行测试脚本。可运行单个“Action”,也可批量运行测试脚本。 (5)分析测试结果。使用 QTP 的测试结果查看工具查看测试结果,检查测试运行过程的正确性。 5.1.2 在关键字视图中编辑测试脚本 对于录制下来的测试脚本,需要进一步修改和调整,这些工作可在关键字视图(Keyword View)中进行,也可在专家视图(Expert View)中进行。 对于新手而言,关键字视图可能会更容易理解和使用一些,因为它不需要理解和熟悉测试脚本语言。例如,通过查看如图 5.1 所 示的关键字视图,可以很容易地知道这个测试经过了 4 个测试步骤,分别是: (1)让 Login 窗口处于激活状态。 (2)在“Agent Name”输入框中输入字符串“MERCURY”。 (3)在“Password”输入框中输入密码。 (4)单击“OK”按钮。 图 5.1 查看测试步骤 技巧:在录制过程中,QTP 为每一步操作自动生成操作文档,放到关键字视图的“Documentation”列中显示出来,在“Documentation” 列的列头单击鼠标右键,选择“Copy Documentation to Clipboard”可以导出测试步骤文档,生成测试用例,用于指导手工测试的进行。 5.1.3 在关键字视图中为测试步骤添加注释 虽然 QTP 能为每一个录制的测试步骤自动生成文档,但是,未必能满足对测试脚本的理解上的要求,因此,还需要为测试步骤添 加必要的注释。方法是:首先在关键字试图的表格列头中单击鼠标右键,选择“Comment”,则会多出一列名为“Comment”的列,在这 一列中可为每一个测试步骤添加注释,如图 5.2 所示。 5.1.6 在关键字视图中插入新的测试步骤 如果想在打开登录界面并激活 Login 窗口的测试步骤之后,而在输入代理机构名的测试步骤之前,先单击“Help”按钮查看帮助, 则需要使用插入测试步骤的功能。 (1)选择“打开登录界面”所在的测试步骤,单击鼠标右键,选择菜单“Insert Step | Step Generator”,则出现如图 5.7 所示的界面。 图 5.7 测试步骤产生器 “Category”包括“Test Objects”、“Utility Objects”和“Functions”,分别代表如下含义: Test Objects:测试对象,即被测试应用程序的界面上的控件元素。 Utility Objects:工具对象,是 QTP 内建的各种用于编写测试脚本、辅助建立测试逻辑的工具类对象。 Functions:各种函数,包括库函数、内建函数、本地脚本函数。 (2)在这里,选择“Test Objects”,然后单击“Object”下拉框旁边的图标按钮,出现如图 5.8 所示的界面,在界面中选择“Help”对 象,然后单击“OK”按钮。 图 5.8 为测试步骤选择测试对象 注意:如果“Help”对象不在列表中,则可单击界面中的手型按钮,然后移动到 Flight 程序的“Login”界面,从中选择测试对象“Help” 按钮,则出现如图 5.9 所示的界面。单击“OK”按钮,把“Help”按钮对象添加到测试对象列表中。 5.2 编辑测试脚本象 在掌握了 QTP 的关键字视图和专家视图的基本使用方法后,就可以综合使用这两个测试视图,结合对象库、函数库等辅助手段来 编辑测试脚本。 5.2.1 识别对象 编辑测试脚本的第一步是识别测试对象,因为基于 GUI 的自动化测试主要是围绕着界面的控件元素来进行的。QTP 针对不同语言 开发的控件,采取不同的对象识别技术,根据加载的插件来选择相应的控件对象识别的依据。在 QTP 中,选择菜单 “Tools | Object Identification”,出现如图 5.14 所示的界面。 图 5.14 对象识别定义界面 在界面中可看到各种标准 Windows 控件对应的对象识别方法,例如,对于 Dialog 控件,使用的是“is child window”、 “is owned window”、“nativeclass”和“text”这四个控件对象的属性来区别出一个唯一的 Dilalog 控件对象。 可以单击“Add/Remove”按钮,在如图 5.15 所示的界面中,选择更多的控件属性来唯一识别控件。 图 5.15 选择或移除属性 5.2.2 Object Spy 的使用 QTP 提供的“Object Spy”工具可用于观察运行时测试对象的属性和方法。选择菜单“Tools | Object Spy”,则出现如图 5.16 所示的 界面。 图 5.16 Object Spy 的界面 在界面中,单击右上角的手型按钮,移动到测试对象上,单击鼠标左键选择测试对象,会自动获取到该测试对象的所有属性和方 法,如图 5.17 所示。 从图中可看到,所选择的是标准 Windows 控件中的“Dialog”对象。切换到“Methods”页,则可看到如图 5.18 所示的控件方法,如 “Activate”、“Click”、“Close”等。 图 5.17 查看控件可用的属性 图 5.18 查看控件可用的操作 Object Spy 对于观察测试对象的属性,了解测试程序的控件属性和行为都非常有用,尤其是对于那些界面控件元素比较多、层次 关系比较复杂的应用程序。 可在测试程序的界面上不断改变测试对象,然后多次使用 Object Spy 来观察其属性的变化,通过这种方式来了解控件的行为,以 及判断哪些控件属性可放到测试脚本中,用于判断测试结果。 5.2.3 对象库管理 另外一种观察和了解测试程序的界面控件元素,以及它们的层次关系的方法是通过对象库(“Object Repository”)。在 QTP 中, 选择菜单“Resources | Object Repository”,出现如图 5.19 所示的界面。 图 5.19 对象库管理 QTP 在录制测试脚本的过程中会把界面操作涉及的控件对象都自动添加到对象库中,但是那些未被鼠标点击或键盘操作的界面控 件则不会添加到对象库中。 5.2.4 把测试对象添加到对象库中 在对象库管理界面中,选择菜单“Objects | Add Object to Local”,然后选择测试程序界面中的某个控件,例如,选择 Flight 程序的 “Login”界面中的“Cancel”按钮,则出现如图 5.20 所示的界面。 单击“OK”按钮,把测试对象添加到对象库中,如图 5.21 所示。 图 5.20 对象选择 图 5.21 添加测试对象到对象库 从右边的对象属性窗口中可看到,对于“Cancel”这个“WinButton”类型的控件,QTP 使用“text”和“nativeclass”两个属性来唯一区分和识 别。这两个属性将作为测试脚本运行时找到测试程序界面上的相应控件的依据。 界面中的某些控件对象是有层次关系的,例如,按钮、输入框等控件包含在窗口控件中,在添加测试对象到对象库时,可以选择 窗口对象,然后在如图 5.22 所示的界面中选择“All object types”,单击“OK”按钮,则会把选择的窗口对象中的所有控件对象添加到对 象库中。 图 5.22 定义对象过滤 5.2.5 导出对象库文件 测试对象作为资源,可导出到文件中,以方便其他测试脚本的使用,方法是在对象库管理界面中,选择菜单 “File | Export Local Object”,存储到某个文件夹中。 5.2.6 在测试脚本中访问对象库的测试对象 把界面的控件作为测试对象添加到对象库中之后,就可以把这些测试对象作为测试资源来访问,例如,在关键字视图中可从对象 库中选择需要的测试对象,如图 5.23 所示。 图 5.23 从对象库选择测试对象 在下拉列表中选择“Object from repository”,出现如图 5.24 所示的界面,在界面中选择对象库中的测试对象。 图 5.24 为测试步骤选择对象 而在专家视图中,同样可以访问到对象库的测试对象,以及它们的属性和方法,如图 5.25 所示。 图 5.25 在专家视图访问对象库的测试对象 5.2.7 添加新的 Action 在 QTP 中,“Action”相当于测试脚本的文件,可使用 Action 来划分和组织测试流程,例如,把一些公用的操作放到同一个 Action 中,以便重用。 如果想在当前 Action 的某个测试步骤之后添加新的 Action,则可选择菜单“Insert | Call to New Action”,出现如图 5.26 所示的界 面。 图 5.26 添加新的 Action 在“Name”中输入 Action 的名称,例如“Action_Help”,在 “Description” 中输入对该 Action 的描述,例如“处理 Help 窗口”,在 “Location” 中选择“After the current step”,然后,单击“OK”按钮,返回关键字视图,则可看到新的名为“Action_Help”的 Action 已经成功被添加, 如图 5.27 所示。 图 5.27 成功添加“Action_Help” 5.2.8 关联 Action 的对象库 双击新添加的 Action,可在该 Action 中添加新的测试代码。由于 QTP 为每一个 Action 生成相应的测试文件和目录,而对象库作 为资源,也是与 Action 绑定的,因此,新添加的 Action 不能直接使用前一个 Action 中的测试对象。 解决方法有两种,一种是通过录制新的测试脚本来产生新的测试对象库,另外一种是通过关联前一个 Action 所导出的对象库文件 来使用其测试对象。下面介绍第二种方法: (1)选择菜单“Resources | Associate Repositories”,出现如图 5.28 所示的界面。 (2)单击“+”按钮,选择前一个 Action 导出的对象库文件,然后,把左边的“Available Actions”中的“Acton_Help”移动到右边的 “Associated Actions”列表中,如图 5.29 所示。 图 5.29 关联对象库与 Action (3)这样,就可在“Action_Help”的测试脚本中使用 Action1 的对象库中的测试对象,打开对象库,在“Action”的下拉框中选择 “Action_Help”,可看到“Action_Help”可用的测试对象,如图 5.30 所示。 图 5.30 “Action_Help”可用的测试对象 提示:这些对象与 Action1 中的是一致的,但是不能进行修改,用灰色显示。在右边的“Repository”中,显示对象库文件的路径为 “D:\QTP\C5\SimpleTest2\OR\OR1.tsr”,而不是“Local”,表明这些对象是引用对象库文件而来的。 5.2.9 编辑新的 Action 为新的 Action 建立了对象库后,就可以在测试脚本中访问和使用这些测试对象,例如,可在专家视图的脚本编辑器中输入以下代 码: Dialog("Login").WinButton("Help").Click '打开帮助界面 Dialog("Login").Dialog("Flight Reservations").Activate Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click ' 单击确定按钮关闭帮助界面 这些代码在 Action_Help 的关键字视图中对应地如图 5.31 所示。 图 5.31 关键字视图 5.2.10 在函数库中创建自定义函数 在测试脚本中,除了访问和调用测试库的测试对象、QTP 内建的函数外,自动化测试工程师还可以自己定义函数库,把一些可重 用的 VB 脚本封装到函数库中,然后,在测试脚本中调用。创建自定义函数的方法如下: (1)选择菜单“Insert | Function Definition Generator”,出现如图 5.32 所示的界面。 图 5.32 函数定义产生器 (2)在“Function definition”中的“Name”输入框中输入函数的名称,在 Type 中选择“Function”,在“Scope”中选择“Public”,在 “Description”中输入函数的描述信息,例如“用于演示如何利用 Function Definition Generator 创建函数”,如图 5.33 所示。 图 5.33 定义函数 提示:如果函数有输入参数,则可以在“Arguments”中单击“+”按钮进行添加。 (3)单击“OK”按钮,则会在当前 Action 的测试代码中,添加如图 5.34 所示的函数框架代码。 图 5.34 产生函数框架代码 在这里可以简单地写一个函数,用于往测试报告中添加一条信息,代码如下所示: '@Description 用于演示如何利用 Function Definition Generator 创建函数 Public Function Test1 ' TODO: add function body here Reporter.ReportEvent micDone ,"Test1" ,"Test1" ' 往测试报告中添加一条信息 End Function (4)添加完函数代码后,就可以在测试代码中调用这个函数,调用方法有两种,一种是在专家视图中编写代码调用,只需要简单 地输入函数名即可,如下面代码所示: Test1 ' 调用函数 Test1 Dialog("Login").WinButton("Help").Click '打开帮助界面 Dialog("Login").Dialog("Flight Reservations").Activate Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click ' 单击确定按钮关闭帮助界面 '@Description 用于演示如何利用 Function Definition Generator 创建函数 Public Function Test1 ' TODO: add function body here Reporter.ReportEvent micDone ,"Test1" ,"Test1" ' 往测试报告中添加一条信息 End Function 另外一种方法是在关键字视图中,通过选择菜单“Insert | Step Generator”,在如图 5.35 所示的界面中,选择“Category”为 “Functions”,选择“Library”为“Local script functions”,然后选择“Operation”为“Test1”即可。 图 5.35 通过 Step Generator 来添加函数调用 添加对 Test1 的调用后,在关键字视图中可看到,新加了一个测试步骤“Function Call”,如图 5.36 所示。 图 5.36 添加“Function Call”测试步骤 5.3 运行和调试测试脚本 编辑好测试脚本后,在运行测试之前,可利用 QTP 的语法检查功能和脚本调试功能对测试脚本的逻辑进行检查。 5.3.1 语法检查 选择菜单“Tools | Check Syntax”,或者按快捷键“CTRL + F7”对测试脚本进行语法检查,如果语法检查通过,则在“Information”界 面(可通过选择菜单“View | Information”打开)提示如图 5.37 所示的信息。 图 5.37 语法检查通过 如果语法检查发现有问题,则会在 Information 界面中列出详细的信息,如图 5.38 所示,包括语法错误的信息描述,出现在哪个 Action 的哪行代码,双击该提示信息,将转到相应的测试脚本的代码行。 图 5.38 语法检查的详细信息 5.3.2 使用断点 语法检查通过后,可直接运行测试脚本,也可设置断点对脚本进行调试。例如,在如图 5.39 所示的代码行中设置断点(快捷键是 F9)。 图 5.39 设置断点 然后,按 F5 键运行测试脚本,运行过程中将在断点所在的代码行停住,如图 5.40 所示。 图 5.40 运行脚本到断点处 5.3.3 单步调试 这时候,可以选择菜单“Debug | Step Over”,或者按快捷键“F10”跳到下一行代码,也可以选择“Debug | Step Into”,或者按快捷 键“F11”进入代码行中所调用的函数“Test1”。如图 5.41 所示。 图 5.41 单步调试 5.3.4 调试查看器的使用 在调试过程中,可选择菜单“View | Debug Viewer”,在如图 5.42 所示的界面中,输入测试对象属性或变量,查看其值。 图 5.42 调试器 如果安装了 Visual Studio.NET 2008,则可以增强 QTP 的调试能力,在“Debug Viewer”中可以查看到对象的大部分属性,如图 5.43 所示。 图 5.43 增强的调试器 技巧:可以通过安装 Visual Studio.NET 2008 来增强 QTP 调试能力,也可以不安装,仅仅把其中一个名为 PDM.DLL 的文件拷贝 到“C:\Program Files\Common Files\Microsoft Shared\VS7DEBUG”目录中,然后注册一下即可,注册方法是在命令行中输入 “RegSVR32 “C:\Program Files\Common Files\Microsoft Shared\VS7DEBUG\pdm.dll"”。 5.3.5 运行整个测试 对测试脚本进行语法检查和调试都无误后,可以按 F5 键运行整个测试脚本。在运行测试之前,可以对运行做必要的设置,以便 满足测试的要求。选择菜单“Tools | Options”,出现如图 5.44 所示的界面。 在“Run”页中的“Run mode”,可选择运行模式为“Normal”或“Fast”。如果选择“Fast”,则 QTP 以尽可能快的速度运行测试脚本中的每一 个测试步骤;如果选择“Normal”,则可以进一步设置测试运行过程中每一个步骤直接的停顿时间,这种设置有利于测试人员在 QTP 执 行测试的过程中查看测试的整个过程,看是否如预期的设计一样执行测试。 提示:如果想在测试运行完毕后,自动打开测试结果界面,则需要确保“View results when run session ends”选项被勾选上。 5.3.6 运行部分测试 如果有多个 Action,则可以定位到需要运行的 Action,然后,选择菜单“Automation | Run Current Action”来仅仅运行当前的 Action, 这种方式有利于单独运行 Action,查看单个 Action 测试执行的情况,有利于定位当前 Action 运行的问题。 还有另外一种方式可以用于运行部分的测试,方法是选中某个测试步骤,然后单击鼠标右键,选择菜单“Run From Step”,可以从 当前选中的测试步骤开始运行测试,也可以选择“Run To Step”,开始测试并运行到当前所选的测试步骤。 5.3.7 批量运行测试 可以使用 QTP 自带的工具“Test Batch Runner”来批量运行测试脚本。为了让“Test Batch Runner”可以运行测试脚本,需要在 QTP 中选择菜单“Tools | Options”,打开如图 5.45 所示的界面,确保“Allow other Mercury products to run tests and components”选项被勾 选上。 图 5.45 设置运行属性 然后,通过选择“开始 | 所有程序 | QuickTest Professional | Tools | Test Batch Runner”启动 Test Batch Runner,如图 5.46 所示。 图 5.46 Test Batch Runner 主界面 在 Test Batch Runner 中,选择“Batch | Add”来选择并添加需要运行的测试脚本,然后,选择菜单“Batch | Run”来批量运行列表中 的所有测试脚本。
还剩58页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

jeiidde

贡献于2014-01-07

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf