qtp参数化
QTP参数化_实验报告1
实验一熟悉自动化测试工具QTP的使用一、实验目的(1)理解和掌握自动化测试的基本原理和方法。
(2)掌握QTP录制及回放测试脚本的方法。
二、实验环境(仪器设备、软件等)Windows 7、QuickTest Professional三、实验原理(或要求)使用QTP对flight的业务进行脚本录制和回放,掌握录制及回放的操作步骤。
当使用应用程序时,QTP会记录你的操作步骤,并产生测试脚本。
当停止录制后,会看到QTP在Keyword View中以表格的方式显示测试脚本的操作步骤;回放脚本时,QTP 能自动执行之前的人工操作。
四、实验内容录制机票预订登陆窗口login的登陆脚本并回放脚本验证录制的正确性。
五、记录与处理(实验数据、误差分析、结果分析)1.执行QuickTest并开启一个全新的测试脚本⏹开启QuickTest,在“Add-in Manager”窗口中选择“visual basic”选项,点击“OK”关闭“Add-in Manager”窗口,进入QuickTest Professional 主窗口。
⏹如果QuickTest Professional 已经启动,检查“Help>About QuickTestProfessional”查看目前加载了那些add-ins。
如果没有加载“visual basic”,那么必须关闭并重新启动QuickTest Professional,然后在“Add-in Manager”窗口中选择“Web”。
⏹如果在执行QuickTest Professional时没有开启“Add-in Manager”则点击“Tool>Options”,在“General”标签页勾选“Display Add-in Manager onStartup”,下次执行QuickTest Professional 时就会看到“Add-in Manager”窗口2.开始录制测试脚本选中“Test>Record”或者点选工具栏上的“Record”按钮。
QTP参数化密码问题解决方法
QTP参数化密码问题解决方法
密码参数化有两种方式:
一种改用Set方法
一种用Crypt对象的Encrypt方法加密后再参数化
因为SetSecure方法后面必须是加密的字符串,所以你输入的8位数字也好9位数字也好那都只是表示明文,并不是说SetSecure会根据你指定的这个字符串输入密码。
所以你这个时候可以改用Set方法来实现输入密码。
如果你一定要使用SetSecure方法,也可以。
举例:
比如密码是 mercury,你用 Crypt.Encrypt("mercury") 可以得到一个值"464d059be45f8d524b913574b017ed492a8b8d4b"
然后你在SetSecure后面要加上这串密文!而不是你的明文密码。
SetSecure方法:
object.SetSecure Text
其中的参数Text,是QTP对密码的明文经过加密算法生成的一个字符串。
其目的是保护测试脚本和测试数据中的密码信息。
生成Text字符串的方法:
1. 录制方式
QTP录制脚本的时候,遇到密码输入的WebEdit类型。
QTP自动生成
WebEdit("***").SetSecure "***************"
2. 手工方式
QTP工具里面有一个Password Encoder,输入代码明文,可以Generate一个加密后的字符串。
这个字符串才是SetSecure的参数。
这个工具可以从开始菜单的QTP程序组里面找到。
QTP参数化
QTP 参数化总结 1、2、32009-07-27 11:00原始脚本录制: Browser("LightPole").Page("LoginPg").Sync '打开 LightPole 的网站 Browser("LightPole").Refresh '刷新当前页面 Browser("LightPole").Page("LoginPg").Link("Company").Click '点击 Company 链接 Browser("LightPole").Page("Company").Sync ' Company 链接页面打开 Browser("LightPole").Close '关闭当前页面 ******************************* 参数化 (一) Dim mylink mylink="Press"'定义一个变量 mylink '给这个变量赋值为 PressBrowser("LightPole").Page("LoginPg").Sync Browser("LightPole").Refresh Browser("LightPole").Page("LoginPg").Link("text:="&mylink).Click '把原来录制 脚本时候的链接参数化(用描述性编程"text:="&mylink) Browser("LightPole").Page("text:="&mylink).Sync '可以回避这个页面, 对应打 开的页面也应该参数化,页面也参数化,和链接保持一致 Browser("LightPole").Close '关闭当前页面 运行这个脚本就会打开 Press 链接对应的页面 (注意: 在运行脚本的时候把其它的 IE 窗口 关掉,否则的话可能出现对象库未定义的问题) ************************************************* 参数化 (二) 把参数放在 QTP 自带的 Datatable 里, 然后 QTP 会循环执行, datatable 用 里面指定列的每一行参数 前提:在 datatable 里面输入指定的参数,参见图片:para.jpgDim mylink mylink=DataTable("A",dtGlobalSheet) '指定列为 A Browser("LightPole").Page("LoginPg").Sync Browser("LightPole").Refresh Browser("LightPole").Page("LoginPg").Link("text:="&mylink).Click Browser("LightPole").Page("text:="&mylink).Sync Browser("LightPole").Close ************************************************************ 参数化(三) 把 excel 表格中的数据导入(import)到 QTP 的 datatable 中,制定其导入的“文件名”, sheet 名,把 excel 的数据导入到本地第几个 datatable 里 DataTable.ImportSheet(FileName, SheetSource, SheetDest) , DataTable.ImportSheet( , ) Datatable.ImportSheet "参数 1" ,参数 2,参数 3 参数 1:要导入的 excel 文件的绝对路径 参数 2:要导入的 excel 文件的第几个 sheet 参数 3:要导入到本地 datatable 的第几个表中关于一下两个例子的备注说明:注 1: excel 表的内容 excel:地址 d:\\mydata.xls;sheet1: sheet2: mylink mylink Company Blog Press 注 2.本地 datatable 的两个表的名称:1.Golbal ;2.Action1例 1: Datatable.ImportSheet "d:\\mydata.xls" ,2,2 '把 excel 文件中第二个 sheet 的数据 导入到本地第 2 个 datatable 的数据表格中 Dim mylink mylink=DataTable("lindk","Action1") '所以在这里就要调用本地第二个 datatable 的 数据 msgbox mylink Browser("LightPole").Page("LoginPg").Sync 'Browser("LightPole").Refresh Browser("LightPole").Page("LoginPg").Link("text:="&mylink).Click Browser("LightPole").Page("text:="&mylink).Sync Datatable.SetNextRow Browser("LightPole").Close 运行结果应该是:Msgbox 应该弹出 Blog。
QTP参数化的设置方法
QTP参数化的设置方法参数化设置方法主要是讲一下自带的例子,对fly from fly to 做参数化,以下是一个登录、订票、点击新建按钮、退出的一个流程。
首先我要切割action中的内容,将action分为三个action。
原因是:1,我不想让脚本重复执行登录,我可以将登录这一块的脚本放到一个action1中,2、我将登录切割出去,那么我也必须将退出切割出去,原因是:如果将登录切割出去了,退出不切割,执行第一遍后,退出了没有登录的地方,所以参数化的数据执行到第二遍不会执行,因为它找到不到登录的地方,找不到对象。
切割action的方法:将鼠标点击到这一行,点击工具栏中的此图标,此图表示切割action,会弹出如图确,定即可,如果你没有保存录制的脚本,弹出保存的位置,保存一下即可,保存后再点击切割action,会弹出如下图此选项表示将action分为同级此项表示将book2分为book1的子选项。
此图是我设置好的,点击ok即可此图是分割后的连个action。
以此方法,将退出从action12中分出去。
鼠标点击到这一行,点击分割图标即可。
Action分割完毕,可对fly from 这一行进行参数化鼠标点击到fly from 这一行鼠标点击图中第三列后边的那个尖括号的地方弹出如图界面这个就不用介绍了吧,这个就是它原有的参数这个是参数,data table 表示以数据表形式显示,做为参数,点击下拉框中还有连个选项,这个是以环境变量做为参数此选项是表示随机数一般都是用数据表形式,我就用数据表形式给记录我的练习。
此选项是给参数取个列名这个就有点麻烦,第一个是Global sheet 表示是做一个全局的参数化(个人理解是对整个脚本的这个做参数化)这个是私有的,表示对它所在的action的这个参数做参数化,我现在是在给第二个action的这个做参数化。
这个是我设置的,点击ok即可可以看到在数据库的action2中有数据,其他的Global 、action11、action13都没有数据,以此方法,对fly to做参数化此图是两个都进行参数化了。
qtp导入excel文件读取excel文件参数化
参数化种类:数据表、环境变量、随机数、外部数据参数化1.数据表(data table)方式参数化a、file-->settings-->run下data table iterations中设置控制的是数据表中global 里数据的运行方式;global是全局的!当运行方式设置为运行全部或多行时,运行几行数据“程序”就要回放几次!!不能重新设置!!b、edit-->action-->action call properties-->run下data table iterations中设置控制的是数据表中该action里数据的运行方式;local 是局部的!当运行方式设置为运行全部或多行时,运行几行数据“该action”就要回放几次!!进一步说明:a、当global有多行数据file-->settings-->run On all Rows ;action有多行数据action call property->Run On all Rows 程序每次运行时,action中的每行都要执行一次b、当global 有多行数据file-->settings-->run On all Rows ;action有多条数据,action call property->Run one iteration only 而且global的行数>action的行数,当action执行到最后一行后,不管此时global 的行数为几,下次回放时action都执行最后一行! 如果global的行数<action的行数,action就执行不到最后一行c、action call property->Run from rows to rows,就结合上面所说可以理解d、当同一个action中有多个参数时,且action call property->Run On all Rows,这个时候每个参数的数据个数需要相等2.随机数(random)参数化a、可以指定随机数的范围b、可以为该随机数指定名称,同时需要指定该随机参数产生新随机数的方式。
QTP脚本录制参数化
QTP脚本录制参数化
目的:实现登陆关闭飞机订票系统一次,但是要定制多张飞机票
1,首先录制飞机订票系统的登录、订票、关闭三个模块,分成三个action(注意:可以在录制时直接录为三个action,也可以录在一个action中,然后手工分为三个action,具体操作方法是鼠标右击要分成另一个action的地方,选择action——split..如下图)
2,然后右键单击需要参数化的系数后面的<#>,会出现一个窗口,如下图,选择图中选项,并命名,单击确定,最后再datatable视图中添加相关参数。
3,然后右键单击需要参数化的那个action ,选择action call properties...。
选择第二个或者是第三个选项。
QTP自动化测试原理
QTP自动化测试原理【引言】自动化测试是软件测试中的重要环节,它可以提高测试效率和准确性。
QTP (Quick Test Professional)是一款功能强大的自动化测试工具,被广泛应用于软件测试领域。
本文将详细介绍QTP自动化测试的原理和相关知识。
【QTP自动化测试原理】一、QTP概述QTP是一款由Micro Focus公司开辟的自动化测试工具,旨在匡助测试人员快速创建、执行和管理测试用例。
它支持多种测试技术,包括关键字驱动、数据驱动和行为驱动等。
QTP可以与多种开辟环境和测试工具集成,提供了丰富的功能和灵便的扩展性。
二、QTP的工作原理QTP的工作原理可以分为以下几个步骤:1. 对象识别:QTP通过对象识别机制来定位和操作被测应用程序中的对象。
它使用对象的属性和方法来惟一标识对象,如对象的名称、类型、坐标等。
QTP支持多种对象识别方式,包括基于屏幕坐标、基于对象属性和基于对象层次结构等。
2. 录制测试脚本:QTP提供了录制功能,可以记录用户在被测应用程序上的操作,生成测试脚本。
在录制期间,QTP会自动识别和记录被操作对象的属性和方法。
录制完成后,可以对测试脚本进行编辑和调整。
3. 编写测试脚本:除了录制功能外,QTP还支持手动编写测试脚本。
测试脚本使用VBScript语言编写,可以调用QTP提供的对象和方法来实现测试功能。
测试脚本可以包含条件判断、循环、函数等结构,以实现复杂的测试逻辑。
4. 参数化和数据驱动:QTP支持参数化和数据驱动的测试。
参数化可以将测试数据从测试脚本中分离,提高测试的灵便性和可维护性。
数据驱动可以通过外部数据源(如Excel表格、数据库)来驱动测试,提高测试的覆盖范围和效率。
5. 执行测试脚本:QTP可以执行单个测试脚本或者一组测试脚本。
执行期间,QTP会摹拟用户的操作,与被测应用程序进行交互,并验证测试结果。
执行过程中,可以监控测试脚本的执行状态和日志信息,以便进行调试和分析。
实验二 QTP参数化、检查点、输出值、同步
1-21
The End
解决思路:Wait
《软件测试工具》
SEI of ECNU 版权所有©
1-6
练习1 参数化
参数化Ticket
《软件测试工具》
SEI of ECNU 版权所有©
1-7
2、检查点
验证执行结果是否正确
ห้องสมุดไป่ตู้Eg:检查某些文字是否出现
《软件测试工具》
SEI of ECNU 版权所有©
1-8
检查点的类型
标准检查点 (standard checkpoint)
输出表格单元格的内容或者表格的属性值
数据库输出值(Database output value)
创建SQL语句从数据库中检索相应的纪录并输出指定的值
XML输出值(XML output value)(只能在录制时创建)
输出XML元素或其属性值
《软件测试工具》
SEI of ECNU 版权所有©
1-16
输出值的插入方法
《软件测试工具》 SEI of ECNU 版权所有© 1-9
检查点的类型
可访问性检查点(Accessibility checkpoint)
对网站区域进行识别以检查是否符合508 部分,例如检查网页上的图像是 否包含 ALT 属性(该属性是 W3C Web 内容可访问性规则所要求的)。
页面检查点(Page checkpoint)
检查对象(界面控件)的属性值 ,例如检查是否选中某单选按钮。
图像检查点(image checkpoint)
检查图像的属性值,例如检查图像源文件是否正确。
位图检查点(bitmap checkpoint)
将网页或应用程序的某个区域捕获为位图后对其进行检查,例如检查网 页或网页的任何部分是否能按预期显示。
qtp 工作原理
qtp 工作原理
QTP(QuickTest Professional),是一种自动化测试工具,用
于执行功能、回归以及数据驱动测试。
它具有以下工作原理:
1. 录制测试脚本:QTP可以记录用户的操作,将其转化为可
执行的测试脚本。
通过鼠标点击和键盘输入,QTP可以捕获
用户在被测应用程序上的操作,并将其转化为自动化测试脚本。
2. 对象识别:QTP能够识别被测应用程序中的各种对象和控件,比如按钮、文本框、表格等等。
通过使用对象识别机制,QTP可以根据不同的对象类型执行相应的操作。
3. 参数化:QTP允许用户对测试数据进行参数化,以便在执
行过程中引入各种测试数据。
通过参数化,用户可以在运行测试脚本时灵活地修改和选择测试数据,提高测试的可变性和适用性。
4. 嵌入检查点:QTP支持将各种检查点嵌入到测试脚本中,
以确保应用程序的功能是否按照预期工作。
检查点可以验证应用程序的各种属性和状态,比如文本、图像、数据库等。
5. 数据驱动测试:QTP支持数据驱动测试的实现。
用户可以
通过将测试数据从外部源导入到测试脚本中,实现多组测试数据的循环执行,并分析执行结果。
6. 脚本调试和错误处理:QTP提供了丰富的调试功能,可以
帮助用户定位测试脚本中的错误和异常。
用户可以逐步执行测
试脚本,观察对象的操作和结果,并在需要时进行断点调试。
7. 报告生成和结果分析:QTP可以生成详细的测试报告,包括测试执行结果、错误信息和异常情况等。
用户可以根据测试报告进行结果分析和问题调研,以便进一步优化测试脚本和测试计划。
QTP参数化
QTP参数化方法一、DataTable方法这是QTP提供的一种方法,也是最容易实现参数化的一种方式。
QTP针对DataTable对象提供了很多方法,可以对DataTable进行灵活的操作。
DataTable分为Global和Local 两种,Global所有的Action都可以用,而Local就是只能Action自己用。
通过DataTable做参数化最直接的方法就是在Keyword View视图下通过选项进行,这样即方便又减少出错的几率。
单击要参数化项目的value列,选择出现的箭头弹出Value Configuration Option对话框,在这里可以很方便的进行参数化。
Parameters选择数据来源类型。
下拉列表选择DataTable后,选择所要使用的数据表Global还是local,最后选择name参数取自哪列,点击确定后即可完成参数化过程。
代码如下:Dialog("Login").WinEdit("Agent Name:").Set DataTable("user", dtGlobalSheet)这是最简单最直接的方式。
用这种方式需要注意,在File---Seting---Run需要做相应设置,否则运行结果很容易出错,使实际取到的参数值和预期的不一样或是循环不正确的错误。
最好的方式是通过写语句来控制迭代过程中的取值。
在脚本开发过程中,这种方式是最常用的。
类似如下代码:For i=0 to DataTable.GetCurrentRowDialog("Login").WinEdit("Agent Name:").Set DataTable("user", dtGlobalSheet)DataTable.SetNextRowNext关于DataTable iterations的问题:a、file-->settings-->run下datatableiterations中设置控制的是数据表中global里数据的运行方式;global是全局的!当运行方式设置为运行全部或多行时,运行几行数据“程序”就要回放几次!!不能重新设置!!b、edit-->action-->action callproperties-->run下data tableiterations中设置控制的是数据表中该action里数据的运行方式;local是局部的!当运行方式设置为运行全部或多行时,运行几行数据“该action”就要回放几次!!进一步说明:当global有多行数据file-->settings-->runOn all Rows ;action有多行数据action call property->Run Onall Rows 程序每次运行时,action中的每行都要执行一次当global有多行数据file-->settings-->run On allRows ;action有多条数据,action callproperty->Run one iteration only而且global的行数>action的行数,当action执行到最后一行后,不管此时global的行数为几,下次回放时action都执行最后一行!如果global的行数<action的行数,action就执行不到最后一行action call property->Run from rows torows,就结合上面所说可以理解当同一个action中有多个参数时,且action callproperty->Run Onall Rows,这个时候每个参数的数据个数需要相等方法二、环境变量实现参数化Environment对象提供对环境变量的访问。
最新QTP精品课件第03讲、脚本参数化和多Action脚本
• 11、运行脚本并观察结果
小结
• 录制一组测试用例数据,参数化多组数据,运行时使用参 数化数据对软件进行测试,提高测试效率 • 从运行过程和运行结果不易判断程序是否正确——需要进 一步处理 – 设置检查点(检查点也需参数化) – 建立输出值
检查点参数化
• 实例2:为实例1中的结果建立检查点,检查每次反复的结 果是否正确 – 准备工作
• 3、弹出“Value Configuration Options”对话框
– constant
• 把第一个数文本框设置成常量值
– parameter
• 对第一个数文本框进行参数化 • 取值:
– Data Table:使用Data Table中的数据进行参数化 – Environment:使用系统环境变量进行参数化 – Random Number:使用任意数据进行参数化
• 4、找到“text”属性,点击“Modify”按钮
• 5、弹出“Output Options”对话框 – Output Types:输出值类型
• Data Table:输出到Data Table表格 • Environment:输出到环境变量
– Name
• 输出值在Data Table中的列名
自动化工具
第03讲、脚本参数化和多 Action脚本
本章内容
• • • • 脚本参数化 输出值 在脚本中使用多Action 多Action脚本的参数化
一、脚本参数化
脚本参数化的概念
• 参数化就是一张包含多组数据的参数表,使之替换录制的脚 本中的相应常量值,这样,在脚本运行的时候,就会使用参数 表中的数据来代替录制的常量值 • 由于参数表中包含了多组数据,所以执行测试时,会多次自 动运行脚本,每次使用不同组的数据来代替脚本,这个运行次 数就是参数表中的记录数,而在Mercury的测试工具中,每执 行一次测试,称为一个反复(Iteration)。
06C-QTP数据驱动参数化
1.QTP数据驱动数据驱动的测试方法要解决的核心问题是把数据从测试脚本中分离出来,从而实现测试脚本的参数化。
从而扩大覆盖面和提高灵活性。
2.使用DataTable 实现参数化在QTP中使用Data Table 视图来编辑和存储参数。
路径:选择测试步骤的value列\ <#>Constant 常量Paramter 参数化Name :datable中的列名Global 参数存放在公共的Data TableCurrent 参数存放在当前action的Data Table解决方案的二个方法。
1在代码中前加Wait 2 systemutil.RUN”D:\Program Files\HP\QuickTest Professional\samples\flight\app”2方案;;;;判断Dialog(""Login)Activate...,,,第二种解决方案If not Dialog("Login").Exist Thensystemutil.Run"D:\ProgramFiles\HP\QuickTestProfessional\samples\flight\app"End IfDialog("Login").ActivateDialog("Login").WinEdit("Agent Name:").Set DataTable("username", dtLocalSheet) Dialog("Login").WinEdit("Password:").Set DataTable("passwd", dtLocalSheet) Dialog("Login").WinButton("OK").ClickWindow("Flight Reservation").Close2.使用随机数randomNumber 实现参数化3.拓展:数据表格DataTable 迭代方式对应每一次运行时,DataTable的迭代方式可以进行设置。
软件测试工具QTP参数化global和local的区别
软件测试工具QTP参数化global和local的区别软件测试工具QTP参数化global和local的区别Mercury QuickTest 企业级自动化测试工具! 目前已经被惠普收购,正式名字为HP QuickTest Professional software ,最新的版本为HP QuickTest Professional 10.0. HP QuickTest Professional 提供符合所有主要应用软件环境的功能测试和回归测试的自动化。
采用关键字驱动的理念已简化测试用例的创建和维护。
它让用户可以直接录制屏幕上的操作流程,自动生成功能测试或者回归测试用例。
专业的测试者也可以通过提供的内置脚本和调试环境来取得对测试和对象属性的完全控制。
global 是全局的!有几行数据程序就要回放几次!!不能重新设置!!local 是局部的!有几行数据action 就要回访几次!!设置action的重复次数的操作:反击action,选择action call property,即可进行选择.下面有几种情况:1.当global 有不止一行的数据,action call property->Run On all Rows 程序每次运行时,action中的每行都要执行2.当global 有不止一行的数据,action call property->Run one iteration only 而且global的行数>action的行数,当action执行到最后一行后,不管此时global 的行数为几,下次回放时action都执行最后一行! 如果global的行数<action的行数,action就执行不到最后一行3.action call property->Run from rows to rows,就结合上面所说的理解吧!!。
自动化测试(三):QTP参数化
⾃动化测试(三):QTP参数化1 Datatable参数化Global表的数据可以被所有的action访问,Action的数据只能被对应的Action访问本地表循环的次数设置:Action Call PropertiesGlobal表循环的次数设置:File -> Test Settings -> Run注:① Global全局变量循环⼀次,本地Action表全部运⾏⼀次②删除表的内容:Edit -> Delete③修改列名:⿏标右击对应的列Example4:Flight程序登录验证Data Table:username password errmsg1mercury Please enter agent name2mer mercury Agent name must be at least 4 characterslong3mercury Please enter passwoed4mercury mercury nullText:dialog("Login").WinEdit("Agent Name:").Set datatable("username","login")dialog("Login").WinEdit("Password").Set datatable("password","login")dialog("Login").WinButton("OK").Clickexpected_result = datatable("errmsg","login")If dialog("Login").Dialog("Flight Reservations").Exist Thenactual_result = dialog("Login").Dialog("FlightReservations").Static("errmsg").GetROProperty("text")if expected_result = actual_result Thenreporter.ReportEvent micPass, "登陆验证","输⼊错误的⽤户名和密码,弹出正确的提⽰信息!"elsereporter.ReportEvent micFail, "登陆验证","输⼊错误的⽤户名和密码,弹出错误的提⽰信息!"End ifdialog("Login").Dialog("Flight Reservations").WinButton("确定").ClickelseIf expected_result = "null" ThenIf window("Fight Reservations").Exist ThenReporter.ReportEvent micPass, "登陆验证","输⼊正确的⽤户名和密码,登陆系统成功!"elseReporter.ReportEvent micFail, "登陆验证","输⼊正确的⽤户名和密码,登陆系统失败!"败!"End IfelseReporter.ReportEvent micFail, "登陆验证","输⽆效的⽤户名和密码,系统没有任何响应!"End IfEnd IfPractice2:Agileone⾃动登录验证Data Table:username password errmsgadmin出错啦: ⽤户名不能为空 ...adm admin出错啦: 找不到该⽤户名 ...admin adm出错啦: 密码输⼊错误 ...admin admin nullText:Browser("AgileOne - Welcome to").Page("AgileOne - Welcome to").WebEdit("WebEdit").Set datatable("username","Action1")Browser("AgileOne - Welcome to").Page("AgileOne - Welcome to").WebEdit("WebEdit_2").Set datatable( "password","Action1")Browser("AgileOne - Welcome to").Page("AgileOne - Welcome to").Image("loginbt").Click expected_result = datatable("errmsg","Action1")If Browser("AgileOne - Welcome to").Page("AgileOne - Welcometo").WebElement("errmsg").Exist Thenactual_result = Browser("AgileOne - Welcome to").Page("AgileOne - Welcometo").WebElement("errmsg").GetROProperty("innertext")If expected_result = actual_result Thenreporter.ReportEvent micPass,"登陆验证","输⼊错误的⽤户名和密码,提⽰正确的提⽰信息!"elsereporter.ReportEvent micFail,"登陆验证","输⼊错误的⽤户名和密码,提⽰错误的提⽰信息!"End IfelseIf expected_result = "null" ThenIf Browser("AgileOne - Welcome to").Page("AgileOne - Power toAgile").WebElement("wellcome").Exist Thenreporter.ReportEvent micPass,"登陆验证","输⼊正确的⽤户名和密码,登陆系统成功!"Browser("AgileOne - Welcome to").Page("AgileOne - Power to Agile").Link("exit").Clickelsereporter.ReportEvent micFail,"登陆验证","输⼊正确的⽤户名和密码,系统登陆失败!"End Ifelsereporter.ReportEvent micFail,"登陆验证","输⼊⽆效的⽤户名和密码,系统⽆响应!"End IfEnd If2 Excle参数化利⽤datatable对象导⼊Import:将指定的Excle的所有数据导⼊,第⼀个sheet导⼊Global,第⼆个导⼊Action1,以此类推ImportSheet:可将指定的sheet页导⼊到指定的表中,第⼀⾏默认导⼊为列标题QTP只⽀持Excle2003,将Excle另存为Excle2003Example1:datatabe.ImportSheet"C:\123.xls","Sheet1","Action1" (在代码开始前加⼊)通过环境变量环境变量设置:File -> Setting -> Environment -> Variable:User-defined 添加环境变量,⽤户定义的环境变量,需要⾃⼰定义变量名和值,定义好后就可以⽤这些变量去参数化脚本中的常量。
跟我学HP QTP功能测试工具——如何设置检查点和测试参数化
1跟我学HP QTP功能测试工具——如何设置检查点和测试参数化1.1设置检查点和测试参数化1.1.1设置检查点1、检查点的主要作用——实现测试验证的自动化在一个自动化测试中如果没有检查点,那这个自动化测试是没有多大意义的。
自动执行脚本,我们要通过检查点的验证结果来查看每个测试点是否达成了预期的结果从而验证测试结果的正确性。
因此,验证点是自动化测试过程中的关键——因为如果只是实现了测试执行的自动化,而没有实现测试验证的自动化,这并不是真正的自动化测试。
因此,可以通过提供和设置检查点实现测试验证的自动化过程。
当添加了一个检查点时,UFT会将检查点添加到关键字视图中的当前行并在编辑器视图中添加一条“检查检查点”语句。
2、“检查点”进行验证的主要实现原理在UFT中应用“检查点”进行验证的主要实现原理是将对象的指定属性的当前值与该属性的期望值进行比较,而在运行测试脚本时,UFT会将检查点的期望结果与当前实际的结果进行比较。
如果测试结果不相匹配,检查点就会失败、并且在“测试结果”窗口中都可以查看到对各种检查点的验证结果信息。
3、UFT中所支持的各种形式的检查点在“设计”主菜单内的“检查点”子菜单内提供有插入各种形式的检查点的功能子菜单项目。
4、添加标准的检查点(1)主要的作用通过向测试脚本或组件中添加标准检查点,可以对不同版本的应用程序或网站中的对象属性值进行比较。
可以使用标准检查点来检查网站或应用程序中的对象属性值。
标准检查点将对录制期间捕获的对象属性的预期值,与运行会话期间对象的当前值进行比较。
(2)添加标准的检查点可以在录制过程中进行添加或录制结束后,向测试脚本中添加相关的检查点。
只需要在“Active Screen”活动屏幕窗口中点击列表中的需要添加检查点所在某个测试步骤所在的位置,右键点击菜单中的“insert standard checkpoin”插入标准检查点子菜单项目,将显示出如下的插入选择点的类型的弹出菜单。
qtp实验6
QTቤተ መጻሕፍቲ ባይዱ 测试参数化
1.1 实验目标 (1)掌握测试脚本的参数化。 (2)体会数据驱动的测试。 1.2 任务描述 1.3 覆盖的知识点 (1)数据表的操作。 (2)参数化。 (3)数据驱动的测试。 1.4 实验参考步骤 一、参数化操作 打开实验 5 中保存的测试脚本。在 QTP 窗口底部的数据表,ActionB 测试 有四个选项卡:“Global”“CopyofFlightOrder”、“Sign_in[ActionA]” 以及“ReturnHome[ActionA]”。“ Global”选项卡是一个数据表,其中的数据用于整个测试。如果“Global” 表中显示有五行数据,则测试将运行五次。此外,可以使用相关操作表为每个操 作创建数据集。如果使用操作参数对步骤进行参数化,并在相应的工作表中输入 在实验 5 的基础上,对测试脚本进行参数化。
五行数据,则此操作将在每个测试循环中运行五次。 将为“FlightOrder”操作创建一个数据集,以检查应用程序如何在单个用 户会话中处理多个订单。具体步骤如下: 打开 ActionB 测试。 选择要参数化的步骤。 在关键字视图的“toPort”行中,单击“值”单元格,再单击参数化图 标,选择“参数”,并确认选择了“DataTable”选项。 在“名称”框 中,键入 ArrivalCity。选择“当前操作表(本地)”。单击“确定”关 闭“值配置选项”对话框。 参数化其他步骤。 一个客户在同一天飞到两个不同的地点,这不太符合逻辑,因此对出发 和到达时间进行参数化非常有意义。在关键字视图中,选择 “fromMonth”。使用前一步骤中的过程来参数化出发日期。 确保选择 “值配置选项”对话框中的“当前操作表(本地)”。在关键字视图中, 选择“toMonth”。 在数据表中输入参数化数据。 “ArrivalCity”列的第二行键入 Portland。按 Enter 键。在出发日期 和抵达日期列的第二行键入 Oct 。 将操作设置为在本地数据表中运行所有数据。 默认情况下,QTP 仅运行测试中的每个操作的一个循环。想要 QTP 使 用“CopyofFlightOrder”选项卡中的所有数据。 右键单击关键字视图 中的“Copy of FlightOrder”操作并选择“操作调用属性”。将打开
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
qtp参数化QTP参数化方法一、DataTable方法这是QTP提供的一种方法?也是最容易实现参数化的一种方式。
QTP针对DataTable对象提供了很多方法?可以对DataTable进行灵活的操作。
DataTable分为Global和Local 两种?Global所有的Action都可以用?而Local就是只能Action自己用。
通过DataTable做参数化最直接的方法就是在Keyword View视图下通过选项进行?这样即方便又减少出错的几率。
单击要参数化项目的value列?选择出现的箭头弹出Value Configuration Option对话框?在这里可以很方便的进行参数化。
<imgsrc='data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQ ABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLD BkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/ 2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjL/wAARCAF0ARwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAE CAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1d nd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4Tl5ufo6erx8vP09fb3 Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8Q AtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkN OEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiIm KkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP 09fb3 Pn6/9oADAMBAAIRAxEAPwDmdMtP HmsWtrdWOpahLBdTvBBs1T NEd9n3/k RKyJvEPiGCd4X17Ud6Ps S9d0/7731veEPGNtofgbW7G XYL4P52mXv3rK6eS7o/8GxP61Y8O3vg5/BFxYaq1lDqLpc4nmt28zf8 nkvuRHP/AKB/uP8AfPrczW8DkM3UZfFuk2ttc3mr33k3m/yZ4dT85H2ff49Z/8Awkuvf9BrUf8AwKet/WLzTF8H HbKy1myuL3R5JpHTyZ9km bemzemxn8dbOvar4Kv8AT45beKzRf7Sgufs8Nn5M/wBm2J5kO9I8b9 / P8A4HTUn1gI41PEOvf9BrUf/Ap60dOu/FWrRzyW2p33kWyb5 55r3yUT/gbvsqfxpe6JqFzbNosFlHHG8wZ7VHTem75PMTyURP8Ax m HryTw14g0e5uUtJ75LYwTOjunyPv/g3vWl37PSADdQv/E2j3 81hfajqEVzEMugut f/ABqqa9rX/QX1H/wKet7w1deGNM1PUILqaC6j3w/Zrm6s9yui P8Avvk f76fc/8AZK19F1Xweum Rcpp4ie/mfyZ7N2mS2dH2Jv2ff37P4/ Bms a32AMKxk8T6havew6jdJao zz5tQ8lN/9z53qB9U1pIIJn1e62Tfc2Xu9/8Agab/AJK2YdRs YPAEmkJqenvdpePLsezkffHs2ff2ff8AmlU9Xm0ubwxoSW09l/aMSOl15Ntsd/7n8Hz7KLu/wAAGe mt6v8A9BS9/wC/71Omt6v/ANBS9/7/AL13OtW9tottbSx6dpUunQ3EJmnNsjSToyD/AFO5Pn/ j/jd fvUz 0/Cv9p2Fx52lfZoXuftMf8AZz/vEd/3I/1P8HyVCq32gHIcYmt6p/0FL3/v9WrbUdaut/k3WozbE3vsd32J/fq3p2pafJ4inl1JNP8gxzRw RbbId/8HybP/Q0etaLWNGsfEeqfYbi2j0 /s2WKQ2uFhf/AG9yfc/T7lOb/uAYUOo6u8Dz/wBqT7E/vuvn/74/joTV9U/6CF1/wB/3q3YtpqeHtWt7m7s3uXZRZN 5D7zsxvO/Z/Hj9au2N7oSeFZIJoYvtnkzb/3PzvNvTyXR/wC5Rf8AuEGUm qah/wBBC6/7/vVq0u9XvblLa2urqaZ/uJ571t6lc6BcaI8aXFib1LeLZJFaun75Dl/4P4 lZPhjUIdM1 zvLguIUEm8oP8AYov7nwFjriTWrLyHmup9k33HS63o/wDwNKLe61O5mSGGe9md/wCBHd 66LRWtL270TSlMN/HbJcfan8ksgD8p99P9yq9vqNjpviu0lVYlVITDeOkOweds Z1TCs1U6cgGRDdahPv2Xr/ACJv efZQmo3v/P1P/33V/TJ LBJ9SS8uLSRJonSFxC/D/wCx8nyVNolzo8Nk6X0aSOH fem/emz7if3H3/7lXf8AuEGcl7e/8/U//fdTJe3X/P1P/wB91sW9xo76NDBcvaGf7M0byfZn37/4Pn 2VDPdWU2iRput0uURE2QQ8N/wPZ8j/APA6nm/uFlFL26/5 p/ 6el1df895/6qpT0rfkgY85eS6n/57v/33T0up/wDnu/8A33VVKkSo5IFc5aSef/nu/wD33T0nn/vv/wB91AlSJRyQI5y0k7/33p6O/ wDfeoEqRKOSAc5dtv311Aju/wA77Kil1PS4NXh0ueWVL6dZJIEdvvhPvhH2fOVLY/8ftr/AL6VyvivTYPFph0y51Czh0XHnzSRyI9y7/wIm/7n /8A8ArixPus6qPvmlc I7G502C90qRrmJ7xLLzpGT7 x9nyfP/AL9eb/ET/ka3/wCuKV1zyTRaDpdheXFhLNbajAkbWZ2K0CP8j7P4P9yuRIn/I1v/wBcUrOPwmkviOn/AOFPeHv f3VP0/ Io/4VFoP/P7qn/faf8AxFegUVP1qt/Oa zgcF/wqXQf frUf 0/wDiKP8AhVGhf8/Wo/8Afaf/ABFd7RR9arfzh7OBw3/Cq9B/5 tR/wC 0/8AiKPFX6L/wA/Wo/99p/8RXc0UfWq384ezgcT/wAKv0X/AJ tR/77T/4in/8ACstF/wCfrUf 0/ Irs6KPrVb cPZwOM/wCFbaR/z9Xv/faf/EVJ/wAK50j/AJ r3/vtP/iK6 ij6zW/nD2cDkPFe6R/wA/V7/32n/xFP8A EA0j/nve/8Afaf/ABFdZRR9ZrfzhyQOT/4QDS/e97/AN9p/wDEVJ/wgel/8973/vtP/iK6iij6zW/nD2MDlv8AhB tL/wCe91/32n/xFSf8IVpf/Pa6/wC 0/8AiK6Wij61PcPYQOa/wCEN07/AJ73X/faf/EVJ/whun/89rr/AL7Suhoo9vMPYQMH/hENP/573X/fxKP EUsve91/wB9pW9RR7eYewgYn/CL2X/Pef8A7 Uf8I3Zf35/ 626Kj28w9hAx/Eesv78//AH3R/wAI9a/3562KKPbzD2EDL/sG1/vz0f2Ja/35 61KKPbzD2EDO/siD 9H9lwf33rRoo9vMPYQKP8AZcH996k/s6H9WqKPbzD2ECr9iT 9P yp/t1PRR7eYewgQPawvG6Om9HR0es7/hGtF/6Bdl/34Stiij28w5IGWnh7SIJEdNLtUdPnR0g SvLviL/yNj/8AXFK9lrxb4k/8jhL/ANcU/lR7TnDkPaaKKo6lqMGl2qTzI773 RESBN7u71BoXqKoQXOpNdpBf6HdWfnb9j70mT5P77p9ypb9TT7J7qaOR/nRESP77u77ET/vt6BFqiqVlqD3jSRzWFzaP H/Dc7Of Bo7pV2gAoqG4uYbOFJrhyqO6Q/8Dd9ifPvU1ABRUMtxFbTW0MrFXuH8mHH8T7Hf/0BHqagYUU Vg6958 qaPZQ3t1bJdO 94H f7m gDeorB/4R6f8A6GHV/wDvn/xFH/CPT/9DDq//f8AT/4igDeorB/4R6f/AKGHV/8Avn/AMRR/wAI9P8A9DDq/wD3/T/4igCTUNQvLPXLW3trQ3 MElrNczBP9ciI8KfIn8f3z8n/fH9x9eGdLqBJ4XSaB03o6P8jpWToOnPp/xAsg oXt75mmXp/0qRXKfvrb0rO8TnTbXVoJtL1TVSl0qXM1vpMTyrtmf5blGSN16o 5Oj/f /8AfYjqqKwf Een/wChh1f/AL/p/wDEUf8ACPT/APQw6v8A9/0/IpDN6isH/hHp/8AoYdX/wC/6f8AxFH/AAj0/wD0MOr/APf9P /iKAN6isH/hHp/hh1f/v8Ap/8AEUf8I9P/ANDDq/8A3/T/AOIoA3qKwf8AhHp/ hh1f/v n/xFH/CPT/8AQw6v/wB/0/8AiKAN6isH/hHp/wDoYdX/AO/6f/EUf8I9P/0MOr/9/wBP/i KAN6isH/hHp/8AoYdX/wC/6f8AxFH/AAj0/wD0MOr/APf9P/iKAN6isH/hHp/hh1f/v8Ap/8AEUf8I9P/ANDDq/8A3/T/AOIoA3qK52bQZ0gd/wDhIdXRP8Anun/AMRXSzIiOiJ/cT/0CgQyvFviT/yOEv8A1xTVe014t8Sf Rwl/64p/KlAZ7TVSW0ml13SL HY/2Kd96OzCOjpVuimBu3V0iR8hh/H852VwviueKDRUeW6toSlzbTJ5 06Q79kyPsTf8Ax/JW7RQI4xtVi8WwLJb2sN7Z2dyklzpwub aZ5k2P/Aj7PvbJPnf B/7ib6R8K3b2mqTNZAXIsM6Ynm/8esnnXLoifwI6I8Kb/wCDB69AopgcVfaBc3U phtJR45poZXDzJJ9pRJlk2f7fyL/wAtvufcR9j/ACZ/iHQdZvNQ1CW20b7VdLdQvLD9mSGeF4HSFN/ uf/AJYff Tf/wAAr0WigDj5fDksXiC1uLexRtNimtrpk3j55tlyjTAP95xvhfe/z/J/G/Xs KKKQBWDrH/Iy Hf u8//AKIet6qNzpf23VNOuvtSQpZO77H/AI96bKBifa28yGDzf3/mTb0 2b9gTztn/AKAlQC7lkt4mS ijjw 6eR0X59x9jo/3/7lbuz5Nn21Nn/A6P40f7am9P8AfoEULVnZZHmf e4dE 5sRP3KP/v8A8dWKndN/37pP/H6j8lPfqD/AMfoAyNQ0aPUNVtrqed1iihmhlt0HyXCO6Psf/YT7n8f 58j4yldH1e2tQR6m8mGHo9xZzfwJ/z0e2f/gCQt712Hkp/wA/UH/j9Hkp/wA/ UH/j9ADKKf5Kf8/UH/j9Hkp/z9QfP0DGUU/yU/5 oP/AB jyU/5 oP/AB gBlFP8lPfqD/AMfo8lP fqD/AMfoAZRT/JT/AJ oP/H6PJT/AJ oP/H6AGUU/wAlP fqD/x jyU/5 oP/H6AGUU/yU/5 oP/AB jyU/5 oP/AB gBlFP8lPfqD/AMfo8lP fqD/AMfoAq3PyWs/ 5Vq5/1//AE/9AomtUeB0 0wpvT/AG6Lh0eb5H3/ACJ/6BQIZXi3xJ/5HCX/AK4p/Kvaa8WJP8AyOEv/XFP5UojPaaKKKYBRRRQAUUUUAFFFFABR RRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAV4t8Sf Rwl/64p/Kvaa8WJP/I4S/8AXFP5Uoge00UUUwCiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigArxb4k/8AI4S/9 cU/lXtNeLfEn/kcJf8Arin8qUQPaaKKo6hqlrYukMm a6m 5awpvd/AUwL1FUbDUYNR89ESeGeHZ58E6bHTf8Ac303UdZs9 MmhhuftLzTI7IkNtNM xNm/7if7aUAaFFQWd1Be2qXVs9HqegAooooAKKZDOl1Ak8LpNA6b0dH R0p9ABR RWJrl3ex3unWttdfZfP87fJ9l85/kTf9zP7lAG3RXmKfEK0dVP/AAlE6b9mA jLlPuf9Nv9uT/vh/8AY3ifEK0dVP8AwlE6b9mA jLlPuf9Nv8Abk/74f8A2N9 xn/IZ88D06ivMU IVo6qf EonTfswH0Zcp9z/pt/tyf98P8A7G8T4hWjqp/4SidNzAfRlyn3P8Apt/tyf8AfD/7G89jP QOeB6dRXmKfEK0dVP/AAlE6b9mAjLlPuf9Nv9uT/vh/8AY3ifEK0dVP8AwlE6b9mAjLlPuf9Nv8Abk/74f8A2N57Gf8AIHPA9OorzFPiFaOqn/hKJ037MB9GXKfc/wCm 3 3J/wB8P/sbxPiFaOqn/hKJ037MB9GXKfc/6bf7cn/fD/7G89jPQOeB6dRXmKfEK0dVP8AwlE6b9mAjLlPuf9Nv8Abk/74f8A2N4nxCtHVT/wlE6b9mAjLlPuf8ATb/bk/74f/Y3nsZ/yBzwPTqK8xT4hWjqp/4SidN zAfRlyn3P m3 3J/3w/ xvEIVo6qf8AhKJ037MB9GXKfc/6bf7cn/fD/wCxvPYz/kDngen UV5inxCtHVT/wlE6b9mAjLlPuf8ATb/bk/74f/Y3ifEK0dVP/CUTpv2YD6MuU5/02/25P8Avh/9jeexn/IHPA9OorzFPiFaOqn/AISidN zAfRlyn3P m33J/3w/8AsbxPiFaOqn/hKJ037MB9GXKfc/6bf7cn/fD/AOxv PYz/AJA54Hp1FeYp8QrR1U/8JROm/ZgPoy5T7n/Tb/bk/wC H/2N4nxCtHVT/wAJROm/ZgPoy5T7n/Tb/bk/74f/AGN57Gf8gc8D06ivOtL8ZR6tqFtYW3ieRJrl0SMT aSqHe z/AKbf7Z/74f8A2N/W/wBieIU /wCJ7JP4d/9nUThyfGBsUVzOrw69pGj3Wo/8JHazeSm/YmnffrqZk 2bE/2E/wDQKCxleLfEn/kcJf8Arin8q9prxb4k/wDI4S/9cU/lSiM9prBvNK1W9k15N PvPsN5c2caWWoZOy2 f503/AMG//YvZK3qEd0fej7HpiItFtb7T/CthaavenUNQiiKTXB/if8A9m2cJ v8A65rD1fT7q98T6W9tdXVmiWVzvntUR/44fkdH/yldC7u773fe9Z9/oWk6pN51/pNleTImzfPao77KAOS8S 22o6XamHS2vQ0FvJdQSxQ3Ezz3Ls7uGSF0SP8AeD NNv7wjZ8j0 8jv104LK oxLNf3s0lyReTun750hTZC6PsdOn8Hyf7ddpaWVtp9sltZ20NtCn3IYU2IlTUAef6ba6xfG0n1B9Y V7m5hS6/0iaHan2BHf8AdoP3f77NP8Ac9qj04 I7q/sLmub2G5dbWQQmxm2OmxPO3/ADpCnzf99N/9z/lnXolFAzzeOz1uDTdJs4ri s/s9jDFFGltPP/AKV8/7jomM7Nnnfuf7nyb67Hw/BMlldPc/avOfULl/37v8Ac859mz f/AAbNla9FAgrnPEqB9R01GTeHivPk2b9/jP/AAbH/wDQH/3K6OsvVNFk1e sS7qlqi3KTbtv8cLp9xvk f79MDyC7vbu8vX0u8u5ZdKi0GGYQyN5hf7ChR8fwfvdgz/t7f48U/w34c02WfThcOh1GOWzuZrZ 28xGhmmhRPk8kIPkmT/lo/8Auf3O5k FQubKCxvPFp3NtCYykLsgRCmz7i7/l/5a/Ten9z50T4VE6YmmN4v1OTT/k32yOgh/gf7m/8A3/8AvtP7nz931iNrHJ 7KR5taaJpt9p087zPaXM0FzeWCNNvd4YVfqiQ7D/qnT76f7n992s3mr69ZeF7B9Qu7t722ysM1zu3 z/aZkTO//AL4r0yP4YTRwzxf8Jlq3kXLZdIkiIkzvs37xv8A4/3n/faf3Pnpj4L2TRQpN4iupFgTYMomE T5N z5vk/5bf99p/c fRYmIexkclFpvh/T9E1C/tJZr2wms3hkihuTvDpc2fR3gTn8H/2Dk8P6Y2i2y3dy8WnWrzX XfD7JobHYhdUf8A57ff2fwfwfw9nw81ATwzSePNdaZEKb/ALVh9vyb/wCP/Yk/8c/ufPTi FfkXSXP/CX6oLhJHm86N0Rt7 Xvf7/8ex/0/ufPn9YiX7I8c1y1gstSkgtpXltgiOjyIyHY6bv40T 997Ym s 2vbHC1jPIZrnxFdTXLvvmk2pud/k3/x/wDXb/vtP7nzxJ8EdMITdr k7n5N5RIR/c/2/9/8A77T58/QsbBIzdGZ4xRXs6fBHTCE3a5O5TeUSEf3P8Aa/3/APvtP7nzifBHTCE3a3O5 TeUSEf3P9v/ AH/0/ufPX12iHsZnjFFezp8EdMITdrc7n5N5RIR/c/2/8Af/77T 584nwR0whN2tzufk3lEhH9z/b/AN//AL7T 5859doh7GZ4xRXs6fBHTCE3a3O5 TeUSEf3P9v/AH/ 0/ufOJ8EdMITdrc7n5N5RIR/c/2/wDf/wC0/ufOfXaIexmeMUV7OnwR0whN2tzufk3lEhH9z/b/wB//vtP 7nzifBHTCE3a3O5TeUSEf3P9v8A3/8AvtP7nzn12iHsZnjFFezp8EdMITdrc7n 5N5RIR/c/2/8Af/77T 584nwR0whN2tzufk3lEhH9z/b/AN//AL7T5859doh7GZ594AcL4/0Mbgo 2Lxv2dv99P8/wAD/cr2zxra 6/c6fv8ADepG2v4URzA6I6TfJ9z5/uViaF8KbLQ9csdRg1a eW4tmjfbsRA5 T 4/ /8A99p9/Y /oZk8XSPv8jQU/wC31/8A4ivPxU/bT54G9GHLExdUtdTsvh 7fJrGpm/1Dyd80xRET/cTZXY3P v8AAJ/6BXM6ppPirVdLnspo9FRJk2b0vJK6a5/1/8AwBP/AEC uY1GV4t8Sf Rwl/64p/Kvaa8W JP/ACOEv/XFP5UojPaaKKKYBRRVW 1Cy0yye9v5khtUdEd3 4m99lAFqioUuYXvZrNH/fQokzp/sPv2fgPU1ABRRRQAUVi2elPrniXV4G1fUbaK2jhMaWrIv39/wD fT/YrZ/4QRP8AoY9e/wC/6f8AxFHIIWisGfTNNg1mPRjr/ik3rn5EW3d0blMvvEBTaN6fP/B61u/ 8IGn/AEMmvf8Af9P/AIijkIFoqqfCFvHcpaN4m1vz3jd0T7RFvdVI3f8ALPp86/8AfdWfEDT/oZNe/7/AKf/ABFHIAtFJ/wgaf8AQya9/wB/0/8AiKP EDT/AKGTXv8Avn/AMRRyALRSf8ACBp/0Mmvf9/0/wDiKP8AhA0/6GTXv /6f/EUcgC0Un/CBp/0Mmvf9/0/ Io/4QNP hk17/vn/xFHIAtFJ/wgaf9DJr3/f8AT/4ij/hA0/6GTXv/wCn/wARRyALRSf8IIn/AEMevf8Af9P/AIioJ/BflIjp4k17j/pu n9z/AHKOQssUVjf8I2v/AEMeu/mlR6dbNY LY7L 09QvIfsE03kyIfnz/sUAbtFFFAwooooAKKKKACiiigArxb4k/8AI4S/9cU/ lXtNeLfEn/kcJf8Arin8qUQPaaKKKYBWN4osl1DRUtWtjcx PeWe EJv3p9pTf/45WzVW/wBPstTg8m/srW8gR9 yeBHTfQBykFtqthd63G1vcyVYWdrBelm3TJvm3OSp370R UT532fJs3pWTFFrjQX4jn1eZLK3vZLJxDcw Y y2dPld98nzd8j7/AOOu7sNC0nS5vOsNJsrOZ02b4LVEfZWhTEef6lb6 pbXf2RLnUYtIhunRXMdzcyN 5hdBvhdJn d7nPZ/wCOV2GkF1s1Ny1y16UT7U0ybN77E/4B/wB8fJ9 tCigDlb2f7NdeJD511Chm0lHe2Z0l8t7nYzZ8/3P7ldf4U877JqH/H9/Z/2k/YPtvmed5Xlpv3 b 8z53nff9v4NtU9NsIYNS1G8ufs8qXfkbInXhPJ4/Cf3//AECr2oWHh/V51udT0bSryZU2o93CHfZ/wNKoglubeaTxtplzHE4ij028jeTb8qu8lsUB/wC G/75rjp4tf8A7Z1aS8vNb6XvnW9hZy7hbbX8nyZXk8nfjydvlJv3Y3/x13NveWtpbrbW0VvDDC m1I13oiJ/3xU39sL6Q/wDfb/8AxFAHHaLZ6y/iqxv9dSc30X2uCV7XzvsgkdLYoIc8 T5aPnf8vnb yvRay/7YX0h/wC 3/8AiKP7YX0h/wC 3/8AiKANSisv 2F9If8Avt//AIij2F9If8Avt//AIigDUorL/thfSH/AL7f/wCIo/thfSH/AL7f/wCIoA1KKy/7YX0h/wC 3/8AiKP7YX0h/wC3/8AiKANSisv 2F9If8Avt//AIij 2F9If8Avt//AIigDUqjqP8AqB/wP/0B6h/thfSH/vt//iKzdXuLqsTDp99b2k /wD1rwNN8lAHCX3grUb7xVHexeJtVh0hvnms47ybO/8AuId/yJ/n/c3IfSgp/2CJ/8A0NKT yNe/wChqsv/AAX1LpuiXVvrf9p6jrEV2/2Z4URLV0/UFmnRRRQMKKKKACiiigAooooAK8WJP/ACOEv/XFP5V7TXi3xJ/5HCX/AK4p/KlED2miiimAUUVB5kz3DxwpBsSNC7zyOn39/wDsf 7FAE9FYmt7/AO1fDW/Zv/tF/uP/ANOs9Vtd1q9sptRFt9mMOmacmoTJOju8yfP8ifP8n p/wDP/rKAOkorm4tekSKfU7y4tIdNjnuYfKdH85PI8zL7/wCP/Uu zZ/6B8 TDrGt3et6Zpt5G1nPHeJII9gmheG5 TYk7/88f7/AKfJ8nzgjuqK4fRfEl3PolnexwWcNpBJZWzW0cT/AH5o4fmR9/yInnD5Nj /c/LS8O63qeoDTDqSwA6jYC9SO1D4h2CHr/f3 d/wD/b/QB01FcMniHUoY9Ze2trCC300TXjpsbdOEublCmc8F/JHz /3z9x9/ya2r2FlqfivSbe/s7W8gSwvJPLnhR0377amB0dFcfDqoJo9rDp/m3N3NLcvD5kPnb7ZJdiPl5k/geH59/z7/wCOqum INQvbK/vYMme ubb z7Yxbsd7OGZ0/1iIfk3/3P4/7 ygDuqKxdKnXxF4fzqthA5d3h mtpUR0EiTOn3Pn/uf7dYujOmjfD/AEZdItYlvL22hKqlsknnT eTvf NP4Ef OkB2lFeeW uavJPquubLeGSz0xPtNtPFvabyZrxPkdHT7j/AN//AIH3S28Qarp6XkOnWMc0FlLc3N08hTZse8uflLv Mmz7n3/n/APi2B6JRTHS6/gy7P8Abnf/AOIqPy7r/py/7/v/APEUhk9FQeXdf9OX/f8Af/4ijy 7r/py/7/v/APEUAT0VB5d1/wBOX/f9/wD4ijy7r/py/wC/7/8AxFAE9FQeXdf9OX/f9/8A4ijy7r/py/7/AL//ABFAE9FQeXdf9OX/AH/f/wCIo8u6/wCnL/v/wD8RQBPRUHl3X/Tl/3/AH/ Io8u6/6cv /7/wDxFAE9FQeXdf8ATl/3/f8AIply91a2s87/Yn2Jv8Aknf/AOIoAtUU ZNk7p/cemUAFeLf En/kcJf uKfyr2mvFviT/wAjhL/1xTVKIHtNFFFMAqCH/j7vf8ArnD/AO1qnqCH/j7vf ucP/ta gQy/0 y1ODybytbyBH37J4EdN9Q/wBh6VGluiaVZ7LR99t/oyfun6/J/cq7M 6QQO7/cRN71y39tXM9zpq3Gt6dpV3qq7tP02SPeJo/4C79U39P/ALP5KAOiT T7JNQe/SztUvZk2PdJCm90/36gtNC0mzR0s9Js7ZGdHfybZE3un3K0RDNDHGlzs87y/n2fc3/x1i2 q3t7M8ltpsT2Edy9tv 0/vspJ5bvs2bMb0/v/AHPKALqaTpkdzDcpYWyTWyeTDN5Kb4U/uJU0NlaweR5NrA nkp5EGxPuJ/cT/vhKz7PxDZTIn2m6tbOea6mtYYZp03zOkzp8nf46NI8QWerTT2yXNsl7DPMj2qTI7oiTOm/Z/n79Ay7/Z1 lsnT7Fa Xcpsn/cp86fP9/8A77f/AL7pl/pGmavs/tPT7W82fc 1QI yqv8AwkFlNJp/2C6tb G8untfOhmR0STyXf8A9k/8fpr61a6RZag/mQTXVtZPe/ZfP2O6JQBav8AT7LU4PJv7K1v IEffsngR030x9I0ue1 yvp9q8DokPkSQJs2J9xP AUj6vpaWs90 oWqQWz RPP56bIX/ALj0r6vpkP2XfqFqn2z/AI9d86fvv9z /wDfoAntLK202S2s7aG2hT7kMKbESo5dOspdO/sWytnstiJ9leFNmxP9imadqdtq0M727EeTdTWzxnB0fZV2gDLTw3oUbQsmjaejW3ML/AGVP3Pz7/k/4HU0uj6 XM8Dzafau8DvNA8kKfI7vvd0/4HV6igAooooAKKKKACiiigAooooAKKK KACiiigAqrqX/IKuv uD/ gVaqrqX/ACCrr/rg/wD6BQBdu/8Aj9m/33plPu/P2b/AH3plAgrxb4k/wDI4S/9cU/lXtNeLfEn/kcJf uK fypRGe00UUUwCoIf Pu9/wCucP8A7WqeoIf Pu9/65w/1qBEkyJPA6P9x02PVGHwzom7S729s4rvUNIAS2uZVy6jjb9372zDd9evz1o1l3OvaRa3yWs2owJO/8G gDXuZ/PffXm13/kghFhK8NrqQ1CG9n0q8km2Pcc6Ink/J/v7/n2f7fyeho6Om9H3o9PoA4pvC2qC31eGE2pTV o5raZpHdPIR5pnRT5/kufufJ9yrCaJrUn7gy2lnHbXl5eWt1G/nPvm87Ydjp/B53 9/wDgrraKAOM07wzqcHiCHU5VihRZIXMf9oTXjYSG5T77p/02T/xrOueG7vU5dTSIWiQXNrMm9i4/fvDsT5Mff8A9v8AufJs 49dVRQM5DWPCs91qcdzZCBILVLVILaOd7X7n2lNm9Puf67/ AMc2VUm8ES7DFGsTx3VsYZkN/coiDfM//byf338ZT7n8G/5O6ooEZ2j2T6dBPA7o6PdTzo6f3Hd3/w DZ9laNFFAwooooAKKKKACiiigAoooo AKKKKACiiigAooooAKq6l/yCrr/rg/8A6BVqqupf8gq6/wCu D/8AoFAF27/4/Zv996ZT7v8A4/Zv996ZQIK8WJP/I4S/wDXFP5V7TXi3xJ/5HCX/rin8qURntNFFFMAqCH/ AI 73/rnD/7WqeoIf Pu9/65w/8AtagQXPn/AGWfyf8AX7Pk/wBrnhGx09PBlsgto1SeHddrIn33I ff tRU/7VP/foAdMk MKxpCsapGnlokf8AAn8H/jmyuR0nTdKmhfVbyC32/2ncql7IPLn/wCPl0RN/wB/ 4mz/gFdT9 s6bRdPe9fUEsrWHUHT/j9SFPOT5Nn36AOan8X3j2Ohm0l slvb6wguZleN3ELvNbJ9zf8Ac/fP/wB8U bxHrbTRwWdrDPLNcXuzZFv2RQy T9x5k7/AMe//gH。