
| 陈能技,拥有8年的软件测试和质量改进工作经验,曾任程序员、测试工程师、QA、测试经理、质量部经理等职务,具有丰富的测试团队组建、自动化测试管理经验,为多家企业进行软件测试培训和项目指导。精通自动化测试工具QTP、TestComplete等。已出版《软件测试技术大全》、《QTP自动化测试实践》、《NET软件测试实战技术大全》、《软件自动化测试成功之道》等畅销书。目前专注于软件自动化测试及管理领域,倡导实用主义测试理念,坚信“Seeing is NOT believing,Testing is believing” |
| 目录 第1篇 自动化测试基础篇 第1章 软件测试基础2 1.1 软件缺陷与软件测试2 1.1.1 软件缺陷与硬件缺陷的异同2 1.1.2 如何通过软件测试发现软件缺陷3 1.2 软件质量与软件测试4 1.2.1 软件质量管理在项目管理中的地位4 1.2.2 软件开发模式与软件测试4 1.2.3 软件开发模式与自动化测试5 1.2.4 软件测试能保证软件质量吗5 1.3 软件开发与软件测试5 1.3.1 软件开发与软件测试的对立统一6 1.3.2 测试人员需要的开发技术6 1.3.3 QTP自动化测试工程师需要掌握的技术7 第2章 软件自动化测试8 2.1 手工测试与自动化测试8 2.1.1 手工测试的缺点8 2.1.2 什么时候使用自动化测试9 2.1.3 自动化测试--你准备好了吗9 2.2 如何开展自动化测试10 2.2.1 选取合适的测试项目来开展自动化测试10 2.2.2 确定自动化测试介入的时机11 2.2.3 自动化测试工程师的知识体系11 2.2.4 考虑自动化测试的成本13 2.2.5 制订自动化测试项目计划14 2.3 自动化测试方案15 2.3.1 选择自动化测试方案16 2.3.2 自动化测试脚本的编写方法16 2.3.3 线性脚本的编写方法17 2.3.4 结构化脚本的编写方法17 2.3.5 共享脚本的编写方法18 2.3.6 数据驱动脚本的编写方法18 2.3.7 关键字驱动脚本的编写方法19 2.3.8 合理选择自动化测试脚本开发方法19 2.4 实用性自动化测试策略20 2.4.1 自动化测试工具的问题20 2.4.2 自动化测试的管理规范21 2.4.3 自动化测试中人的因素22 第3章 软件自动化测试工具24 3.1 自动化测试工具类型24 3.1.1 商业测试工具25 3.1.2 开源测试工具25 3.1.3 自主开发测试工具26 3.2 自动化测试工具选型27 3.2.1 测试工具评估27 3.2.2 测试工具试用27 3.2.3 自动化测试工具的培训28 3.3 自动化测试工具的原理28 3.3.1 基于代码层面的功能自动化测试工具29 3.3.2 基于浏览器和DOM对象模型的功能自动化测试工具31 3.3.3 基于GUI对象识别的测试工具原理35 3.3.4 反射机制在自动化功能测试工具中的使用37 3.3.5 UI Automation在自动化功能测试工具中的使用38 3.3.6 QTP对象识别技术介绍39 3.3.7 QTP的3类顺序标识41 3.3.8 QTP的智能识别技术介绍42 第2篇 QTP使用基础篇 第4章 QuickTest Professional的安装和配置46 4.1 QTP 10的安装46 4.1.1 安装要求47 4.1.2 QTP 10支持的环境和程序47 4.1.3 安装步骤48 4.1.4 QTP的设置50 4.1.5 QTP升级补丁包的安装51 4.2 开始使用QTP51 4.2.1 QTP的帮助文档51 4.2.2 QTP的视频教程52 4.2.3 QTP自带的样例程序52 4.2.4 启动QTP54 4.2.5 插件加载设置与管理54 4.2.6 创建一个空的测试项目55 4.2.7 录制和测试运行设置55 4.2.8 指定需要录制的应用程序56 4.2.9 使用QTP编写第一个自动化测试脚本57 第5章 QuickTest Professional的基本使用方法60 5.1 QTP基本功能的使用60 5.1.1 QTP自动化测试的基本过程60 5.1.2 在关键字视图中编辑测试脚本61 5.1.3 在关键字视图中为测试步骤添加注释62 5.1.4 在关键字视图中添加测试信息的输出62 5.1.5 插入检查点(Checkpoint)63 5.1.6 在关键字视图中插入新的测试步骤64 5.1.7 在专家视图中编辑测试脚本66 5.1.8 脚本编辑器的使用67 5.2 编辑测试脚本67 5.2.1 识别对象67 5.2.2 Object Spy的使用68 5.2.3 对象库管理70 5.2.4 把测试对象添加到对象库中70 5.2.5 导出对象库文件71 5.2.6 在测试脚本中访问对象库的测试对象72 5.2.7 添加新的Action73 5.2.8 关联Action的对象库74 5.2.9 编辑新的Action75 5.2.10 在函数库中创建自定义函数76 5.3 运行和调试测试脚本78 5.3.1 语法检查78 5.3.2 使用断点79 5.3.3 单步调试79 5.3.4 调试查看器的使用80 5.3.5 运行整个测试80 5.3.6 运行部分测试81 5.3.7 批量运行测试81 5.3.8 使用MTM批量运行测试82 5.4 分析测试结果83 5.4.1 选择测试运行结果的存储位置83 5.4.2 查看概要测试运行结果83 5.4.3 查看检查点的结果84 5.4.4 查看测试过程的截屏85 5.5 利用Active Screen来编辑测试脚本86 5.5.1 查看Active Screen86 5.5.2 Active Screen的设置86 5.5.3 在Active Screen中选择并添加对象到对象库88 5.5.4 选择Active Screen中的对象并输出其对象属性90 5.5.5 在Active Screen中插入检查点92 5.5.6 在Active Screen中选择对象并添加测试步骤93 第6章 QuickTest Professional与其他工具的整合95 6.1 与WinRunner的整合95 6.1.1 在QTP中调用WinRunner的测试脚本95 6.1.2 在QTP中调用WinRunner的函数98 6.2 QTP与LoadRunner的整合99 6.2.1 在QTP中为LoadRunner设计测试脚本99 6.2.2 使用Silent Test Runner模拟LoadRunner的调用101 6.2.3 在LoadRunner中插入和运行QTP脚本103 6.2.4 在LoadRunner中运行QTP脚本需要注意的几点104 6.3 QTP与QC整合105 6.3.1 什么是BPT105 6.3.2 BPT的工作流程105 6.3.3 安装QTP for BPT插件107 6.3.4 业务专家编写手工组件109 6.3.5 把手工组件转换成自动化组件109 6.3.6 自动化测试工程师创建应用程序域和对象库110 6.3.7 自动化工程师编写自动化脚本(建立函数库、实现关键字)114 6.3.8 业务专家编辑业务流程(组合组件)117 6.3.9 业务专家把业务流程测试用例添加到测试集并运行118 6.4 QTP与其他工具的整合119 6.4.1 QTP整合AutoIt119 6.4.2 QTP整合Sikuli120 第3篇 QTP脚本开发篇 第7章 关键字驱动测试124 7.1 关键字驱动测试方法124 7.1.1 什么是关键字驱动测试方法124 7.1.2 关键字测试驱动框架125 7.1.3 关键字驱动实现自动化测试的阶段划分126 7.1.4 什么时候使用关键字驱动测试方法126 7.2 可视化编辑测试步骤127 7.2.1 编辑对象库127 7.2.2 选择测试对象127 7.2.3 选择测试对象相应的操作128 7.2.4 设置测试逻辑129 7.3 检查点的使用130 7.3.1 为测试添加检查点130 7.3.2 检查点类型130 7.3.3 添加标准检查点131 7.3.4 添加图像检查点132 7.3.5 添加位图检查点133 7.3.6 添加表格检查点134 7.3.7 添加文本检查点136 7.3.8 添加文本区域检查点138 7.3.9 添加可访问性检查点139 7.3.10 添加页面检查点141 7.3.11 添加数据库检查点143 7.3.12 添加XML检查点145 7.4 关键字驱动方法的应用过程实例147 7.4.1 分析Mercury Tours应用程序147 7.4.2 定义Action和Test Flow149 7.4.3 定义对象库(Object Repository)150 7.4.4 定义函数库(Function Library)150 7.4.5 编写脚本实现业务流程步骤151 第8章 数据驱动测试153 8.1 数据驱动测试方法153 8.1.1 什么时候使用数据驱动测试方法153 8.1.2 数据驱动测试的一般步骤154 8.2 参数化测试154 8.2.1 通过参数化测试来提高测试的灵活性155 8.2.2 参数化测试步骤155 8.2.3 使用随机数来进行参数化158 8.2.4 参数化检查点159 8.2.5 设置数据表格迭代方式160 8.3 Action测试输入的参数化162 8.3.1 编辑Action的属性163 8.3.2 添加Action的输入参数164 8.3.3 调用Action165 8.4 使用环境变量的参数化167 8.4.1 定义和设置环境变量168 8.4.2 在测试步骤中绑定环境变量值169 8.4.3 导出环境变量到XML文件170 8.4.4 导入外部环境变量文件171 8.5 使用数据驱动器来参数化测试172 8.5.1 数据驱动器的使用方法172 8.5.2 数据驱动向导173 8.6 采用其他类型数据源的数据驱动测试174 8.6.1 文本文件作为数据源175 8.6.2 Excel作为数据源177 8.6.3 数据库表作为数据源179 第9章 VBScript基础180 9.1 脚本语言简介180 9.1.1 Windows脚本语言180 9.1.2 测试工具的“厂商语言”181 9.2 VBScript语言基础181 9.2.1 VBScript的数据类型181 9.2.2 变量子类型(Variant Subtypes)182 9.2.3 VBScript的变量183 9.2.4 VBScript的运算符184 9.2.5 VBScript的条件语句184 9.2.6 VBScript的循环语句185 9.2.7 VBScript的Sub与Function186 9.2.8 VBScript的数组186 9.2.9 VBScript常用函数187 9.2.10 VBScript的学习189 9.3 VBScript常用对象190 9.3.1 WSCript.Shell对象的使用190 9.3.2 用SendKeys来模拟键盘按键190 9.3.3 Scripting.Dictionary对象的使用192 9.3.4 FileSystemObject对象的使用193 9.3.5 Microsoft.XMLDOM对象的使用193 9.4 VBScript与正则表达式194 9.4.1 正则表达式简介194 9.4.2 在VBScript中使用正则表达式195 9.4.3 正则表达式在自动化测试中的使用197 9.5 VBScript与WMI199 9.5.1 WMI简介199 9.5.2 在VBScript中访问WMI200 9.5.3 利用WMI控制Windows屏保200 第10章 QTP测试脚本开发202 10.1 熟练使用专家视图202 10.1.1 专家视图与关键字视图的对应关系202 10.1.2 在专家视图中编辑测试脚本的方法203 10.1.3 输入代码注释204 10.1.4 自动化VBScript语法识别和完成205 10.2 QTP的Utility对象的使用205 10.2.1 使用PathFinder对象查找文件206 10.2.2 使用XMLUtil对象检查XML207 10.2.3 使用Extern对象加载DLL207 10.2.4 SystemUtil对象的使用208 10.2.5 使用Reporter对象写入测试结果209 10.2.6 Environment对象的使用210 10.3 QTP内置函数的使用213 10.3.1 使用Print函数显示信息213 10.3.2 使用Wait函数暂停测试脚本的执行214 10.3.3 使用ExecuteFile执行VBScript脚本216 10.4 虚拟对象管理217 10.4.1 什么是虚拟对象217 10.4.2 定义虚拟对象217 10.4.3 虚拟对象的使用和管理220 10.5 QTP测试脚本开发技巧221 10.5.1 在运行过程中设置测试选项221 10.5.2 巧用Setting对象的Item属性223 10.5.3 利用DotNetFactory对象访问.NET类库224 10.5.4 自定义数据库检查点225 10.5.5 TextUtil对象的使用226 10.6 使用Recovery Scenarios进行场景恢复227 10.6.1 什么是Recovery Scenarios228 10.6.2 什么时候使用Recovery Scenarios228 10.6.3 定义Recovery Scenarios228 10.6.4 关联Recovery Scenario到测试脚本234 10.6.5 Recovery Scenario的运行236 10.7 利用DotNetFactory访问.NET对象237 10.7.1 DotNetFactory的使用方法238 10.7.2 访问C#编写的DLL238 10.8 案例分析--使用ScreenCapture API比较图片238 10.8.1 提示对话框的图标判断问题239 10.8.2 图片比较技术的应用239 第11章 QTP描述性编程241 11.1 使用描述性编程的时机241 11.1.1 录制方式的测试脚本开发的问题241 11.1.2 什么时候使用描述性编程方法243 11.2 描述性编程的使用方法244 11.2.1 直接描述的方式244 11.2.2 直接描述方式的语法格式246 11.2.3 描述性编程的“后续强迫性”246 11.2.4 使用描述性编程的技巧247 11.2.5 使用“With”关键字简化代码248 11.2.6 使用Description对象248 11.2.7 设置Description对象的RegularExpression属性248 11.2.8 在ChildObjects对象中使用Description对象249 11.2.9 两种描述性编程方式的比较250 11.2.10 使用对象库(OR)还是描述性编程(DP)250 11.3 用编程的方式创建检查点251 11.3.1 通过GetROProperty添加对控件的动态属性的判断251 11.3.2 自定义的检查点253 第12章 使用QTP测试标准Windows对象255 12.1 Desktop对象的使用255 12.1.1 使用CaptureBitmap方法来截屏255 12.1.2 使用ChildObjects方法获取某个对象中包含的对象列表256 12.1.3 使用RunAnalog方法运行低级录制过程256 12.2 SystemUtil对象的使用257 12.2.1 使用Run方法运行文件或程序257 12.2.2 在脚本运行过程中屏蔽鼠标和键盘258 12.2.3 关闭进程258 12.3 Clipboard对象的使用258 12.3.1 Clipboard对象介绍259 12.3.2 Clipboard对象的使用方法259 12.4 标准Windows控件的基本属性和方法259 12.4.1 使用Exist属性来判断控件是否存在260 12.4.2 使用CheckProperty检查控件属性260 12.4.3 使用GetROProperty获取控件属性261 12.5 各类标准Windows控件的测试261 12.5.1 Dialog对象的测试261 12.5.2 Static对象的测试262 12.5.3 WinButton对象的测试262 12.5.4 WinCalendar对象的测试263 12.5.5 WinCheckBox对象的测试264 12.5.6 WinComboBox对象的测试264 12.5.7 Window对象的测试265 12.5.8 WinEdit对象的测试265 12.5.9 WinEditor对象的测试266 12.5.10 WinList对象的测试266 12.5.11 WinListView对象的测试267 12.5.12 WinMenu对象的测试268 12.5.13 WinRadioButton对象的测试268 12.5.14 WinScrollBar对象的测试269 12.5.15 WinSpin对象的测试270 12.5.16 WinStatusBar对象的测试270 12.5.17 WinTab对象的测试271 12.5.18 WinToolbar对象的测试272 12.5.19 WinTreeView对象的测试273 12.5.20 WinObject对象的测试274 12.6 案例分析--测试QQ登录界面275 12.6.1 QQ登录界面的对象识别问题275 12.6.2 手工添加测试对象到对象库中275 12.6.3 调整脚本276 12.6.4 使用DeviceReplay对象来处理277 12.6.5 小结278 第13章 使用QTP测试ActiveX对象279 13.1 ActiveX对象的测试279 13.1.1 Object属性的使用280 13.1.2 AcxUtil对象的FireEvent方法的使用281 13.2 各类ActiveX控件的测试281 13.2.1 RadioButton类ActiveX控件的测试281 13.2.2 CheckBox类ActiveX控件的测试282 13.2.3 Calendar类ActiveX控件的测试283 13.2.4 Label类ActiveX控件的测试284 13.2.5 ProgressBar类ActiveX控件的测试286 13.2.6 SliderBar类ActiveX控件的测试286 13.2.7 LED类ActiveX控件的测试287 13.2.8 ListBox类ActiveX控件的测试288 13.3 案例分析--测试MSFlexGrid控件289 13.3.1 QTP测试MSFlexGrid控件的问题290 13.3.2 读取和设置控件数据290 13.3.3 封装成函数库291 第14章 使用QTP测试VB对象292 14.1 Visual Basic控件的测试292 14.2 对各类VB控件的测试292 14.2.1 VbButton对象的测试293 14.2.2 VbCheckBox对象的测试294 14.2.3 VbComboBox对象的测试294 14.2.4 VbEdit对象的测试295 14.2.5 VbEditor对象的测试296 14.2.6 VbFrame对象的测试296 14.2.7 VbLabel对象的测试297 14.2.8 VbList对象的测试297 14.2.9 VbRadioButton对象的测试298 14.2.10 VbScrollBar对象的测试299 14.2.11 VbWindow对象的测试299 14.3 案例分析--测试CodeJock Xtreme Suite控件300 14.3.1 DatePicker控件测试300 14.3.2 PropertyGrid控件测试302 14.3.3 ReportControl控件测试304 14.3.4 ShortcutBar控件测试305 14.3.5 TaskPanel控件测试307 第15章 使用QTP测试Web对象309 15.1 Web对象的测试309 15.1.1 加载Web插件309 15.1.2 Web的录制和运行设置310 15.1.3 QTP支持的浏览器311 15.1.4 Windows Applications的录制和运行设置312 15.1.5 设置IE的“Enable Tabbed Browsering”选项312 15.1.6 使用Object属性访问DOM对象313 15.1.7 常用DOM属性、集合和方法314 15.1.8 使用Browser对象控制浏览器的导航318 15.2 对各类Web对象的测试319 15.2.1 Page对象的测试319 15.2.2 Frame对象的测试320 15.2.3 Image对象的测试320 15.2.4 Link对象的测试321 15.2.5 WebButton对象的测试322 15.2.6 WebCheckBox对象的测试323 15.2.7 WebEdit对象的测试324 15.2.8 WebFile对象的测试325 15.2.9 WebList对象的测试326 15.2.10 WebRadioGroup对象的测试326 15.2.11 WebTable对象的测试327 15.2.12 WebXML对象的测试330 15.2.13 WebElement对象的测试330 15.3 Web页面测试案例分析1--SuperAMS330 15.3.1 功能介绍330 15.3.2 录制脚本的两个问题及解决办法331 15.4 Web页面测试案例分析2--Discuz!验证码问题335 15.4.1 分析验证码技术的实现335 15.4.2 如何获取验证码338 第4篇 QTP高级技术篇 第16章 QTP的插件技术342 16.1 QTP插件简介342 16.1.1 查看插件安装和加载情况342 16.1.2 插件分离的好处343 16.2 内建插件与外部插件343 16.2.1 内建插件344 16.2.2 外部插件344 16.2.3 插件的安装344 16.2.4 Flex插件的安装349 16.3 插件加载与插件管理351 16.3.1 QTP的插件加载过程分析351 16.3.2 关联QTP插件与测试脚本352 16.3.3 插件关联管理353 16.3.4 通过编程方式启动QTP并加载插件353 16.3.5 插件与检查点类型的关系355 16.4 QTP插件扩展技术(QuickTest Add-in Extensibility)356 16.4.1 插件扩展SDK安装包356 16.4.2 利用Extensibility Accelerator简化Web插件扩展的开发357 16.4.3 Extensibility Accelerator的安装358 16.4.4 Extensibility Accelerator的使用359 第17章 使用QTP的.NET插件测试.NET平台软件366 17.1 QTP的.NET插件366 17.1.1 .NET插件安装与设置366 17.1.2 .NET Windows Forms Spy的使用367 17.1.3 利用.NET Windows Forms Spy来分析.NET控件369 17.2 测试.NET Windows Forms控件371 17.2.1 QTP支持的.NET Windows Forms控件371 17.2.2 通过Object属性来获取对象的内部属性372 17.2.3 通过Object属性访问并执行控件方法372 17.2.4 查看Object属性的两种方法373 17.2.5 案例分析--QTP测试.NET控件CheckedListBox374 17.3 测试WPF控件374 17.3.1 加载WPF插件375 17.3.2 QTP支持的WPF控件375 17.3.3 访问WPF控件的内部属性和方法376 17.4 测试.NET Web Forms控件377 17.4.1 QTP支持的.NET Web Forms控件377 17.4.2 测试.NET Web Forms的程序的前提条件378 17.4.3 利用Object属性来增强.NET Web Forms程序的测试378 第18章 QTP的.NET插件扩展技术及其使用380 18.1 QTP的.NET插件提供的扩展模块380 18.1.1 .NET插件的扩展模块机制介绍380 18.1.2 使用.NET Windows Forms Spy来协助开发扩展性381 18.2 使用C#对QTP的.NET插件进行扩展381 18.2.1 安装Custom Server模板382 18.2.2 建立.NET控件的测试扩展项目383 18.2.3 实现控件录制逻辑384 18.2.4 注册TrackBar控件的事件处理器385 18.2.5 实现控件的运行逻辑385 18.2.6 对QTP进行配置385 18.2.7 扩展项目的运行387 18.3 案例分析--测试ComponentOne的Toolbar控件388 18.3.1 在VS.NET 2005中编写插件扩展代码388 18.3.2 部署插件扩展文件391 18.3.3 在QTP中使用插件扩展的代码391 第19章 QTP的自动化对象模型及其使用392 19.1 QTP自动化对象模型简介392 19.1.1 什么时候使用自动化对象模型库392 19.1.2 选择开发语言和环境393 19.1.3 对象模型库基本元素394 19.2 在C#中使用QTP自动化对象模型395 19.2.1 引用对象库395 19.2.2 在C#中调用QTP对象模型库396 19.3 常用的自动化对象模型方法介绍397 19.3.1 在C#中启动QTP并加载指定插件397 19.3.2 在VBScript脚本中设置QTP选项398 19.3.3 导出QTP选项设置到VBScript脚本399 19.3.4 在VBScript脚本中设置QTP的环境变量400 19.3.5 在VBScript脚本中设置测试运行选项403 19.3.6 导出QTP测试设置到VBScript脚本中405 19.4 QTP测试调度执行框架406 19.4.1 QTP调度框架脚本407 19.4.2 读取配置文件407 19.4.3 通过AOM调用QTP执行测试409 19.4.4 写日志410 19.4.5 发送邮件412 第20章 使用QTP开发一个猴子测试工具414 20.1 猴子测试414 20.1.1 猴子测试简介414 20.1.2 笨猴子与聪明猴子415 20.1.3 什么时候使用猴子测试415 20.2 使用QTP设计一个笨猴子415 20.2.1 用QTP实现笨猴子的基本要素415 20.2.2 使用Randomize函数产生随机数416 20.2.3 使用RandomNumber对象获取随机数416 20.2.4 通过WMI对象获取屏幕高度和宽度416 20.2.5 利用DotNetFactory获取屏幕高度和宽度417 20.2.6 让猴子控制鼠标和键盘417 20.2.7 调用C#代码中封装的Windows API函数418 20.2.8 输入随机字符串421 20.2.9 记录测试信息422 20.2.10 截屏422 20.2.11 记录性能信息422 20.2.12 基本的猴子测试工具424 20.2.13 猴子测试工具的改进点425 20.3 Web页面猴子测试426 20.3.1 案例分析--遍历CSDN博客链接426 20.3.2 枚举Web页面链接427 20.3.3 写日志428 20.3.4 回退页面428 第21章 使用QTP测试Web Services429 21.1 Web Services插件介绍429 21.1.1 什么是Web Services429 21.1.2 Web Services插件的帮助文档430 21.2 使用Web Services插件测试Web Services430 21.2.1 Web Service测试向导的使用430 21.2.2 运行Web Service测试434 21.2.3 修改Web Service测试脚本中的检查点437 21.2.4 参数化Web服务的输入438 21.2.5 在对象库中添加Web Service测试对象440 21.2.6 检查WSDL是否满足WS-I标准442 21.2.7 使用ValidateWSDL方法检查WSDL445 21.3 使用WinHttpRequest测试WebService446 21.3.1 使用WinHttpRequest发送请求446 21.3.2 使用Msxml2解析返回的XML数据448 第22章 如何编写高质量的QTP测试脚本449 22.1 QTP测试脚本编码规范449 22.1.1 常量命名规范450 22.1.2 变量命名规范450 22.1.3 对象命名规范450 22.1.4 代码注释规范451 22.1.5 代码风格452 22.1.6 使用Action模板来规范化测试脚本453 22.2 通过管理对象库来提高代码的可读性453 22.2.1 直接录制的测试脚本的问题454 22.2.2 通过修改命名来达到更加易读的效果455 22.2.3 缩减代码行长度的方法456 22.2.4 以中文命名测试对象457 22.3 测试脚本目录结构搭建规范458 22.3.1 常见的测试脚本目录结构459 22.3.2 采用分层思想定义测试脚本目录结构459 附录A QTP 10新特性介绍461 附录B QTP小技巧和代码集锦471 附录C Type方法及DeviceReplay的键值常量表477 附录D QTP面试笔试题483 附录E QTP学习资源486 |
商品评论(0条)