QTP/UFT自动化测试脚本编写:从入门到精通VBScript实战113



各位自动化测试领域的小伙伴们,大家好!我是你们的中文知识博主。今天,我们要聊一个重量级的话题——如何利用QTP(现已更名为UFT,即Unified Functional Testing)来编写高效、稳定的自动化测试脚本。相信不少朋友都对自动化测试充满热情,渴望将繁琐的手工测试工作自动化,而QTP/UFT正是实现这一目标的一把利器。本文将带你从QTP/UFT的基础概念出发,深入VBScript的核心语法,并通过实战案例,一步步掌握编写高质量自动化脚本的秘诀!

QTP/UFT:自动化测试的得力助手


在开始编写脚本之前,我们先来快速了解一下QTP/UFT。

QTP到UFT的演变



QTP,全称QuickTest Professional,是HP(惠普)公司开发的一款强大的GUI(图形用户界面)自动化测试工具。它主要用于对桌面应用、Web应用等进行功能和回归测试。随着技术的发展,HP将其与Service Test(用于API和Web Services测试)整合,形成了现在的UFT(Unified Functional Testing)。虽然名称变了,但其核心的UI自动化测试功能依然是我们熟悉的QTP,并且功能更加强大,支持更多技术栈。

为什么选择QTP/UFT?



直观易用: 提供录制-回放功能,即使是初学者也能快速上手。
强大的对象识别: 独有的对象识别技术(Object Recognition)能准确识别各种UI对象。
灵活的脚本语言: 以VBScript作为其脚本语言,语法简洁,易于学习和扩展。
丰富的内置功能: 内置检查点、输出值、数据驱动等高级功能,便于构建复杂测试场景。
完善的报告: 生成详细的测试结果报告,方便分析和定位问题。

自动化脚本语言之魂——VBScript快速入门


VBScript是QTP/UFT的灵魂,所有的自动化逻辑都将通过VBScript来实现。如果你对编程语言有些了解,VBScript会非常容易上手。即使你是编程小白,也不用担心,我们一起来快速回顾其核心语法。

1. 变量与数据类型



VBScript是弱类型语言,声明变量时无需指定数据类型,但变量会根据赋值自动转换类型。


Dim myVariable ' 声明一个变量
myVariable = "Hello QTP!" ' 字符串
myVariable = 123 ' 整数
myVariable = 3.14 ' 浮点数


2. 运算符



包括算术运算符 (+, -, *, /, Mod), 比较运算符 (=, , >, =, = 90 Then
MsgBox "优秀"
ElseIf score >= 60 Then
MsgBox "及格"
Else
MsgBox "不及格"
End If


4. 循环语句



用于重复执行代码块。


' For...Next 循环
For i = 1 To 5
MsgBox "这是第 " & i & " 次循环"
Next
' Do While...Loop 循环
Dim counter
counter = 0
Do While counter < 3
MsgBox "Do While 循环 " & counter
counter = counter + 1
Loop


5. 函数与子程序



用于组织可重用的代码。函数有返回值,子程序没有。


' 子程序 (Subroutine)
Sub SayHello(name)
MsgBox "Hello, " & name & "!"
End Sub
' 函数 (Function)
Function AddNumbers(num1, num2)
AddNumbers = num1 + num2
End Function
Call SayHello("自动化测试")
Dim result
result = AddNumbers(10, 20) ' result = 30


6. 注释



使用单引号 `'` 或 `Rem` 来添加注释,提高代码可读性。


' 这是一行注释
Rem 这是另一行注释
Dim x ' 变量x的声明


QTP/UFT脚本开发的核心概念与实战


掌握了VBScript的基础,我们就可以开始将QTP/UFT的强大功能与VBScript结合起来,编写真正的自动化脚本了。

1. 对象识别机制:自动化测试的基石



QTP/UFT能够识别并操作应用程序中的各种对象(按钮、文本框、链接等),这是自动化测试的基础。

Test Object vs. Run-time Object:

Test Object (测试对象): QTP/UFT在学习(Spy或录制)应用程序对象时,会根据其属性(如`class name`、`text`、`html tag`等)在对象库(Object Repository)中创建的逻辑表示。你在脚本中使用的就是测试对象。
Run-time Object (运行时对象): 应用程序实际运行时的物理对象。QTP/UFT会根据测试对象的属性去匹配运行时对象。


对象库(Object Repository):

QTP/UFT的核心特性之一。它存储了测试中所有UI对象的属性信息。对象库可以是本地的(与Action绑定),也可以是共享的(可被多个Test/Action共享)。

优点: 集中管理对象,便于维护。当对象属性变化时,只需更新对象库,无需修改脚本。
缺点: 如果对象数量庞大,管理起来较为复杂。
对象属性与识别顺序:

QTP/UFT通过对象的多个属性来唯一标识一个对象。识别优先级通常是:强制属性 (Mandatory Properties) -> 辅助属性 (Assistive Properties) -> 序数标识符 (Ordinal Identifiers)。当普通属性无法唯一识别时,QTP/UFT会使用基于位置、索引等序数信息进行识别。

2. 录制与回放:快速入门



QTP/UFT的“录制与回放”功能是新手学习和快速搭建测试用例的利器。

录制: 启动录制后,你在应用程序上的所有操作(点击、输入、选择等)都会被QTP/UFT记录下来,并自动生成VBScript代码。
回放: QTP/UFT会按照录制的操作顺序,在应用程序上自动执行这些操作。


优点: 上手快,无需太多编程知识。
缺点: 生成的脚本可维护性差,对应用程序的微小变化敏感,一旦UI有变动,脚本很可能失效。因此,录制功能通常用于生成初始代码,然后需要手动优化。

3. 描述性编程(Descriptive Programming):高级灵活



描述性编程允许你直接在脚本中通过属性来描述对象,而无需将其添加到对象库。


' 示例:在百度首页搜索“QTP”
Browser("title:=百度一下").Page("title:=百度一下").WebEdit("name:=wd").Set "QTP"
Browser("title:=百度一下").Page("title:=百度一下").WebButton("name:=百度一下").Click
' 使用Description对象创建的描述性编程(更推荐)
Set oDescription = ()
oDescription("html tag").Value = "INPUT"
oDescription("name").Value = "wd"
Browser("title:=百度一下").Page("title:=百度一下").WebEdit(oDescription).Set "QTP"



优点:

无需对象库: 减少了对象库的维护负担,特别适用于对象动态生成、属性不固定或测试范围小的场景。
灵活性高: 可以根据运行时动态属性值来查找对象。
代码可读性: 如果描述清晰,代码本身就能表达要操作的对象。

缺点:

属性变化: 如果对象属性变化,需要修改脚本。
调试困难: 定位对象失败时,排查问题可能比对象库模式更复杂。

4. 参数化(Parameterization):数据驱动测试



参数化是自动化测试中至关重要的一环,它允许你使用不同的测试数据重复执行相同的测试步骤,实现数据驱动测试。

Data Table(数据表): QTP/UFT内置了一个强大的数据表,可以存储测试数据。数据表分为“全局表”(Global Sheet)和“局部表”(Action Sheet)。


' 读取全局表数据
("Global").SetCurrentRow 1 ' 设置到第一行数据
username = DataTable("Username", "Global")
password = DataTable("Password", "Global")
' 也可以直接使用:
' For i = 1 To ("Global").GetRowCount
' ("Global").SetCurrentRow i
' username = DataTable("Username", "Global")
' password = DataTable("Password", "Global")
' ' 执行登录操作
' Next
' 写入数据到结果(通常不直接写入Data Table,而是Reporter)
' ("Result", "Global") = "Passed" ' 不推荐



外部数据源: QTP/UFT也支持从外部文件(如Excel、CSV、数据库)读取数据,这在处理大量测试数据时非常有用。

5. 检查点(Checkpoints):验证测试结果



检查点是自动化测试中验证应用程序行为的关键。它将当前应用程序的某个属性值与预期值进行比较。

标准检查点: 验证文本、对象属性、图像、数据库等。


' 录制或插入一个文本检查点:验证页面上是否存在“登录成功”字样
' Browser("Login Page").Page("Home Page").Check CheckPoint("Login Success")
' 在脚本中手动实现类似逻辑:
expectedText = "登录成功"
actualText = Browser("MyBrowser").Page("MyPage").WebElement("html tag:=DIV", "innertext:=*").GetROProperty("innertext") ' 获取某个元素的文本
If InStr(actualText, expectedText) > 0 Then
micPass, "登录验证", "成功找到文本: " & expectedText
Else
micFail, "登录验证", "未找到预期文本: " & expectedText & ", 实际文本: " & actualText
End If



输出值(Output Values): 捕获应用程序在运行时生成的动态数据,用于后续步骤的输入或写入报告。


' 捕获订单号
orderNumber = Browser("Order Confirmation").Page("Confirmation").WebElement("html tag:=SPAN", "index:=0").GetROProperty("innertext")
micDone, "订单号捕获", "生成的订单号是: " & orderNumber




6. Action 的使用:模块化测试



Action 是QTP/UFT中组织测试步骤的基本单位,类似于其他编程语言中的函数或模块。

可重用Action: 可以被多个Test或Action调用,提高代码复用性。
不可重用Action: 只能在其所属的Test中执行。
Action参数: Action可以接受输入参数和返回输出参数,实现更灵活的模块间通信。


' 在Action1中调用Action2,并传递参数
RunAction "Login_Action", oneIteration, "username", "password"
' Login_Action的定义:
' Action "Login_Action" (username, password)
' Browser("Login Page").Page("Login").WebEdit("UserName").Set username
' Browser("Login Page").Page("Login").WebEdit("Password").Set password
' Browser("Login Page").Page("Login").WebButton("Login").Click
' End Action




编写高质量QTP/UFT自动化脚本的实践技巧


仅仅了解语法和功能是不够的,如何编写出健壮、可维护的脚本才是王道。

1. 良好的编码习惯



添加注释: 解释代码的用途、复杂逻辑或关键步骤。
命名规范: 变量、函数、Action使用有意义的名称,遵循驼峰命名法或下划线命名法。
代码格式化: 保持一致的缩进和空白,提高可读性。

2. 错误处理机制



自动化脚本经常会遇到各种异常(对象找不到、网络延迟等),有效的错误处理能让脚本更加稳定。


On Error Resume Next ' 遇到错误时跳过,继续执行下一行
Browser("MyBrowser").Page("MyPage").WebEdit("NonExistentObject").Set "Test"
If 0 Then
micFail, "操作失败", "尝试设置不存在的对象,错误信息: " &
' 清除错误信息
Else
micPass, "操作成功", "对象设置成功"
End If
On Error GoTo 0 ' 关闭错误跳过功能



`Err` 对象提供了错误的详细信息(`` 和 ``)。

3. 同步机制



应用程序的加载速度不一,脚本执行速度快于页面加载时,会导致对象找不到错误。同步机制是解决这类问题的关键。

Browser().Page().Sync: 等待浏览器或页面加载完成。
(Timeout): 判断对象是否存在于页面上,可设置等待时间。


If Browser("MyBrowser").Page("MyPage").WebEdit("MyTextBox").Exist(10) Then ' 等待10秒
Browser("MyBrowser").Page("MyPage").WebEdit("MyTextBox").Set "Value"
Else
micFail, "对象不存在", "文本框在10秒内未出现"
End If



Wait(seconds): 硬性等待指定秒数(不推荐过度使用,会降低脚本效率)。
WaitProperty: 等待对象的某个属性变为预期值。

4. 模块化设计与函数库



将重复的功能封装成独立的函数或Action,放在一个公共的函数库(.vbs文件)中,然后在各个脚本中导入使用。


' 在UFT中,你可以通过File -> Settings -> Resources来添加外部函数库
' 假设函数库文件为 "",里面定义了Login函数
' 内容:
' Function Login(username, password)
' Browser("Login Page").Page("Login").WebEdit("UserName").Set username
' Browser("Login Page").Page("Login").WebEdit("Password").Set password
' Browser("Login Page").Page("Login").WebButton("Login").Click
' Login = True ' 返回成功
' End Function
' 在你的测试脚本中调用:
' If Login("testuser", "testpass") Then
' micPass, "登录功能", "用户登录成功"
' Else
' micFail, "登录功能", "用户登录失败"
' End If


5. 日志记录与报告



使用``将测试结果和关键信息记录到QTP/UFT的运行报告中。

`micPass`:测试步骤通过。
`micFail`:测试步骤失败。
`micDone`:信息性步骤(不影响测试结果)。
`micWarning`:警告信息。



micPass, "步骤1", "成功进入首页"
micFail, "步骤2", "点击登录按钮失败,未找到按钮"


进阶与展望


当你熟练掌握了上述技巧后,QTP/UFT的自动化脚本之路才刚刚开始。

框架构建: 学习并实践数据驱动框架、关键字驱动框架、混合框架等,提高自动化项目的可维护性和扩展性。
与CI/CD集成: 将UFT脚本集成到Jenkins、GitLab CI等持续集成/持续部署流程中,实现自动化测试的持续运行。
API测试: UFT不仅支持GUI测试,其内置的Service Test功能也提供了强大的API测试能力。
移动应用测试: UFT One(UFT的最新版本)也提供了对移动应用自动化测试的支持。
与其他工具集成: 如ALM(Application Lifecycle Management)进行测试管理。

结语


从QTP到UFT,这款工具始终在自动化测试领域占据一席之地。通过本文的深入讲解,希望你已经对如何用VBScript编写QTP/UFT自动化脚本有了清晰的认识和实践的信心。记住,自动化测试是一个持续学习和优化的过程。从录制-回放起步,到描述性编程,再到构建健壮的测试框架,每一步都是你技术成长的印记。


自动化测试的价值在于它能解放我们的双手,让测试工作更高效、更可靠。祝愿各位小伙伴都能成为QTP/UFT的脚本大师,在自动化测试的道路上越走越远!如果你有任何疑问或想分享你的实践经验,欢迎在评论区留言交流!

2026-03-09


上一篇:轻量级Web服务器脚本语言:解锁嵌入式设备的智能互联与高效管理

下一篇:揭秘幕后英雄:服务器脚本语言如何驱动您的动态网站与应用