自动化测试
静态自动化:代码检测,类似于编译工具的编译系统
动态自动化:
基于浏览器和DOM对象的自动化:selemnium,Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7、8、9)、Mozilla Firefox、Mozilla Suite等。这个工具的主要功能包括:测试与浏览器的兼容性--测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能--创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成Net、Java、Perl等不同语言的测试脚本。
基于GUI(图形用户界面(Graphical User Interface),简称 GUI)的自动化,模拟用户使用行为,调用api接口程序,实现测试自动化:uft/qtp,执行重复的手动测试,例如要测试哪些功能、操作步骤、输入数据和期望的输出数据等。提供符合所有主要应用软件环境的功能测试和回归测试的自动化。
UFT/QTP
录制 | 支持 |
被测系统 | 支持B/S和C/S |
对象识别 | 强 |
对象库 | 支持 |
IDE | 强 |
回放 | 速度快 |
脚本编写 | 方便 |
支持语言 | VBScript |
函数库 | 支持 |
测试结果 | 支持 |
与其他测试工具联动 | 支持 |
自身扩展 | 弱 |
价格 | 昂贵 |
Unified Functional Testing(UFT)称为统一功能测试,原名为QuickTest Professional。Unified Functional Testing 11.5将HP QuickTest Professional和HP Service Test整合到一个软件包中,重新起名为Unified Functional Testing。
Unified Functional Testing以前称为HP QuickTest Professional(QTP),可为软件应用程序提供自动化功能和回归测试。
HPE Unified Functional Testing支持关键字和脚本界面,并具有图形用户界面。它使用Visual Basic Scripting Edition(VBScript)脚本语言来指定一个测试过程,并操纵被测试应用程序的对象和控件。
进入软件前,可以勾选插件,比如:active X,visual basic,然后进入软件。
可以使用UFT自带的“Flight GUI”练习。
Window("Micro Focus MyFlight Sample").Type "John"
Window("Micro Focus MyFlight Sample").Click 218,289
Window("Micro Focus MyFlight Sample").Type "HP"
Window("Micro Focus MyFlight Sample").Click 178,349
但是实际项目中,请拒绝录制。因为靠“录制”是做不了项目的,甚至连一个demo都做不出来。
因为自动化测试项目和软件开发项目同属软件工程学,只有直接编码才能出色地根据之前的设计思想来完成脚本。如果是靠“录制+加强”的模式,那就不可能按照前面定制的设计方法和思想来开发测试脚本。
录制功能更多的是新人学习时的利器。
对象,是QT(QuickTester)中操作的基本元素,代表软件产品中基本的UI组件,例如在WEB或Windows应用中,一个菜单,按钮,图形热点,标签,输入框等都是典型的QT对象。通过多种属性的组合可以定义一个对象,同样在测试环境中,通过一组属性可以唯一定义一个对象,QT通过对象属性在测试环境中定位一个操作的基本元素。任何一个测试脚本语句,都是以一个操作对象为基础,通过对操作对象测试行为控制,形成测试脚本。
对象库,是用于储存被测应用程序界面对象(界面元素)的地方。QuickTester通过对象库对测试程序的元素进行管理,建立测试脚本时,将测试人员需要操作的对象信息保存到对象库中。
QT将对象都保存在对象库,这样对象可以被集中管理。测试脚本(一个或多个)可以根据自身也许需求随意调用这些对象来使用,减少冗余。任何需要操作的对象都需要先添加到对象库中,之后才能执行操作(描述性编程不需要使用对象库中的对象)。
UFT有两种回放模式:
有时候Click事件处理不了,但鼠标点击却可以;还有有时候需要使用鼠标右键。
可以在Tools-Options-Web-Advanced切换,也可以通过代码控制(推荐),比如FireEvent "onclick"
UFT支持两种视图,一种是Keyword View(关键字视图),另一种是Expert View(专家视图)。
Keyword View(关键字视图):是一种图形化的视图。
Expert View(专家视图):对于关键字视图中的每个节点,在专家视图中都对应一行脚本。也叫脚本视图,用于取得测试对象的某个属性的值。
怎样切换关键字视图和专家视图?
参考:QuickTester对象,对象侦测器和对象库_weixin_30604651的博客-CSDN博客
对象探测器是用来查看对象所支持的方法和属性。启动对象探测功能:Tools->Object Spy…。
点击指针按钮,然后选择一个对象。当选择了Test Object Properties按钮,属性标签页中就会显示出所有可得到的TO属性,并且在方法标签页中会显示所有可获得的方法,如图所示:
To属性:获取的是对象的属性,可以理解为静态的属性,在运行时的输入东西与它无关。
测试对象的属性是UFT为了识别在测试执行过程中的运行时对象而保留在对象库中的属性。GetToProperty/GetToProperties和SetToProperty则分别用于读取和修改To的属性值。
GetToProperty("封装属性名") 用于取得测试对象的某个属性的值,
GetToProperties 用于取得测试对象的所有属性的值,
SetToProperty "封装属性名","封装属性值" 用于设置测试对象的某个属性的值
Ro属性:是变的(用户名框输入不同的值,这个Ro属性取出来就是不一样)
GetRoProperty方法用于取得运行时对象(实际对象)的某个属性的值
'x为WebEdit对象运行时的value属性值
x = Browser("").Page("").WebEdit("").GetROProperty("value")
Msgbox x
F1查看帮助文档-object model reference for GUI testing-standard window-相应的对象
methods:有相应的方法,
UFT用对象库对对象进行管理,记录的对象和这些对象的属性都存储在对象存储库中。(描述性编程不需要使用对象库)
Resources-ObjectRepository
对象是怎样被添加到对象库的?
1通过录制与被测应用程序的交互过程添加,有层次结构
2.手工添加一个或多个对象。Resources-ObjectRepository-AddObject,点击要添加的对象,以手动添加对象到对象。(如果我们要添加的对象再鼠标点击后才出现,我们可以先按下Ctrl键以临时屏敝对象选择模式,一日往备好了要添加的对象,放开Ctr键然后再去点击。如果我们需要在不同应用程序间切换,可以先按住CTRL+ALT组合键屏蔽对象选择模式,然后使用例如ALT+ TAB组合键来在不同的应用程序间切换,完成切换后,再次按下CTRL+ALT组合键就可以进入对象选择模式并添加对象)
(录制时插入,不常用)
怎么添加标准检查的:
添加的检查点在 资源-对象库里面管理:
1.可以在这里修改value的值,检查 value 是不是等于相应的值。
2.也可以判断检查点(此时value被改成了空格)
3.如果用代码的形式实现,通过GetRO/GetTO(此时删除了检查点):
如果是标准检查点,选择的是默认的WebElement:编辑
如果是表格检查点,选择WebTable
有√表示检查,双击把√去掉表示不检查
选择想要检查的页面,右键,插入标准检查点,选择Page
load time:加载时间
number of images:页面中的图像个数
number of links:页面中的链接个数
右键,插入输出值
运行结果:
登录
切换到关键字视图
编辑姓名/密码参数
数据池(DataTable)提供了一种创建数据驱动驱动测试用例的方式,类似于excel电子表格,并可多次循环运行一个操作模块(Action)。每一个测试用例都有一个全局数据表,所有的操作模块都可以访问这个全局数据表。每一个操作模块都有一个私有的数据表,称谓局部数据表。
(1)新建一个EXCEL文件,存在 C:\FlightCase.xlsx
(2)怎么用UFT从EXCEL中取数据
查找:
DataTable.ImportSheet "参数1",参数2,参数3
把EXcel表格中的数据导入到QTP的datatable中,
其中参数1为要导入的EXCEL文件的绝对路径;
参数2用于确定要导入的EXCEL文件的第几个sheet;
参数3用于确定要导入到本的datatable的第几个表中。
在UFT编辑代码
结果:
将测试数据从excel导入,自动化执行,最后再将结果导出到文件。
修改:加上判断和异常,执行所有测试用例
当被测应用需要消耗一定的时间来响应一个操作时,可能会出现应用程序控件还没有准备好,脚本已经执行到了下一步了。这种情况下,UFT通常就会抛出一个错误。
同步点就是在测试脚本的特定执行步骤前智能地插入停顿时间或等待时间。
新建或打开一个GUITest,然后去File-setting-run设置objectsynchronizationtimeout,默认20秒。
全局设置,如果超过20秒还找不到,系统就会提示对象无法识别。
Disable smart identification during the run session
Wait 5 '等待五秒钟
WaitProperty("属性名称",“属性值”,超时时间ms)
返回类型为boole类型,True或False
比如:object.WaitProperty("text""Insert Done",2000)
比Wait灵活一些
实例:等待按键被启用,最多等5秒
'选择option1
Browser("..").Page("..").WebList("List").Select("Option1")
Browser(".."). Page("..").WebButton("Next").WaitProperty("Enabled",True,5000)
'点击下面的按钮
Browser("..")Page("..").WebButton("Next").Click
针对B/s结构,浏览器加载情况。只有完全加载成功(load完成)后才会执行下一步操作。
'选择option1
Browser["..").Page("..").WebList("List").Select("Option1")
'等待页面被下载
Browser("..").Sync
'点击下面的按钮
Browser"..")Page("..").WebButton("Next").Click
描述对象的属性以及属性值来编程
Browser("micClass:=Browser").Page("micClass:=Page").WebEdit("name:=wd").Set "UFT自动化测试"
优点:1.节省资源空间,此种方法不需要对象库里有这个对象 ,若是存在对象库,会占用资源空间
2.如果是动态对象,难以录制,可能需要录制多个,但通过编程-变量可以很简单地实现
systemutil.Run "url或application路径"
创建description对象:Set
强制属性识别
方法2 :
用记事本写脚本,后缀名改成.vbs, executefile"文件路径"
11.3录制+description对象实现案例
修改:+description对象
11.4描述性编程和对象库编程对比
描述性编程
对象库编程
库函数文件是包含VBScript脚本的纯文本格式文件,用来声明方法、变量、类等。库函数文件可以用任意后缀名,最常见的是VBS和TXT。库函数文件可以用来组织存放不同功能的代码,它提供了在不同的UFT脚本中分享代码的方法。
1. ExecuteFile
在运行时动态加载库函数文件,使用ExecuteFile方法。
在一个Action中使用此方法时,库函数文件及其内容只能在当前Action可见。
本地作用域是指所有在Action中定义的作用区域,不可被此Action之外所访问。
2. LoadFunctionLibrary
'动态调用函数库LoadFunctionLibrary 方式
LoadFunctionLibrary "c:\iquicktest.vbs"
'调用函数库中的q1方法
Call q1
关联一个全局库函数文件:Test->Settings...->Resources,添加库函数文件
Tips:多个库函数文件加载顺序是从下到上,如果有两个库函数文件包含相同函数,那么会使用靠近顶部的。
全局作用域是UFT加载所有测试资源和测试恢复库所在,测试脚本中所有的Action都可以访问。
执行作用域:
环境变量是一种非常特殊的变量类型。环境变量是可以贯穿UFT Test 中的每一个 Action,并可供所有 Actions 调用。这些变量值会在UFT运行过程中被初始化,并且会一直持续到脚本运行完毕为止。UFT的环境一般应用于 Actions 之间的信息共享、场景恢复以及函数库。注意,这里的环境变量与 windows 本身的环境变量并不是一个概念。Windows 环境变量是在本地系统上的所有程序都可访问到,而 UFT环境变量只是可以在测试脚本运行时才可访问。
在UFT中有三种类型的环境变量:
通过Environment对象可以访问到所有环境变量的值。
UFT提供的已经规定好的常用配置信息的环境变量,比如当前执行的测试脚本名、测试脚本路径、操作系统类型、UFT的版本、本地机器名等。
Test-Settings-Environment-built in可以查看当前可使用的内置环境变量。
可以省略value,简写:Environmen("TestName")
Environmen.Value("UserName") 获取用户名
Environmen.Value("TestDir") 获取测试脚本所在绝对路径(不包括后面的 \),会打印到当前文件夹
Environmen.Value("TestName") 获取测试脚本名称
Environmen.Value("OS") 获取环境名称
Environmen.Value("OSVersion") 获取环境版本
1.理解用法
2.获取当前脚本所在路径(不含测试脚本文件夹)
结果:C:\
3.把当前脚本定义成一个function
用记事本编辑一个文件
在action中调用
结果:
user defined Internal:用户自定义变量可以在UFT Test脚本中直接定义及保存,并且可以在运行时进行动态修改。
方法1. Test-Settings-Environment-用户定义,设置用户定义变量
然后赋值给变量
user defined external:定义在外部文件中的环境变量。这些变量为只读且无法在运行时动态修改。在QTP Test脚本中,可以直接通过LoadFromFile方法动态调用外部环境变量文件。
使用XML文件
使用ExternalFileName判断,使用LoadFromFile导入。
①准备好XML文件
②在 Test-Settings-Environment 导入
需求:
代码:
用UFT生成报告
Function VerifySQLData(ConnectionStr,sqlStr,verifyProperty,expectValue)
'创建数据库连接对象
Set adoConn = CreateObject("adodb.Connection")
'利用数据库连接字符串打开数据库
adoConn.Open ConnectionStr
'执行sql语句并返回对应的结果集
Set adoRst = adoConn.Execute(sqlStr)
'获取实际值
actualValue = adoRst.Fields.Item(verifyProperty).Value
'对比预期值和实际值
If cstr(expectValue) = cstr(actualValue) Then
Reporter.ReportEvent micPass,"SQL_DATA_CHECK","[actualValue = expectValue =" + cstr(actualValue) +"]"
Else
Reporter.ReportEvent micFail,"SQL_DATA_CHECK","[expectValue = " + cstr(expectValue) + " actualValue = " + cstr(actualValue) + "]"
End If
'关闭数据库
adoConn.Close
'释放数据库对象
Set adoConn = Nothing
End Function
结果
参考QTP10的Reporter对象_kuwoleft-CSDN博客
Reporter.ReportEvent EventStatus , ReportStepName , Details [, ImageFilePath ]
Argument |
|
EventStatus |
|
|
|
Details |
测试结果事件的描述。 该字符串将显示在“测试结果”窗口的步骤详细信息框中。 |
ImageFilePath |
|
这样的话就可以在测试步骤的报告中添加截图信息,例如:
Browser("Browser").Page("WebPage").Image("MyLogo").CaptureBitmap("MyLogo.bmp")
Reporter.ReportEvent micDone, "Display Logo", "This is my logo", "MyLogo.bmp"
一般在碰到错误时,应该把当前屏幕截一下,以便后面查看测试日志时分析和定位出错的原因,例如下面的代码所示:
validation1=Browser("WebTours").Page("WebTours").Frame("navbar").Image("Login").Exist(0)
If validation1 Then
Reporter.ReportEvent micPass, "The Login object exists", "The Login object exists"
Else
Desktop.CaptureBitmap "Fail.png",True
Reporter.ReportEvent micFail, "The Login object exists","The Login object doesn't exists","Fail.png"
End if
'...
validation2=Browser("Web Tours").Page("Web Tours").Frame("navbar").Image("SignOff Button").Exist(0)
If validation2 Then
Reporter.ReportEvent micPass, "The LogOut object exists", "The LogOut object exists"
Else
Desktop.CaptureBitmap "Fail.png",True
Reporter.ReportEvent micFail, "The LogOut object exists","The LogOut object doesn't exists","Fail.png"
End if
也可以不用report对象,自定义测试报告,比如生成HTML或XML的报告。
在脚本运行中可能会出现一些非预期事件、错误、程序崩溃等情况,阻止脚本继续执行下去,在此情况下脚本可能暂停执行,直到某些界面被操作之后才会继续执行下去,为了处理这一类事件因此存在场景恢复。
参考引用:UFT入门教程(6)—恢复场景管理器_weixin_33720956的博客-CSDN博客
恢复场景管理器 作用:对不可预知的错误进行相应的处理,以保证测试能继续运行
设置步骤:
1.点击菜单栏“资源”,选择“恢复场景管理器”
2.选择“新建场景”
3.新建“向导”
4.选择触发事件
(即选择触发“场景恢复”的事件,错误弹窗或者是按钮对象为无法点击状态等事件)
5.捕获弹窗
6.选择继续测试所需的恢复操作
选择“键盘或鼠标操作”
7.调整”恢复操作“的顺序
勾选“添加另一个恢复操作”将再次进入“添加恢复操作”的界面,直到该项取消勾选
8.选择恢复后测试运行的操作
根据实际情况自己选
(重复操作步骤,继续下一步)
9.勾选“向当前测试中添加场景”,则该场景将自动添加至当前测试 (也可通过右键”测试“手动关联)
添加后结果:
此对象主要是通过QTP的SetSecure函数原理来对字符串进行加密,此对象仅提供Encrypy一个方法。
'加密字符串
Dim myVar
myVar = Crypt.Encrypt("Tarun Lalwani")
msgbox myVar
Crypt.Encrypt()方法最终返回的不是每次都相等的。此方法哪怕加密两次相同的字符串,最终生成的加密内容也是不同的。
例子:加密密码
加密前:
Browser("Browser").Page("Page").WinEdit("password").Set "tarun"
加密后:
当使用这种安全模式脚本时密码就不会出现在测试结果里了。
'使用以下脚本创建一个加密字符串
sEncryptepassword = Crypt.Encrypt("tarun")
Browser("Browser").Page("Page").WinEdit("password").SetSecure sEncryptepassword
此对象主要用来查找文件的绝对路径。
我们可以决定具体的文件夹作为文件搜索的相对路径,并可以使用PathFinder.Locate方式搜索此文件夹下具体文件的相对路径。
- 1
- 2
- 3.jpg
- a
- b
- c.html
- c.jpg
绝对路径就是无论从外部还是内部访问,都能够通过此路径找到文件夹。比如:C:/Users/a1394/Desktop/OneDrive/1/2/3.jpg
而相对路径是相对于自身的,其他位置的文件和路径,只能通过内部访问。如果在同一目录下另一个文件使用c.jpg,那么路径就是url="c.jpg"。如果我要去找3.jpg的话,就要回到父文件夹的父文件夹,也就是1,此时路径为 url="../../",此时1文件夹和a文件夹同一级,那么就进入1然后进入2,找到3.jpg,所以最后的路径为url=../../1/2/3.jpg。
绝对路径就是写死的路径,缺点是换设备会出现路径找不到问题;
相对路径就是灵活的路径,优点是不会因为设备更换出现路径问题。
例子:
此对象提供了一个可以在两个数值质检获取随机数的方法。
Value属性是RandomNumber的默认属性,因此在脚本中可省略。
'返回一个1-200之间的随机数X
X = RandomNumber.value(1,200)
或者
X = RandomNumber(1,200)
此对象用于运行或关闭一些进程。
运行:
Run file,[params],[dir],[op],[mode]
(1)file参数是必须输入的,被运行的应用程序或者被打开的文件;
(2)params是可选参数,启动应用程序所需的参数;
(3)dir是可选参数,应用程序或文件的默认工作目录;
(4)op是可选参数,文件打开的模式,包括open、edit、explore、find、print 5种模式;
(5)mode参数是可选参数,用于指定程序窗口打开时的状态。
SystemUtil.Run "iexplore.exe"
SystemUtil.Run "iexplore.exe","http://www.yahoo.com"
关闭进程:
(1)CloseDescendentProcesses,用于关闭所有由QTP打开的进程;
SystemUtil.CloseDescendentProcesses
(2)CloseProcessByHwnd,用于关闭包含指定句柄的窗口的进程;
'使用windows窗口句柄关闭进程
hWnd = Browser("Creationtime:=0").GetROProperty("hwnd")
SystemUtil.CloseProcessByHwnd hwnd
(3)CloseProcessById,用于关闭指定进程ID(PID)的进程;
SystemUtil.CloseProcessByID processID
(4)CloseProcessByName,用于关闭指定名称的进程;
'关闭iexplore.exe进程
numClosed = SystemUtil.CloseProcessByName("iexplore.exe")
(5)CloseProcessByWndTitle,用于关闭拥有指定标题的窗口的进程。
'使用正则表达式匹配标题关闭进程
numClosed = SystemUtil.CloseProcessByWndTitle "Microsoft Internet Explorer.*",True
'不使用正则表达式匹配标题关闭进程
numClosed = SystemUtil.CloseProcessByWndTitle "Notepad"
删除浏览器的cookie
'创建WebUtil对象
Dim oWebUtil
Set oWebUtil = CreateObject("Mercury.GUI_WebUtil")
'删除cookies并销毁对象
oWebUtil.DeleteCookies
Set oWebUtil = Nothing
RunAction的用法如下:
RunAction ActionName, [Iteration,Parameters]
ActionName:调用action的名称
lteration:迭代次数(onelteration和alllterations)其中onelteration是默认设置,也可以用0表示,alllterations也可以用1表示
例子:
(1)Output=RunAction("Action2",onelteration,input1,input2,output1)
(2)ExitAction语句可以用来终止Action2的执行
RunAction “Action2",onelteration
一些操作语句:
ExitAction("The result is :"¶meter(“output"))
Parameter(“name")
Parameter(“output") =Parameter(“Input1")+Parameter(“Input2")
引发错误的原因有很多,例如用户输入了错误类型的值,或者脚本找不到必需的文件、目录或者驱动器,我们可以使用循环技术来处理错误,但是VBS本身也提供了一些基本技术来进行错误的检测和处理。
1、最常见的错误是运行时错误,也就是说错误在脚本正在运行的时候发生,是脚本试图进行非法操作的结果。例如零被作为除数。在vbs中,任何运行时错误都是致命的,此时,脚本将停止运行,并在屏幕上显示一个错误消息。你可以在脚本的开头添加
OnError Resume Next
这行语句告诉vbs在运行时跳过发生错误的语句,紧接着执行跟在它后面的语句。
发生错误时,该语句将会把相关的错误号、错误描述和相关源代码压入错误堆栈。
2、虽然OnErrorResumeNext语句可以防止vbs脚本在发生错误时停止运行,但是它并不能真正处理错误,要处理错误,需要在脚本中增加一些语句,用来检查错误条件并在错误发生时处理它。
vbscript提供了一个err对象,他有两个方法clear,raise,5个属性:description,helpcontext, helpfile,number,source
err对象不用引用实例,可以直接使用,例如:
on error resume next
a=11
b=0
c=a/b
if err.number<>0 then
wscriptechoerrnumber&errdescription &err.source
endif 其他
BlockInput方法,用于屏蔽输入;
UnBlockInput方法,用于解除屏蔽。
可以使用这两个方法防止测试脚本运行过程中被意外的鼠标和键盘操作干扰。