测试技能整理-功能自动化

自动化工具概述

自动化测试应用场合

在这里插入图片描述
不正确的自动化测试期望
有了工具,一切测试过程都变得自动了。
如果项目中使用了很多第三方控件或自定义控件,而这些控件的可测性很差,这种测试则不适合自动化。
有了工具,测试工作马上就减轻了。
购买测试工具后,还需要编写和维护测试脚本,这些费时、费力;
可以在界面雏形时期,检查界面中的控件是否可测,从而选择合适的工具。
自动测试工具都是简单易用的。
功能越完备操作通常越复杂,要求使用者掌握更多的技能。
自动化测试尽早执行。
自动化测试需要过早计划但不宜过早执行;自动化测试需要循序渐进进行

常用的自动化测试工具及分类

商业测试工具

需要购买,价格昂贵。
成熟、稳定、有售后服务和技术支持。
适宜 GUI 功能和性能测试。
HP
QuickTest Professional/UFT(Unified Funtional Testing):功能测试工具。
LoadRunner:性能测试工具。
Quality Center/Application Lifecycle Management:测试管理工具。
IBM Rational
Robot:功能和性能测试工具。
支持 HTML、Java、.Net、Visual Basic、PowerBuilder、Delphi、Oracle 表单和MFC 控件。
ClearCase:软件配置管理工具。
ClearQuest:缺陷和变更跟踪工具。
TestManager:测试管理工具。
Compuware QACenter
QARun:功能测试工具。
QALoad:性能测试工具。
QADirector:测试管理工具。
Microsoft
Web Application Stress:性能测试工具

开源测试工具

志愿者开发和维护,未必完全免费。
Selenium
最早由 Thoughtworks(思特沃克)的员工 Jason Huggins 编写,后来多人加入。
功能和兼容性自动化测试工具。
Jmeter
Apache 组织开发。
性能和接口自动化测试工具。

QTP录制脚本

安装QTP

安装 QTP 脚本调试器
能够指示脚本中的语法错误,辅助调试脚本。
安装 QTP
汉化
破解
打开软件,如果提示可以使用 1 个月,则无需破解;
执行安装光盘中的“功能测试许可证服务器安装程序”;
进入 QTP 安装目录下的 bin 文件夹,执行 instdemo.exe;
一次破解可试用 1 个月,一个月后需要重新破解
方法 1:手动破解:设置“显示隐藏的文件和文件夹”,取消“隐藏受保护的操作系统文件”选项,然后删除 C:\用户\All Users\safenet sentinel 目录,双击 instdemo.exe,重新打开软件,看是否破解成功
方法 2:执行“每月执行此文件破解 QTP.bat”进行自动破解

QTP的工作原理

录制脚本

QTP 是基于对象的;
录制脚本时 QTP 将用户操作的控件属性及动作记录到数据库中;
未被鼠标点击或键盘操作的界面控件不会放到对象库中;
QTP 不能识别所有应用程序中的对象或组件
默认可以识别 Web 对象、ActiveX 控件和 Visual Basic 控件;
要测试特殊的应用程序,如 Java、Oracle、SAP、.Net 等,需要单独购买插件。

运行脚本

也称回放脚本;
QTP 根据测试脚本的对象名到对象库中去寻找对象的属性,然后与运行的待测程序中的对象比较,如果成功,则 QTP 操作成功

增强脚本

可以判断控件结果是否正确;
可以将测试用例中的数据纳入到脚本中;
可以查看控件的实际结果。

支持的脚本语言

VBScript

QTP 的测试过程

在这里插入图片描述
案例:测试计算器小程序的加减乘除的功能
录制完成后必须回放脚本,出现错误或其他问题时,要对脚本进行调试

案例:Flight
QTP 自带的单机版软件,俗称“单机版小飞机”
MTours
需要自己安装,俗称“网页版小飞机”

脚本错误分类

语法错误
是由不正确的脚本语法导致的。
运行时错误
是脚本在执行过程中脚本指令试图执行不可能的动作而导致的

QTP 的视图

关键字视图(Keyword View)
实际上是一个表格,是被测应用中被操作的具有层次结构的对象、对象被执行的动作、对象被设定的值的有序集合。
Item/项:表示各个界面元素(控件的类型和名称)。
Operation/操作:表示对界面元素的做出的动作,每一个动作串起来就是一系列的测试步骤。
Value/值:测试输入的数据。
Documentatio/文档:测试文档,可以导出作为测试用例。
关键字驱动测试方法或表格驱动测试方法
此方法把应用程序的功能文档化为表格,用一步步的指令指导执行每一个测试步骤。
重点在于开发表格和关键字,自动化框架根据表格数据和关键字来执行脚本,驱动应用程序。

专家视图(Expert View)
用于编写和修改脚本代码。
层次关系
点号:“.”  注释
'(英文单引号)或 rem
关键字不区分大小写

活动屏幕视图(Active Screen)
显示操作的截图。
不显示截图的解决办法
自动化→更新运行模式→确定

数据表视图(DataTable)
用于进行参数化,用于存放测试用例中的数据

QTP 专家视图
打开文件或程序
SystemUtil.run “file”  用于打开一个文件或程序。
file 表示文件或程序的完整路径及名称。
SystemUtil.run “file” , “para”  para 表示启动参数。
打开 Tomcat
SystemUtil.Run “…\jakarta-tomcat-3.3\bin\tomcat.bat”,“start”  SystemUtil.Run “iexplore.exe”, “url 地址”  打开一个网页
如 http://localhost:8080/mtours

QTP 对象的分类和名称

在这里插入图片描述

QTP 对象的操作
设置文本框的值
对象名.Set 值数据
对象名.type 值数据
点击对象
对象名.click 坐标
坐标可以省略
选择值
对象名.select 值
对象名.select 索引号
索引号:0 表示第 1 项,依次类推。
下拉列表、列表框
单机版软件:直接用整数。
网页:可用整数,也可用"#索引号",从 0 开始
单选按钮
网页:必须用"#索引号",双引号不能省略。
只能用于网页中。
设置网页页面同步
browser(“浏览器标题”).page(“网页标题”).sync
browser.sync 表示等待浏览器中页面中所有的元素都已加载完成后后进行下一步操作,加载完成的标志是浏览器左下角显示“完成”字样。
打开某个网址
browser(“浏览器标题”).navigate url
关闭浏览器
browser(“浏览器标题”).Close
browser(“浏览器标题”).CloseAllTabs

对象库管理

查看对象
在这里插入图片描述

添加对象入库

利用活动屏幕视图
右击 Active Screen 中的对象后单击“查看/添加对象”(View/Add Object)。
利用 Spy 对象探测器
当对象被遮住或需要某些操作才能显示时,可以按着 Ctrl,当鼠标变为手形时即可捕获对象。
在对象库中操作
Resources 菜单或工具栏工具命令。
批量入库
对象库中点击菜单“对象”→将对象加到本地。
菜单“资源”→对象库管理器→对象→导航并了解→了解→点击窗口标题→关闭。

对象的重命名、复制和删除

在对象仓库中,右击对象即可

对象库复用

导出对象库
File→Export Local Object,可以保存至本地磁盘,扩展名为.tsr
导入对象
菜单“资源”→关联对象库(Resources→Associate)

脚本补录
直接录制
务必首先定位到需要补录的位置。
添加对象入库
利用活动屏幕视图。
右击 Active Screen 中的对象后 Step Generator。
将对象库中的对象直接拖动到代码或关键字视图中。
直接操作关键字或者写脚本

QTP增强脚本

检查点

检查点的含义和分类
检查点用于比较软件在运行时控件的属性值是否与指定的值相等。
检查点分类
标准检查点
网页/页面检查点
表格检查点
图像检查点
数据库检查点
文本/文本区域检查点
位图检查点
XML 检查点
可访问性检查点。

检查点支持情况

在这里插入图片描述

插入检查点的步骤

在脚本中定位检查点插入位置(某个步骤的前面或后面)。
确认并选中被检查对象。
设定检查属性和选项。

插入检查点的方法

使用主菜单 Insert→Checkpoint。
测试工具栏的 Insert Checkpoint 按钮。
活动屏幕视图中,右击对象。
关键字视图中,右击对象

插入常用检查点

标准检查点
检查界面中对象的属性是否符合预期的要求。
检查界面上的文字是否显示正确、复选框是否被选中、按钮是否置灰、窗体是否被激活、列表框中显示的内容是否正确、控件的宽度、高度、坐标等是否符合要求等。
标准检查点可以细分为页面检查点、表格检查点、图像检查点。

标准检查点
【例 1】
检查更新订单(update order)在插入订单(insert order)之前是否置灰,之后是否可用。
【例 2】
检查 Flight 中某单选按钮是否(默认)被选中。
【例 3】
检查 Flight 登录是否成功。
【例 4】
检查 Flight 中航班出发地内容是否有缺少。
【例 5】
录制网页版小飞机,检查登录是否成功。
【例 6】
录制网页版小飞机,检查某个超链接是否正确

页面/网页检查点
只限网页的测试。
只能检查链接的格式、地址中的网页文件名或目录名等是否存在,并不会去点击链接。
【例 1】
检查 MTours 中的任意一个网页中的链接个数、图片个数和中断链接。
【例 2】
检查 test 网站页面中的中断链接。

表格检查点
只限网页的测试。
用于测试表格中的数据是否正确。
【例 1】
检查 MTours 随便一个网页中的表格内容是否正确

图像检查点
只限网页的测试。
只能检查网页中图片的某些属性是否正确,如 alt、href、src 等。
【例 1】
检查 MTours 随便一个图片的 alt 属性和 src 属性是否正确

数据库检查点
检查从数据库返回的结果集是否正确。
【例 1】
检查单机版小飞机数据库中的前 10 行数据是否正确(行/列/单元格)
Flight 的数据库:…\QuickTest Professional\samples\flight\app\flight32.mdb
【例 2】
检查新订一张票是否成功保存至数据库
select top 1 * from orders order by order_number desc

文本检查点
检查一段文本是否符合预期。
存在有乱码的缺陷。
【例 1】
检查 Flight 登录失败时的错误提示信息是否正确

位图检查点
检查图片的形状、像素等是否符合预期。
【例 1】
检查三角形网站中的图片是否正确

可访问性检查点
只限网页的测试。
主要检查图片的 alt 属性。
【例 1】
检查 MTours 随便一个网页中的图片是否都有 Alt 属性。
【例 2】
检查 alt.html 中的图片是否都有 Alt 属性。

XML 检查点
只限 XML 页面的测试。
用于检查 XML 节点的属性,如节点的数量、内容等。
【例 1】
检查 XML 文件的正确性

同步检查点
只能在脚本录制过程中插入。
适用于有动态变化的区域的检查,比如进度条。
【例 1】
检查插入订单后,进度条中的内容是否正确

检查点中使用正则表达式
正则表达式用来描述字符匹配,检查一个串内是否包含某种子串等。
通过正则表达式能够对输入数据的格式进行有效性验证,如电话号码、身份证号码、邮箱账号等

正则表达式中的元字符
在这里插入图片描述
在这里插入图片描述
正则表达式案例:
查看有 lo 的行
查看 lo 开头的行
查看 ov 结尾的行
查看 s 和 e 之间有 4 个字符的行
查看有 Sample 和 sample 的行
查看 sample 前面有大写字母的行
查看 sample 前面不是大写字母的行
查看 sample 后面是.的行
查看有连续 4 个 o 的行
查看有 love 或 hate 的行
查找格式合法的电话号码

检查点中使用正则表达式
【例 1】
录制计算器,除以 0,检查报错信息。
提示:.*表示多个任意字符
【例 2】
检查 Flight 选择的航班中是否有某些字符。
【例 3】
检查网页小飞机信用卡号是否符合格式。
检查点添加时选择 Value 属性。
在 Constant 文本框后点击“编辑”按钮,勾选正则表达式并输入正则表达式。
如[0-9]{16}表示 16 个数字,也可以写为\d{16},\d{16}和[0-9]{16}表示必须是 16 位数字,不能多不能少。

参数化

参数化的含义
参数表示变化的数据,参数化适用于有变化数据的场合

参数化的实现方法
Data Table 实现参数化
随机数参数
环境变量参数

修改参数表字体大小
保存脚本
在脚本文件夹中找到 Default.xls,修改字体大小
重新打开 QTP

输入数据的参数化
适用于文本框、下拉列表、列表框、网页单选按钮等控件。
【例 1】
单机版小飞机,给 3 个客户订不同时间、不同航班的票。
单机版索引号:参数化时注意要用 cbyte 转换数据类型
【例 2】
网页版小飞机,3 个用户订不同时间、不同航班的票。
数据库:
c:\Program files\Mercury Interactive\MercuryTours\Utils\MTours.mdb
网页索引号:全部使用“#索引号”,网页中不需要也不允许使用 cbyte

检查点参数化
【例 1】检查多张新订票是否成功保存至数据库
使用数据库检查点参数化
注意
select 语句中最好不要提取多余数据,因为数据库检查点一旦发现某列中有数据,就认为通过
精准提取数据
select top 1 * from orders order by order_number desc

随机数参数
【例 1】
随机选择航班出发地。
关键字视图中进行参数化;
parameter 中选择 Random Number;
指定随机数变动的数据范围;
必须命名。

数据表的处理
设置迭代次数
选择文件菜单下的设置命令
在这里插入图片描述
参数化加密数据
数据表中右击列—Data—Encrypt
注意不能重复加密。
加密后使用 setSecure 设置值

导入导出数据表
data table 中的列名是否保留无所谓;
导入时,列名要一致

输出值

输出值的含义
输出值用以输出软件中的实际结果

输出值的支持情况
在这里插入图片描述
使用输出值
输出实际结果
【例 1】输出航班班次选中的内容。
输出值充当中间结果
【例 1】单机版订票,新订航班后,会产生一个订单号,根据新的订单号查询订单。
右击 insert order 命令下的 order no 文本框——insert output value—选择 text—参数化—选择当前步后插入(注意延时)。
参数化打开订单的 Order No 文本框—找到 set,对其 Value 参数化—Name 选择 DataTable 中的 Order_No_text_out。

拆分Action

拆分 Action 的意义
在这里插入图片描述
Action 的含义和作用
Action 的含义
动作/操作;
是 QTP 脚本中的步骤集。
Action 的作用
使用 Action 方便描述业务流程。
拥有自己独立的 sheet。
具有独立的对象仓库

拆分 Action 的步骤
分割 Action
光标要在下一个业务的第一句。
起好名字,注意顺序。
将所有参数由全局(Global)变成局部
删除全局(Global)中的所有列和行
Action 的属性设定
右击要多次运行的 Action→Action Call Properties(操作调用属性)

QTP编写测试脚本

VBScript 基础知识

弹窗输出结果

msgbox
message box 的缩写,是一个系统函数,属于模式窗口。
msgbox “窗口提示文字”,图标+按钮类型,“窗口标题”  不能加括号;
提示文字使用常变量均可;
图标类型
16:出错图标
32:疑问图标
48:警告图标
64:友好消息
按钮类型
0:只有确定
1:确定、取消
2:中止、重试、忽略
3:是、否、取消
4:是、否
5:重试、取消
返回值变量=msgbox(“窗口提示文字”,图标+按钮类型,“窗口标题”)
括号不能省略。
返回值
确定:1
取消:2
中止:3
重试:4
忽略:5
是:6
否:7

print

print 常变量
是一个系统函数,属于非模式窗口,可以把以前的结果与现在的放到一起显示;
不能加括号。

变量、常量和数组

变量
变量名=值
不需要声明;
字符、字符串需要使用""定界
日期需要使用##定界
数值数据不能使用定界符

系统常量
vbcrlf
Carriage Return,Line Feed
回车换行。
vbtab
tab 键。
说明
vbcrlf 和 vbtab 均可以用于 msgbox 和 print 中。
双引号转义
不支持
使用""

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

系统函数

输入函数
变量=inputBox(“提示文字”,“窗口标题”)

查看数据类型函数
typeName(变量)

字符串函数
len(字符串)
left(字符串,个数)
right(字符串,个数)
mid(字符串,起始整数,个数)
trim(字符串)
chr(ASCII 码)
chr(9)
tab 键
可用于 msgbox 和 print
chr(10) & chr(13)
回车换行
仅用于 msgbox
asc(字符)
获得 ASCII 码。
数组名=split(字符串,“分隔符”,拆出的个数)
省略分隔符时,默认按空格拆,不含 Tab

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

逻辑函数
isdate(数据)
isnumeric(数据)

类型转换函数
cbyte
范围 0~255
cint
范围:-32768~32767
clng
cdbl

随机数函数
randomNumber(起始值,结束值)
运算符
+
 左右均为字符串时,可以连接字符串
 -  *  /
mod
数 1 mod 数 2
&
连接字符串常变量
= 等于
<>
不等于,不支持!= <、>、<=、>= and、or、not
与、或、非

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

select 分支
select case 表达式
case 值 1
语句 1
case 值 2
语句 2 …
case else
语句 n
end select

循环
while 循环
while 条件表达式
… wend

for…next 循环
for 变量=初值 to 终值 step 步长
… next

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

异常处理语句

基本语法
on error resume next
… 可能出错的语句

if err.number=? then
错误处理
end if

err 对象
err 对象用于存储错误信息。
err.description
提供错误信息的具体内容。
err.number
提供唯一的错误号

使用 VBScript 处理脚本
1 使用 if 解决脚本问题
解决 Flight 中日期变动导致回放失败的问题。
rq=date+1
yue=month(rq)
ri=day(rq)
nian=right(year(rq),2)
If yue<10 Then
yue=“0” & yue
End If
If ri<10 Then
ri=“0” & ri
End If
rq=yue & ri &nian
Window(“航班预订”).ActiveX(“MaskEdBox”).Type rq

锁定键盘和鼠标
systemUtil.blockinput
systemUtil.unblockinput

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

下拉列表和列表框的使用

存储列表对象
set 对象名=列表对象名
对象不支持 for each next。

存储列表中的内容为一个字符串
对象名.getContent
获取列表包含的项数
对象名.getItemsCount
获取选中项
对象名.getSelection
获取列表中的项目
对象名.getItem(下标)
下标从 0 开始
【例 1】单独输出下拉列表中的所有项
set qiDian=Window(“航班预订”).WinComboBox(“起点:”)
n=qiDian.GetItemsCount
For i=0 to n-1
print qiDian.GetItem(i)
Next

选取某项
对象名.select "文字"或下标
【例 1】随机选择航班
set banci=Window(“航班预订”).Dialog(“航班表”).WinList(“从”)
n=banci.GetItemsCount
i=randomNumber(0,n-1) '产生从 0 到 n-1 的随机数
banci.Select i

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

使用环境变量

查看内置环境变量
注意
内置环境变量区分大小写。
environment(“LocalHostName”)
客户机主机名
environment(“OS”)
操作系统名称
environment(“OSVersion”)
操作系统版本
environment(“UserName”)
计算机登录用户名
environment(“ProductDir”)
QTP 的安装路径
environment(“ActionName”)
操作/动作的名称
Environment(“TestIteration”)
迭代次数,用于 Global 表
Environment(“ActionIteration”)
迭代次数,用于 Global 以外的普通数据表
【例 1】使用环境变量控制打开软件一次
2 自定义环境变量赋值
environment(“变量名”)=值
【例 1】将代理名称存入环境变量。
environment(“AgentName”)=“haidian” 7 使用脚本添加检查点
对象名.checkProperty 属性名,属性值,超时时间
在规定时间内检查对象属性是否符合指定值要求。
加密数据的 text 属性无法获得。
属性值一般使用

micGreaterThan(值)
micLessThan(值)
micGreaterThanOrEqual(值)
micLessThanOrEqual(值)
micNotEqual(值)
micRegExpMatch(值)

【例 1】检查输入错误账号后是否提示正确的错误信息。
Set cuo=dialog(“登录”).Dialog(“航班预订”).Static(“文本位置原始的显示文字”)
cuo.CheckProperty “text”, “密码为 ““MERCURY”””,3
Static 标签文字必须入库;
只能进行精确匹配。
【例 2】检查机票数是否大于 0。

在脚本中使用正则表达式
正则表达式对象
set 对象名=new regexp
创建正则表达式对象
对象名.pattern
要查找的符合正则表达式要求的字符串
对象名.ignoreCase
忽略英文字母大小写
默认区分大小写
对象名.global
true 表示找所有项
默认 false 表示找第一项
对象名.test(字符串)
返回能否找到匹配字符串的布尔值
set 对象=对象名.execute(字符串)
在字符串中进行查找,结果存入对象中
【例 1】在多行文本中查找指定子串的行
xm=“zhsan” &vbcrlf & “lisi” &vbcrlf & “Zhw” &vbcrlf & “liuba” &vbcrlf & “zHqi” &vbcrlf &“songsi” &vbcrlf & “zhao6” Set guize=new regexp
guize.pattern=“zh.*” guize.ignorecase=true
guize.global=true
Set jg=guize.execute(xm)
For each x in jg
print x
Next

使用正则表达式选择列表项
【例 1】使用正则表达式选择班次
set cong=Window(“航班预订”).Dialog(“航班表”).WinList(“从”)
f=cong.GetContent '存为字符串
set reg=new regexp
reg.pattern=“12498.*” ’ reg.pattern=“.10:24 AM.
reg.global=true
Set fs=reg.execute(f) '存为字符串对象
For each i in fs
xuan=i.value
Next
cong.Select xuan
若直接使用 fs,不论几项,均写为:cong.select fs(0).value

检查点中使用正则表达式
【例 1】检查输入错误账号后是否提示正确的错误信息。
Set cuo=dialog(“登录”).Dialog(“航班预订”).Static(“文本位置原始的显示文字”)
cuo.CheckProperty “text”,micRegExpMatch(“.预期结果.”),3
Static 标签文字必须入库
使用脚本处理数据表
操作 sheet 表
增加 sheet 表 DataTable.AddSheet “表名”
获得/打开 Sheet 表
DataTable.GetSheet "表名"或表编号
编号从 1 开始
表名区分大小写。
删除 Sheet 表
DataTable.DeleteSheet "表名"或表编号
编号从 1 开始

操作 sheet 表中的行和列
增加参数/列
DataTable.GetSheet(“表名"或表号).AddParameter 参数名,值
值必须加
插入参数重名时,表中会自动增加一列,列名后自动加 1
注意:使用命令操作数据表时,数据在代码运行时可见,结果分析中的运行时表格中可见。
参数赋值/为指定列指定行赋值
DataTable.GetSheet(“表名”).GetParameter(列号或"列名”).ValueByRow(行号)=值
获得/读取参数(值)/读取指定列指定行的数据
DataTable.GetSheet(表号).GetParameter(列号或"列名").ValueByRow(行号)
获得参数名
变量名=DataTable.GetSheet(“表名”).GetParameter(列号).Name
删除参数
DataTable.GetSheet(“表名”). DeleteParameter "列名"或列号
列号从 1 开始。

统计 sheet 表中相关个数
获得表总个数
DataTable.GetSheetCount
获得参数总个数
DataTable.GetSheet(表号).GetParameterCount
获得行数
DataTable.GetSheet(表号).GetRowCount

导入导出 sheet 表
导出数据表
DataTable.ExportSheet “excel 文件路径”,"表名"或表号
导入数据表
DataTable.ImportSheet “excel 文件路径”,excel 工作表编号,“datatable 的表名”  excel 工作表编号表示 Excel 中第几个 sheet,编号从 1 开始,也可以写工作表的名字。
datatable 表名必须事先存在。

访问数据库
基本步骤
创建数据库连接对象
Set conn=CreateObject(“adodb.connection”)
指定数据源
conn.ConnectionString = “provider=OLEDB 驱动名称;Data Source=数据库地址;其他参数”  连接数据库
conn.open
连接状态 conn.state
=1 成功
=0 失败

创建记录集对象
Set rs=createObject(“adodb.recordset”)
指定 sql 语句
sql=“select order_number,customer_name from orders”  打开表获得数据
rs.Open sql,conn,3,1
3:向前向后的游标
1:只读数据
打开表后,如果表里有数据,则行指针默认指向第 1 行
记录行数
rs.recordcount
记录集指针/行指针
表示正在处理的记录位置,简单说就是现在正在处理第几行
rs.bof
是否位于第一条记录之前
rs.eof
是否位于最后一条记录之后
移动行指针
rs.movePrevious
指向前一行
rs.moveNext
指向下一行
rs(i)
获得当前行第 i 列的数据/值,i 从 0 开始
也支持 rs(“列名”)的写法
rs.Fields(i).name
获得第 i 列的列名
将数据显示在数据表中
datatable.AddSheet “Flight” datatable.GetSheet(“Flight”).AddParameter rs.Fields(0).Name,rs(0)
datatable.GetSheet(“Flight”).AddParameter rs.Fields(1).Name,rs(1)
For i=2 to rs.RecordCount
rs.MoveNext
datatable.GetSheet(“Flight”).GetParameter(1).ValueByRow(i)=rs(0)
datatable.GetSheet(“Flight”).GetParameter(2).ValueByRow(i)=rs(1)
Next
关闭记录集和数据库
rs.close
conn.close
释放记录集数据库对象
Set rs = Nothing
Set conn = Nothing
不同数据库的连接字符串
访问 Access2010
conn.ConnectionString=“provider=microsoft.ace.oledb.12.0;Data
Source=E:\HP\QuickTest Professional\samples\flight\app\flight32.mdb”  访问 SQL Server 2008
conn.ConnectionString=“Provider=SQLOLEDB.1;Data Source= 服 务 器 地 址 ; Persist
Security Info=False;User ID=sa;password=数据库密码;Initial Catalog=数据库名”  访问 Oracle11g
conn.ConnectionString = “Provider=OraOLEDB.Oracle.1;User
ID=system;Password=123456;Data Source=(DESCRIPTION =(ADDRESS_LIST
=(ADDRESS = (PROTOCOL = TCP)(HOST = 服 务 器 IP)(PORT = 1521)))
(CONNECT_DATA =(SERVICE_NAME = orcl)));Persist Security Info=False”

描述性编程
为什么使用描述性编程
制脚本会依赖于对象库,没有添加到对象库的对象在运行脚本时会出错。
描述性编程不依赖于对象库的存在。
使用菜单录制不成功时,可以考虑描述性编程。
直接描述
对象类型(“属性 1:=属性 1 的值”,“属性 2:=属性 2 的值”,…)
描述性编程具有“后续强迫性”,一旦语句使用了描述性编程,则该语句到结束必须一直都用描述性编程的方式。
如属性值中有( )等特殊字符,需要使用\进行转义。

自定义函数
sub 函数
sub 函数名(参数表)
函数体
end sub
无参数也须用括号。
无返回值。
调用
无参数
call 函数名
或直接用函数名(括号可省)
有参数
函数名(参数表)
直接写函数名调用函数时,括号用空格代替。
使用 call 调用时括号不能省略

function 函数
function 函数名(参数表)
函数体
函数名=返回值
end function
有返回值,函数名即返回值,一般写法是“函数名=返回值”。
调用
变量=函数名(参数表)
括号不能省略。

函数复用
文件→新建函数库
Function f1
msgbox “hello” End Function
Function f2(a,b)
f2=a+b
End Function
新建测试,导入函数
loadfunctionlibrary “e:\库 1.qfl”
f1
print f2(3,4)

批量运行测试
开始菜单→程序→QTP→Tools→Test Batch Runner
按顺序依次运行,不能同时运行。
注意
需要开放 QTP 允许外部工具调用的权限
选项→运行→允许其它 HP 产品运行

selenium基础

简介

什么是 Selenium
Selenium 是一个用于测试 Web 应用程序的自动化工具。
Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。
主要功能
测试系统功能
创建回归测试检验软件功能和用户需求。
测试与浏览器的兼容性
测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上

什么是 Selenium

 Selenium 是一个用于测试 Web 应用程序的自动化工具。
 Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。
 主要功能
 测试系统功能
 创建回归测试检验软件功能和用户需求。
 测试与浏览器的兼容性
 测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上

Selenium 的版本

Selenium Core
2004 年,在 ThoughtWorks 公司,Jason Huggins 为了减少手工测试的工作量,自己实现了一套基于 JavaScript 语言的代码库,使用这套库可以进行页面的交互操作,并且可以重复地在不同浏览器上进行各种测试操作。通过不断地改进和优化,这个代码库逐步发展成 Selenium Core。
Selenium 开源、免费,甚至可以根据自己的使用需求来进行深入的定制化,改写其原有的一些功能

Selenium RC
同时 Bea, Dan Fabulich 和 Nelson Sproul 等人修改架构为独立服务模式,期间有多位开发人员加入开发并推出了 Selenium RC 和 Selenium-IDE。
Selenium RC(Remote Control)即 Selenium 1
支持更多的浏览器,支持更多的编程语言(如 Java、JavaScript、Ruby、
PHP、Python、Perl 和 C#)
Selenium IDE(集成开发环境)
Firefox 插件,需要联网下载,早先支持脚本导出。
提供图形界面来录制和回放脚本。
此插件只是用来做原型的工具,并不希望测试工程师使用此工具来运行大批量的测试脚本

Selenium WebDriver
简称 WebDriver,即 Selenium 2
2006 年,Google 的工程师 Simon Stewart 开启了一个叫作 WebDriver 的项目,此项目可以直接让测试工具调用浏览器和操作系统本身提供的内置方法,以此来绕过 JavaScript 环境的沙盒限制,WebDriver 项目的目标就是为了解决Selenium 的痛处。2008 年,Selenium 和 WebDriver 这两个项目进行了合并,也就是我们现在常常看到的 Selenium WebDriver(简称 WebDriver)。提供了极佳的特性,如面向对象 APl,提供 Selenium1 的接口用于向下兼容

Selenium 支持的浏览器

Google Chrome
IE6、7、8、9、10 和 11
Mac 操作系统的 Safari 默认版本均支持
Firefox 的大部分版本
Opera
HtmlUnit
Android 手机操作系统的默认浏览器
iOS 手机操作系统的默认浏览器

Selenium 的原理

WebDriver 直接利用浏览器的内部接口来操作浏览器。
对于不同平台中的不同浏览器,必须依赖浏览器内部的 Native Component(原生组件)来实现把 WebDriverAPI 调用转化为浏览器内部接口的调用。WebDriver 使用系统的内部接口或函数,首先要找到这个元素的坐标位置,并在这个坐标点触发一个鼠标左键的单击操作。由此可以看出,WebDriver 能更好地模拟真实的环境,仅能测试那些可见的页面元素。

WebDriver 能够实现与浏览器进行交互,在目标浏览器里启动一整套 WebService,这套 Web Service 使用了 Selenium 自己设计定义的协议,名字叫做The WebDriver Wire Protocol。

WebDriver Wire 协议是通用的,不管是 FirefoxDriver 还是 ChromeDriver,启动之后都会在某一个端口启动基于这套协议的 Web Service。之后 HTTPrequest 的 body 中,会以 WebDriver Wire 协议规定的 JSON 格式的字符串来告诉 Selenium 我们希望浏览器接下来做什么事情。
采用 Client-Server 模式
客户端发送一个 requset,服务器端返回一个 response。Client 是调用WebDriverAPI 的机器,Server 是运行浏览器的机器。
服务器端需要维护浏览器的 Session,从客户端发过来的请求头中包含了Session 信息,服务器端将会执行对应的浏览器页面。
WebElement 是 WebDriverAPI 中的对象,代表页面上的一个元素。

Selenium2(WebDriver)的优点

Selenium 必须操作真实的浏览器,但是 WebDriver 可以使用 HtmlUnit 进行测试,在不打开浏览器的情况下进行快速测试。
WebDriver 基于浏览器的内部接口实现自动化测试,更接近用户使用的真实情况。
WebDriver 提供了更简洁的面向对象 API,提高了测试脚本的编写效率。
WebDriver 在使用过程中无须单独启动 Selenium Server

Selenium 与 QTP 对比

在这里插入图片描述

基于python语言的selenium

基于 Python 语言的 Selenium 环境搭建

安装 python
这里安装 3.6 版
注意勾选添加环境变量
安装 selenium
pip install selenium-3.12.0-py2.py3-none-any
准备浏览器驱动器
IEDriverServer、chromedriver(google)、geckodriver(Firefox)
webdriver.Ie()、.Chrome()、.Firefox()
均无需安装,复制到\Python36-32 中即可
HTMLTestRunner.py
无需安装或配置
用于生成测试结果报告
可以自己修改

编写脚本

导入包
from selenium import webdriver
from selenium.webdriver.support.select import Select
用以支持下拉列表对象
from time import sleep

打开和关闭浏览器

driver=webdriver.Ie()
webdriver.Chrome()
webdriver.Firefox()
driver.close()
关闭浏览器
driver.quit()
关闭浏览器以及浏览器驱动程序

打开 Url
driver.get(“url 地址”)

等待时间
sleep(3)
wait 3s
driver.implicitly_wait(3)
隐性等待时间为 3 秒

切换框架/窗口

使用 switch_to 包
定位到当前聚焦的元素上
driver.switch_to.active_element()
切换到 alert 弹窗
driver.switch_to.alert()
切换到主页面
driver.switch_to.default_content()
切换到某个 frame
driver.switch_to.frame(编号或 name)
切换到指定的 window_name 页签
driver.switch_to.window(window_name)
切换到上一层的 frame
driver.switch_to.parent_frame()

定位页面元素

driver.find_element_by_  name(“login”)
id
xpath
tag_name
link_text
partial_link_text
class_name
driver.find_elements_by_  name(“控件 name 名”)[下标]
Select(driver.find_elements_by_?)
用于识别下拉列表元素
需要导入包
from selenium.webdriver.support.select import Select

页面元素的属性和方法

driver.title()
获得网页标题
对象.text
获得页面元素的文本值
属于属性
对象.get_attribute(“属性名”)
获得指定属性的值
Select(对象).select_by_value
需要导入包
from selenium.webdriver.support.select import Select
select_by_index
select_by_visible_text
deselect_all()
取消所有选项
deselect_by_index()
取消对应 index 选项
deselect_by_value()
取消对应 value 选项
deselect_by_visible_text()
取消对应文本选项
first_selected_option()
返回第一个选项
all_selected_options()
返回所有的选项
页面元素.send_keys(“数据”)
用于键盘输入数据
页面元素.click()
支持单选按钮、复选框、命令按钮

增强脚本

检查点
in 运算符
str1 in str2
用于判断 str1 是否存在于 str2 中

if 语句
if (条件表达式):
语句
else:
语句
括号可以省略
语句必须缩进
英文冒号不能省略

参数化

for 循环
for i in range(初值,终值+1):
语句
冒号不能省略
range 表示范围
语句必须缩进

读 txt 文件
file=open(文件名,‘r’)
返回文件对象,文本默认编码方式是 UTF-8。
'r’表示只是读,默认项。
读取时默认会将平台有关的行结束符(Windows 中是\r\n)转换为\n。
文件名外使用 r 可以禁止\转义。
遍历文件
for 变量 in file
输出变量即可读出整个文件。
按行读出。
list=file.readlines( )
把文件中的所有行读到一个列表中,换行符可读出。
len(list)
返回列表中的元素个数
关闭文件
file.close( )
释放文件占用的系统资源

读 excel 文件
安装 pandas
pip install --no-index --find-links=包位置 -r requirements.txt
requirements.txt 中记录着所有需要的依赖包和版本号
验证是否成功
python→import pandas
导入包
import pandas
获得数据
data=pandas.read_excel(“xls 文件名”,sheet_name=sheet 表编号或名称,names=[新列名列表],dtype={“新列名”:类型},,skiprows=跳过数据行的行数,header=None表示没有列名)
默认认为包含列名
获得全部数据,结果为 DataFrame(字典,列名为关键字)
datalist=data.values.tolist()
返回列表

访问数据库
安装 pymysql
用于支持 python 连接 mysql。
pip install pymysql…tar.gz
连接数据库
conn=pymysql.connect(host=‘服务器 IP’, port=3306, user=‘用户名’, passwd=‘密码’, db=‘数据库名’,charset=‘utf8’)
port=3306,不能加引号,charset='utf8’可省略,此时使用默认端口和字符集。
用游标读取数据
cur=conn.cursor( )
sql=select 语句
cur.execute(sql)
data=cur.fetchall( )
获得数据(元组)
cur.close( )
conn.close( )
关闭游标和数据库
用游标插入数据
conn=pymysql.connect(…)
cur=conn.cursor( )
sql=‘insert into 表名 values(%d, “%s”)’ % (变量或常量 1,变量或常量 2)
%s 必须加引号,%d 可加可不加。
(变量或常量 1,变量或常量 2)是元组。
cur.execute(sql)
conn.commit( )
用于提交数据,不可省略。
cur.close( )
conn.close( )
批量提交数据
将很多数据写入数据库时,使用循环每次写入数据会导致服务器压力很大,可以一次性提交批量数据。
列表.append((变量 1, 变量 2, …, 变量 n))
必须加括号,元组存入列表。
sql=‘insert into 表名 values(%s, %s, %s, …%s)’  一律使用%s,%s 与变量个数对应,不能加引号。
cur.executemany(sql, 列表)
conn.commit( )
cur.close( )
conn.close( )

unittest 和 pytest 测试框架

unittest 测试框架

1 导入包
from selenium import webdriver
from selenium.webdriver.support.select import Select
from time import sleep
import unittest

2 创建类
2.1 全局变量
driver=None
定义驱动器
放在模块(即文件中),不要放在类中

2.2 创建测试类
class 类名(unittest.TestCase)
括号内表示继承
不能省略

2.3 创建初始化和还原环境的函数
setUpClass(cls)
必须使用@classmethod 装饰器
cls 不能省略
所有测试函数运行前运行一次
tearDownClass(cls)
必须使用@classmethod 装饰器
cls 不能省略
所有测试函数运行完后运行一次
setUp(self)
每个测试函数运行前运行
self 不能省略
tearDown(self)
每个测试函数运行完后执行
self 不能省略
说明
这些函数都放在类中

测试函数
def 函数名(self):
u’‘‘测试描述’’’ global driver
其他测试代码
函数名必须以 test 开头
self 不能省略
u"““测试描述””"  可以省略,省略时显示函数名
global driver 用于指定 driver 是全局变量,只放在 setUpClass 中即可
多个测试函数按照函数名的 ASCII 顺序执行

运行测试
if __ name __ == “__ main __”:
unittest.main(verbosity=2)
上述代码放在模块内,类之外
_是双下划线
if _ name _ == "
_main __"表示当单独运行模块时才会被执行,import 到其他
脚本中是不会被执行
verbosity=2
显示每个用例的详细信息
可以省略,但测试结果不详细
测试结果
. 代表测试通过。
F
代表测试失败,F 代表 failure。
E
代表测试出错,E 代表 error。
s
代表跳过该测试,s 代表 skip。

断言
assert str1 in str2,断言失败时的消息文本
assert 表达式 1==表达式 2
self.assertIn(str1,str2)
断言 str1 是否在 str 中
self.assertEqual(实际,预期)

参数化

安装 nose_parameterized
pip install …
导入包 parameterized
包名不是 nose_parameterized
import parameterized
定义参数数据
data=[ [ 数据 11,数据 12 ] , [ 数据 21,数据 22 ]]
参数放在列表中
引用参数
@parameterized.parameterized.expand(data)
def test…(self , 参数 1,参数 2,…):
self 不能省略
参数的个数应与列表中的个数一致
可以实现局部迭代

测试套件

批量运行测试套件中的测试用例
指定运行一个模块中的一个测试
suite=unittest.TestSuite()
创建测试套件(测试用例的集合,测试容器)
suite.addTest(类名(“测试函数名”))
将一个测试用例到测试套件中
不能省略类名
runner=unittest.TextTestRunner()
指定使用 TextTestRunner 运行测试用例
runner.run(suite)
运行测试套件

指定按顺序运行一个模块中的多个测试
suite=unittest.TestSuite()
tests=[类名(“测试函数 1”) , 类名(“测试函数 2”) , …]
只执行指定的测试函数
按照编写的顺序执行测试
多个测试放到列表中
不能省略类名
若一个测试的执行依赖于其他测试,可以使用此方式解决
suite.addTests(tests)
将测试添加到测试套件中
runner=unittest.TextTestRunner(verbosity=2)
可以指定测试结果的详细程度
runner.run(suite)

自动发现多个测试
创建多个测试模块
在模块内编写测试类和测试函数
最好创建运行测试套件的单独的模块
创建类与否,均可
创建测试套件
suite=unittest.TestSuite()
指定测试用例的识别规则
tests=unittest.defaultTestLoader.discover(" 测 试 模 块 所 在 目 录 ", pattern=‘test*.py’)
识别所有 test 开头的 py 文件为测试用例
按模块名称顺序执行
suite.addTests(tests)
runner=unittest.TextTestRunner(verbosity=2)
runner.run(suite)

测试报告
测试报告可以生成多种形式,如 txt、html、xml 等。
最好创建运行测试套件的单独的模块
导入包
import HTMLTestRunner
可以自行修改此文件
创建测试套件
suite=unittest.TestSuite()
tests=unittest.defaultTestLoader.discover(" 测 试 模 块 所 在 目 录 “, pattern=‘test_*.py’)
suite.addTests(tests)
运行测试,保存报告
now = time.strftime(”%Y%m%d %H%M%S",time.localtime())
获取当前时间并设置时间格式
reportFile=“./”+now+“_result.html”  测试报告的存放路径及文件名,文件名中加了当前时间以便每次生成
不同的测试报告
fp=open(reportFile,‘wb’)
runner=HTMLTestRunner.HTMLTestRunner(stream=fp, title=u’报告标题功 能测试报告’, description=u’报告的说明与描述’, tester=u’测试员姓名’)
runner.run(suite)
fp.close()
关闭文件流,不关的话生成的报告是空的

pytest测试框架

pytest 简介与安装
pytest 简介
pytest 是一个非常成熟的全功能的 Python 测试框架,主要特点:
简单灵活,容易上手,文档丰富;
支持参数化,可以细粒度地控制要测试的测试用例;
能够支持简单的单元测试和复杂的功能测试,还可以用来做 selenium/appnium
等自动化测试、接口自动化测试(pytest+requests);
pytest 具有很多第三方插件,并且可以自定义扩展

pytest 的命名规则
测试模块名建议使用 test_开头或_test 结尾
测试类必须以 test 开头或结尾
测试函数必须以 test 开头或结尾

安装 pytest
pip install --no-index --find-links=所有依赖包包位置 -r requirement.txt
安装完成后,python→import pytest 不报错说明安装成功

编写测试脚本
编写测试类和测试函数
class 类名():
@fixture(scope=?)
def 初始化函数名(必须写 self 或 cls):
代码
def 测试函数名(必须写 self 或 cls , 初始化函数名):
代码
类不需要继承
fixture 的功能
传入测试中的数据集
配置测试前系统的初始状态
为批量测试提供数据源
scope=?
scope=“function”
每个 test 都运行。
scope=“class”
每个 class 的所有 test 只运行一次
scope=“module”
每个 module 的所有 test 只运行一次
scope=“session”
每个 session 只运行一次
初始化函数名被@fixture 修饰,不带括号,根据实际情况添加

运行测试
IDLE 界面中启动
if _ name_==‘_ _main __’:
pytest.main([‘-s’,‘模块名.py’])
命令行中运行测试
推荐此种方式
pytest 参数 py 文件名
按照类中测试函数编写的先后顺序执行。
允许省略参数
-v
用于显示每个测试函数的执行结果
-q
只显示整体测试结果
-s
用于显示测试函数中 print()函数输出

断言
assert 表达式,断言失败消息文本

参数化
@pytest.mark.parametrize(“参数 1 , 参数 2” , [ [‘数据 11’ , ‘数据 12’ ] ,[‘数据 21’ , ‘数据 22’ ]
])
def 测试函数名(self 或 cls , 参数 1,参数 2):
代码

批量测试
运行一个指定的测试函数
pytest 模块名.py::类名::函数名
pytest -k keyword 模块名.py
运行函数名中带有 keyword 关键字的测试函数

运行多个指定的测试
pytest 模块名.py::类名::函数名 1,模块名.py::类名::函数名 2,…
pytest -k “keyword1 or keyword2” 模块名.py
运行函数名中带有 keyword1 或 keyword2 关键字的测试函数

运行一个类中的所有测试
pytest 测试模块名.py

运行目录中的的所有测试
当前目录
pytest
只运行符合命名规则的测试
指定目录
pytest 目录
只运行符合命名规则的测试

测试报告
需要先安装 pytest-html
无需导包
pytest 模块名.py --html=report.html --self-contained-html
直接 html 独立显示
美化报告
复制 conftest.py 到测试模块目录
可自定义此文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值