QTP自动化测试项目实践第8章数据驱动测试测试脚本的开发和维护是自动化测试的重要环节,适当地调整和增强测试脚本,能提高测试脚本的灵活性,增加测试覆盖面,以及提高应对测试对象变更的能力。数据驱动方式的测试脚本开发是解决这类问题的重要手段。本章介绍如何在自动化测试过程中使用数据驱动的测试脚本开发方式,对测试脚本进行参数化,包括如何使用QTP的DataTable参数化、Action参数化、环境变量参数化等脚本参数化的方法。8.1数据驱动测试方法数据驱动的测试方法要解决的核心问题是把数据从测试脚本中分离出来,从而实现测试脚本的参数化。8.1.1什么时候使用数据驱动测试方法自动化测试对录制和编辑好的测试步骤进行回放,这种是线性的自动化测试方式,其缺点是明显的,就是其测试覆盖面比较低。测试回放的只是录制时做出的界面操作,以及输入的测试数据,或者是脚本编辑时指定的界面操作和测试数据。如何让测试脚本执行时,不仅仅局限于测试录制或编辑时的测试数据呢?数据驱动的测试方式是解决这个问题的最佳方案。数据驱动测试把测试脚本中的测试数据提取出来,存储到外部文件或数据库中,在测试过程中,从文件动态读入测试数据。注意:如果希望测试的覆盖面更广,或者让测试脚本能适应不同的变化情况,则需要进行测试脚本的参数化,采用数据驱动的测试脚本开发方式。8.1.2数据驱动测试的一般步骤通常,数据驱动测试按以下步骤进行:(1)参数化测试步骤的数据,绑定到数据表格中的某个字段。(2)编辑数据表格,在表格中编辑多行测试数据(取决于测试用例以及测试覆盖率的需要)。(3)设置迭代次数,选择数据行,运行测试脚本每次迭代从中选择一行数据。QTP提供了一些功能特性,让这些步骤的实现过程得以简化。例如,使用“DataTable”视图来编辑和存储参数,如图8.1所示。图8.1DataTable视图另外,还提供“DataDriver向导”,用于协助测试员快速查找和定位需要进行参数化的对象,并使用向导进行一步一步的参数化过程。8.2参数化测试在QTP中,可以通过把测试脚本中固定的值替换成参数的方式来扩展测试脚本,这个过程也叫参数化测试,能有效地提高测试的灵活性。8.2.1通过参数化测试来提高测试的灵活性可以通过参数化的方式,从外部数据源或数据产生器读取测试数据,从而扩大测试的覆盖面,提高测试的灵活性。在QTP中,可以使用多种方式来对测试脚本进行参数化,数据表参数化(DataTableParameters)是其中一种重要的方式,还有环境变量参数化(EnvironmentVariableParameters)、随机数参数化(RandomNumberParameters)等。下面以QTP自带的“Flight”程序为例,介绍如何对测试脚本进行参数化。假设在名为“FlightReservation”的订票界面中,输入航班信息后,插入订票记录,然后,希望重新打开该记录,检查航班信息中的终点的设置是否正确,录制的测试脚本如图8.2所示。图8.2录制的测试脚本提示:对于这样一个测试脚本,仅能检查特定的航班订票记录的正确性,如果希望测试脚本对多个航班订票记录的正确性都能检查,则需要进行必要的参数化。8.2.2参数化测试步骤首先,把测试步骤中的输入数据进行参数化,例如航班日期、航班始点和终点等信息。下面,以“输入终点”的测试步骤的参数化过程为例,介绍如何在关键字视图中对测试脚本进行参数化。(1)选择“FlyTo:”所在的测试步骤行,单击“Value”列所在的单元格,如图8.3所示。图8.3设置参数值(2)单击单元格旁边的“#”按钮,或按快捷键“CTRL+F11”,则出现如图8.4所示的界面。图8.4选择参数从DataTable读取提示:在这个界面中,选择“Parameter”,在旁边的下拉框中选择“DataTable”,在“Name”中输入参数名,也可接受默认名,在“LocationinDataTable”中可以选择“Globalsheet”,也可以选择“Currentactionsheet(local)”,它们的区别是参数存储的位置不同。(3)单击“OK”按钮,在关键字视图中可看到,“Value”值已经被参数化,替换成了如图8.5所示。图8.5参数化后的值(4)这时,选择菜单“View|DataTable”,则可看到如图8.6所示的界面。图8.6DataTable中的参数数据可看到,在“p_Item”列中有一个默认数据“Frankfurt”,这是参数化之前录制的脚本中的常量,可以在“p_Item”列中继续添加更多的测试数据。提示:可以双击修改“p_Item”列名,让其可读性更强,例如,改成“FlyTo”。(5)把其他几个数据也参数化后,如图8.7所示。图8.7参数化后的测试步骤QTP运行时,就会从如图8.8所示的数据表格中提取数据来对测试过程中的各项输入进行参数化。图8.8DataTable存储的参数值8.2.3使用随机数来进行参数化对于选择航班这个测试步骤的参数化来说会有所不同,因为航班会跟随所选择的起点和终点而变化,因此,需要做特殊的处理。如下代码所示:'取得航班列表的行数ItemCount=Window(FlightReservation).Dialog(FlightsTable).WinList(From).GetItemsCount'随机选取其中一项SelectItem=RandomNumber(0,ItemCount)'选择航班Window(FlightReservation).Dialog(FlightsTable).WinList(From).SelectSelectItem先通过访问GetItemsCount属性,获取航班列表的行数,然后使用RandomNumber随机选取其中一项,最后,再通过Select方法选择航班。参数化后的测试步骤如图8.9所示。图8.9参数化后的测试步骤提示:使用随机数也是测试脚本参数化的一种重要方法,在QTP的测试代码中,可用RandomNumber来实现,在关键字视图编辑的界面如图8.10所示,其效果与在脚本中直接编辑是一样的。图8.10选择参数化方式为“RandomNumber”8.2.4参数化检查点测试脚本的最后一个测试步骤是检查订票记录中的航班终点是否正确,同样需要进行适当的参数化,方法如下:(1)单击检查点所在测试步骤的“Value”列中的单元格,如图8.11所示。图8.11设置检查点参数(2)单击旁边的按钮,则出现如图8.12所示的界面。图8.12检查点属性编辑界面(3)在“Configurevalue”中选择“Parameter”后,可单击“OK”按钮接收默认的设置,也可单击旁边的编辑按钮,在如图8.13所示的界面中,进行参数化的详细设置。图8.13参数化的详细设置在“Parametertypes”中,选择“DataTable”;可在“Name”修改参数名,或接受默认的命名,产生如图8.14所示的数据列,也可以选择“FlyTo”,因为检查点所指的航班终点得到的预期值应该与测试步骤中选择航班终点时的输入数据一致,否则认为错误。图8.14DataTable中存储的参数值8.2.5设置数据表格迭代方式把测试步骤和检查点的参数化工作都完成后,可得到如图8.15所示的测试步骤。图8.15参数化后的测试步骤切换到专家视图,可看到如图8.16所示的测试脚本。图8.16参数化后的测试脚本运行这个测试脚本之前,还要做一些必要的设置,选择菜单“File|Settings”,出现如图8.17所示的测试设置界面,切换到“Run”页,在“DataTableiterations”中,可设置数据表格的迭代方式。图8.17设置运行迭代方式提示:“Runoneiterationonly”是指仅运行一次迭代,也就是说,即使DataTable中有多条测试数据,也仅执行一次;“Runonallrows”则是指按数据表格中的所有数据都运行一次;选择“Runfromrow…torow…”则可进一步设置运行的测试数据范围。选择“Runonallrows”,得到如图8.18所示的测试结果。图8.18测试结果8.3Action测试输入的参数化对于重复使用的测试用例,可以转换成公共用例,适当参数化后,可被其他测试用例调用。在QTP中,可以把Action的输入适当参数化,转换成可重用的测试步骤。8.3.1编辑Action的属性QTP的“Flight”程序中的登录模块的测试步骤是在执行其他测试步骤之前都要经过的测试步骤,因此有“潜力”成为一个可重用的Action。对于如图8.19所示的测试步骤,可以进一步参数化后,成为可重用的测试步骤,被其他Action调用。图8.19可重用的测试步骤选择“Action1”所在的行,然后单击鼠标右键,选择菜单“ActionProperties”,则出现如图8.20所示的界面。图8.20Action属性编辑窗口在“Name”中输入新的Action名称,例如“Login_Action”,在“Description”中输入对Action的描述信息,如图8.21所示。图8.21编辑Action属性注意:把“Reusableaction”勾选上,表示该Action为可重用的测试步骤,是可被其他Action调用的测试步骤。8.3.2添加Action的输入参数切换到“Parameters”页,如图8.22所示。单击“+”按钮,添加调用Action需要输入的参数名和类型。图8.22添加输入参数提示:在这里,“Login_Action”需要两个参数,其中,“AgentName”表示代理机构登录名,“Password”表示登录密码。添加完参数后,回到关键字视图,选择“输入代理机构名”所在的测试步骤,单击“Value”列的单元格旁边的“#”按钮,出现如图8.23所示的界面。图8.23设置参数在“Parameter”中,选择“Test/actionparameter”,然后,选择刚才编辑好的参数“AgentName”,单击“OK”按钮。重复这个步骤,为“输入登录密码”的测试步骤设置参数,得到如图8.24所示的测试步骤。图8.24完成测试步骤8.3.3调用Action完成Login_Action的参数化后,就可以在其他Action中调用这个Action,方法是在Action的测试步骤中,选择菜单“Insert|CallToExistingAction”插入现有的Action,如图8.25所示。图8.25选择Action在这个界面的“Fromtest”中选择“CurrentTest”,在“Action”中选择“Login_Action”,单击“OK”按钮后,即可插入对“Login_Action”测试步骤的引用,如图8.26所示。图8.26插入对Action的引用选中“Login_Action”所在的行,单击鼠标右键,选择菜单“ActionCallProperties”,出现如图8.27所示的界面。图8.27设置参数值在“ParameterValue”页中,为每一个参数设置输入的参数值,也可以单击“Value”列旁边的“#”按钮,为输入绑定到DataTable中的数据。单击“确定”后,可在专家视图看到如图8.28所示的测试代码:图8.28使用RunAction方法来调用Action该测试代码使用了RunAction方法来调用“Login_Action”,输入的第一个参数值和第二个参数值都为“MERCURY”。测试脚本的运行结果如图8.29所示,可看到,“Login_Action”被成功地调用,测试结果中也列出了调用“Login_Action”所输入的参数值。图8.29测试结果8.4使用环境变量的参数化在QTP中,除了前面所讲的几种参数化测试的方式外,还可以使用环境变量来进行测试的参数化。下面介绍如何使用环境变量来参数化如图8.30所示的测试步骤,将其中的“AgentName”和“Password”的值从定义好的环境变量读入。图8.30待参数化的测试步骤8.4.1定义和设置环