功能自动化测试之QTP编写测试脚本(一)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/103731397
一、VBScript 基础知识
说明:VB 就是Visual Basic编程语言的简写(俗称),VBScript就是VB演变的脚本语言;就类似Java和JavaScript一样的道理;QTP支持的编程语言就是VBScript
1.弹窗输出结果
1.1 msgbox
-
message box 的缩写,是一个系统函数,属于模式窗口
-
msgbox “窗口提示文字”,图标+按钮类型,“窗口标题”
√ 不能加括号;
√ 提示文字使用常变量均可;
√ 图标类型
✰ 16:出错图标
✰ 32:疑问图标
✰ 48:警告图标
✰ 64:友好消息
√ 按钮类型
✰ 0:只有确定
✰ 1:确定、取消
✰ 2:中止、重试、忽略
✰ 3:是、否、取消
✰ 4:是、否
✰ 5:重试、取消 -
返回值变量=msgbox(“窗口提示文字”,图标+按钮类型,“窗口标题”)
√ 括号不能省略。
√ 返回值
✰ 确定:1
✰ 取消:2
✰ 中止:3
✰ 重试:4
✰ 忽略:5
✰ 是:6
✰ 否:7
举例:
- 如在QTP中新建测试,通过msgbox弹出提示信息(数字和字符串都行)
t
- 通过msgbox弹出输出窗口内容和窗口标题,而窗口图标没有,所以就,省略不写即可

- 添加图标和按钮,文章中列出的常用按钮和图片可随意组合,博主就截两个图演示,其他的可以自己测试


- 打印出操作对应按钮的返回值,打印第一个变量a为确定按钮的返回值,需要注意获取返回值也就是复制时,msgbox后面需要加括号

- 打印第二个变量b为取消按钮的返回值,其他的可以测试点击某个按钮来打印出其返回值


1.2 print
- print 常变量
√ 是一个系统函数,属于非模式窗口,可以把以前的结果与现在的放到一起显示;
√ 不能加括号。
举例:
- 在脚本中使用print命令打印出hello world

- 添加打印123456常量,如下

- 注意:测试结果窗口不用关闭的情况下也可以操作QTP,但是会导致上一次的结果与现在的结果放在一起显示,现在再次运行脚本

2.变量、常量和数组
2.1 变量
- 变量名=值
√ 不需要声明;
√ 字符、字符串需要使用""定界
√ 日期需要使用##定界
√ 数值数据不能使用定界符
举例:
- 直接打印变量

2.2 系统常量
-
vbcrlf
√ Carriage Return,Line Feed
√ 回车换行。 -
vbtab
√ tab 键。
√ 说明
✰ vbcrlf 和 vbtab 均可以用于 msgbox 和 print 中。 -
双引号转义
√ 不支持
√ 使用""
举例:
- 使用msgbox打印拼接字符串

- 使用msgbox打印字符串换行显示

- 使用msgbox打印字符串之间空格隔开显示

- VBScript转义

2.3 数组
-
数组定义
√ dim 数组名(数组最大下标)
✰ dimession:维数、维度
✰ 必须使用 dim 声明
√ 数组名=array(元素 1,元素 2,…) -
引用数组元素
√ 数组名(下标)
√ 下标从 0 开始 -
ubound(数组名)
√ 返回数组中的最大下标 -
动态数组
√ dim 数组名()
√ redim 数组名(最大下标)
举例:
- 打印数组中的元素

- 使用Dim自定义动态数组,进行数组下标赋值并打印

- 使用ubound可以获取数组的最大下标,不管数组中有没有存放数据

- 输入数组中存放几个数据(元素),通过redim和ubound函数打印出数组中的存放的元素个数,通过调整redim来控制动态数组中元素

3.系统函数
3.1 输入函数
变量=inputBox(“提示文字”,“窗口标题”)
- 如下所示给输入框起名以及输入框提示文字

3.2 查看数据类型函数
typeName(变量)
- 输入汉字,打印出类型,在inputbox函数中不管输入什么都是字符串类型

3.3 字符串函数
-
len(字符串)
-
left(字符串,个数)
-
right(字符串,个数)
-
mid(字符串,起始整数,个数)
-
trim(字符串)
-
chr(ASCII 码)
√ chr(9)
✰ tab 键
✰ 可用于 msgbox 和 print
√ chr(10) & chr(13)
✰ 回车换行
✰ 仅用于 msgbox -
asc(字符)
√ 获得 ASCII 码。 -
数组名=split(字符串,“分隔符”,拆出的个数)
√  省略分隔符时,默认按空格拆,不含 Tab
举例:
- 打印出字符串的长度,不区分中文英文,都是一个字节长度

- 使用left和right,截取字符串左边3个字符右边两个字符

- 使用mid从第二个字符开始取连续取三个

- 使用trim去掉首尾空格

- 使用chr(9)函数完成tab键操作

- 使用chr(10)&chr(13)完成回车换行操作

- 通过asc方法获取字符的ascall码

- 使用split函数将字符串按照,进行拆分

- 使用split进行按照,进行拆分成2部分,需要注意的是拆成2部分那么打印的res结果集中的元素下标不能超过2,即0,1,不然则会报错超出取值范围溢出

- 对于字符串中存在空格,可以不写拆分条件,默认按照空格进行拆分(tab键不支持)

3.4 日期时间函数
- now()
- date()
- year()
- month()
- day()

3.5 逻辑函数
-
isdate(数据)
-
isnumeric(数据)
-
使用##来验证是否属于日期格式,最后再通过isdate来进行判断


-
通过isdate函数验证字符串


-
使用isnumeric验证实数(只要是能转成实数的都行)

3.6 类型转换函数
-
cbyte
√ 范围 0~255 -
cint
√ 范围:-32768~32767 -
clng
√ 范围:-2^31 ~ 2^31,long长整型 -
cdbl
√ double浮点类型
举例:
- 使用cbyte演示不同数据

3.7 随机数函数
- randomNumber(起始值,结束值)

4.运算符
-
+
√ 左右均为字符串时,可以连接字符串

-
-
-
*
-
/
-
mod
√ 数 1 mod 数 2 -
&
√ 连接字符串常变量

-
=
√ 等于 -
<>
√ 不等于,不支持!=

-
<、>、<=、>=
-
and、or、not
√ 与、或、非

5.流程控制语句
5.1 if 分支
if 条件表达式 1 then
语句 1
elseif 条件表达式 2 then
语句 2
…
else
语句 n
end if
- if 单分支

- if 双分支及多分支

5.2 if 嵌套
- 对代码进行优化使用if嵌套来完成输入值的一个判断,对于会编程的朋友来说显而易见

5.2 select 分支
select case 表达式
case 值 1
语句 1
case 值 2
语句 2
…
case else
语句 n
end select
- 使用select case来完成分数评分判断

- 优化处理代码,加上一个if嵌套,判断当输入的数字范围不在正常分数范围中则给出友好提示

5.3 循环
5.3.1 while 循环
while 条件表达式
…
wend
- 通过while循环完成输入一个数,完成从0开始到这个数的累加和

5.3.2 for…next 循环
for
变量=初值
to
终值
step
步长
…
next
- 通过for…next循环完成输入一个数,完成从1开始到这个数的累加和,step1 写不写无所谓,默认为步长1

5.3.3 for each…next 循环
for each
变量名
in
数组名
…
next

- 用户输入的相输入数的个数n,通过redim动态数据来控制数组最大下标为n-1,那么就可以控制循环的次数ubound从而达到控制用户第n个数

6.异常处理语句
6.1 基本语法
on error resume next
…
可能出错的语句
…
if err.number=? then
错误处理
end if
6.2 err 对象
-
err 对象用于存储错误信息。
√ err.description
✰ 提供错误信息的具体内容。
√ err.number
✰ 提供唯一的错误号。 -
如下测试除数为0时捕获的异常

二、使用 VBScript 处理脚本
1.使用 if 解决脚本问题
- 解决 Flight 中日期变动导致回放失败的问题。 策略就是获取当前的年月日+1则表示明天的日期时间,然后根据脚本中的要求,年份取前面2位,日和月都必须是2位数即5月为05,3日为03,那么不管什么时候运行脚本都保证是脚本中的日期为第二天

- 将函数放到脚本中,并修改脚本中的日期

- 运行脚本,没有任何问题,成功插入订单

2.锁定键盘和鼠标
- 在QTP执行过程中,如果人为不小心将被测软件或页面关闭,则会提示找不到对象,为了避免不小心的误操作,可以在脚本最上面对键盘和鼠标进行锁定

- 如果在某个过程中需要解锁,那么在脚本中相应位置加上该命令即可,需要注意的一点则是,在使用锁定键盘和鼠标之前,将脚本保存,不然如果脚本出错并且键盘鼠标被锁定,形成了死锁的状态,就导致之前辛辛苦苦编写的脚本丢失

3.向结果报告中输出信息
-
Reporter.ReportEvent EventStatus, ReportStepName, Details
√ EventStatus
✰ 0 或 micPass:将本步骤的运行结果状态设置为”Pass” 。
✰ 1 或 micFail:将本步骤的运行结果状态设置为”Fail” 。
✰ 2 或 micDone:在报告中生成“完成”报告。
✰ 3 或 micWarnings:在报告中生成“警告”报告,但是不会中断测试的运行,也不影响测试的 pass/fail status。
√ ReportStepName
✰ 在报告中显示的步骤名称(object name),为字符串。
√ Details
✰ 报告的详细信息。 -
在脚本插入订单后补输出信息


-
执行脚本,查看结果,查看脚本中设定的输出信息

4.下拉列表和列表框的使用
4.1 存储列表对象
- set 对象名=列表对象名
√ 对象不支持 for each next。

4.2 存储列表中的内容为一个字符串
对象名.getContent

4.3 获取列表包含的项数
对象名.getItemsCount

4.4 获取选中项
对象名.getSelection

4.5 获取列表中的项目
-
对象名.getItem(下标)
√ 下标从 0 开始 -
【例 1】单独输出下拉列表中的所有项

4.6 选取某项
- 对象名.select "文字"或下标
- 【例 1】随机选择航班

5.判断对象是否存在
-
对象名.exist(超时时间)
√ 在规定时间内判断对象是否存在。
√ 无返回值时不用括号。

-
【例 1】测试登录窗口的功能
√ 思路
✰ 1、录制正确登录脚本。
✰ 2、录制一个登录失败的脚本。
✰ 3、添加检查点
▲ 若登录窗口出现,则检查 flight 窗口标题文字是否正确;否则,检查出错窗口中的文字是否正确 -
首先打开flight登录界面,进行登录的各种试错,将提示信息粘贴到excel表格中

-
根据以上错误提示信息,编写QTP可以导入的测试用例

-
录制登录成功和失败的脚本

-
以订票窗口作为if判断条件,对登录失败的操作以及登录成功关闭窗口进行划分

-
设置错误窗口文本检查点

-
在对象库中修改名称

-
切换到关键字视图,对代理名称和密码进行参数化

-
在数据表中导入前面编写的excel用例

-
博主脚本中Window写成了windows,所以进行了修改

-
运行脚本,脚本没有问题,每条用例都能按顺序执行,但是每次执行用例时会出现停顿,因为每次点击确定后,首先会去检查航班预订的窗口等待时间为3秒

-
测试结果如下

-
将脚本进行优化,先判断航班窗口不存在,去执行检查点检查错误,最后去判断航班预订窗口存在则表示登录成功

-
其实以上的优化知识调换判断顺序,还是没有效果,关键是在于判断条件中的语句,直接改成Dialog(“登录”).Dialog(“航班预订”)检查是否存在错误对话框即可

-
再次运行脚本,比之前的脚本运行速度快了不是一个档次,查看结果

-
目前该脚本吃测试的是老版本4a,测试新版本4b(必须保证新版本4b与4a按钮啥的都是没有改动的不然无法使用之前自动化脚本运行测试)

-
再次运行脚本,查看结果也是没有任何问题的

更多推荐
所有评论(0)