《Web页面功能自动化测试.doc》由会员分享,可在线阅读,更多相关《Web页面功能自动化测试.doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Web页面功能自动化测试使用QTP进行Web页面自动化测试案例分析 Discuz!NT自动化测试安装和配置Discuze!NT登录功能的测试在Discuz论坛的首页面可以进行录制操作,如图所示:用QTP录制的登录、退出脚本如下所示:Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).Set chennengjiBrowser
2、(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(password).SetSecure 4b9f7c4409edd0fcecf136fdd301bBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebButton(登录).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).Link(退出).Click可以看到密码设置是用的SetSecure方法,这个方法需要设置密文,
3、不利于修改和参数化,应该改为用Set,另外,由于登录后有中转页面,不能马上“退出”,需要加入延时,调整后的脚本:Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).Set chennengjiBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdi
4、t(password).Set Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebButton(登录).ClickWait 5 由于登录后有中转页面,不能马上“退出”,需要加入延时Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).Link(退出).Click对于等待重定向页面的处理,可以加入等待延时,也可以直接点击链接让浏览器转向,下面是重新录制并调整后的脚本(把点击链接让浏览器转向的过程录制下来):Browser(Discuz!NT ASP.n
5、et|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).Set chennengjiBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(password).Set Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).We
6、bButton(登录).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(用户登录 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).Link(退出).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(用户退出 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).Click当然,这样的脚本还不够健壮,而且也没
7、有完成登录功能的验证,需要加入检查点:Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).Set chennengjiBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(password).Set Browser(Discuz!NT ASP
8、.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebButton(登录).ClickIf Browser(Discuz!NT ASP.net|论坛 -).Page(用户登录 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).Exist(5) ThenBrowser(Discuz!NT ASP.net|论坛 -).Page(用户登录 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).ClickElseReporter.ReportEvent micWarning,对象不存
9、在, Link对象不存在!End If 插入检查点,检查是否登录成功If Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebElement(chennengji).Exist(5) ThenIf Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebElement(chennengji).GetROProperty(innerText)=chennengji ThenReporter.ReportEvent micPass,检查登录是否成功,
10、Pass! 退出Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).Link(退出).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(用户退出 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).ClickElseReporter.ReportEvent micFail,检查登录是否成功, Fail!End IfElseReporter.ReportEvent micFail,对象不存在, WebElement对象不存在!End If在脚本中,加
11、入了登录后的页面检查,通过检查“如果浏览器没有转向, 请点击这里.”这个链接是否存在(Exist),来判断是否去到了重定向等待页面。后面,再插入检查点,检查是否登录成功,通过GetROProperty获取登录后页面中的用户名这个WebElement对象(如图所示)的“innerText”属性的值,判断是否等于登录输入的用户名。这样就相对完整地实现了登录功能的测试脚本设计。* 注:这里也可以用QTP的检查点(CheckPoint)来检查登录是否成功,但是QTP的CheckPoint需要在录制过程中插入,而且缺乏灵活性,不易于后期修改。参数化登录功能的脚本前面实现了一个基本的登录功能的脚本设计,但
12、是还存在很多问题,其中一个就是登录用户名和密码这些测试数据都是写死在脚本中的测试步骤,不利于后期维护脚本,为此,需要对脚本进行参数化更改:Dim UserNameDim PassWordUserName = chennengjiPassWord = Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).Set UserName
13、Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(password).Set PassWordBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebButton(登录).ClickIf Browser(Discuz!NT ASP.net|论坛 -).Page(用户登录 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).Exist(5) ThenBrowser(Discuz!NT ASP.n
14、et|论坛 -).Page(用户登录 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).ClickElseReporter.ReportEvent micWarning,对象不存在, Link对象不存在!End If 插入检查点,检查是否登录成功If Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebElement(chennengji).Exist(5) ThenIf Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.
15、net|论坛 -).WebElement(chennengji).GetROProperty(innerText)=UserName ThenReporter.ReportEvent micPass,检查登录是否成功, Pass! 退出Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).Link(退出).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(用户退出 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).ClickElseReporter
16、.ReportEvent micFail,检查登录是否成功, Fail!End IfElseReporter.ReportEvent micFail,对象不存在, WebElement对象不存在!End If脚本中,把使用到用户名和密码的测试步骤中的数据都替换成用最前面定义的变量UserName和PassWord,这样,如果下次运行需要更改登录账号,只需要修改代码前面的数据即可。* 注意,这种用变量进行参数化的做法不是最好的,也不是最终的做法,后面我们还会回来修改,让脚本的测试数据与脚本测试步骤分离开来。模块化脚本设计再来分析一下我们的登录脚本,我们会发现,这个简单的登录功能的测试还不够理想,
17、例如,我们需要预先打开浏览器,导航到Discuz的主页面,这样登录功能的脚本才能正确执行。为此,我们应该再添加启动浏览器、导航等脚本:StartNewBrowserNavigateToLoginCloseBrowserSub StartNewBrowserSystemUtil.Run Iexplore.exeEnd SubSub NavigateTo Browser(Discuz!NT ASP.net|论坛 -).Navigate http:/127.0.0.1:88/dnt3/index.aspxEnd SubSub LoginBrowser(Discuz!NT ASP.net|论坛 -).
18、Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).Set chennengjiBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(password).Set Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebButton(登
19、录).ClickIf Browser(Discuz!NT ASP.net|论坛 -).Page(用户登录 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).Exist(5) ThenBrowser(Discuz!NT ASP.net|论坛 -).Page(用户登录 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).ClickElseReporter.ReportEvent micWarning,对象不存在, Link对象不存在!End If 插入检查点,检查是否登录成功If Browser(Discuz
20、!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebElement(chennengji).Exist(5) ThenIf Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebElement(chennengji).GetROProperty(innerText)=chennengji ThenReporter.ReportEvent micPass,检查登录是否成功, Pass! 退出Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz
21、!NT ASP.net|论坛 -).Link(退出).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(用户退出 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).ClickElseReporter.ReportEvent micFail,检查登录是否成功, Fail!End IfElseReporter.ReportEvent micFail,对象不存在, WebElement对象不存在!End IfEnd SubSub CloseBrowserBrowser(Discuz!NT ASP.net|论坛 -).Cl
22、oseEnd Sub这次调整的脚本中,用VBScript的Sub过程来封装一个个的操作,例如启动浏览器(StartNewBrowser)、导航到指定页面(NavigateTo)、执行登录操作(Login)、关闭浏览器(CloseBrowser),这样的脚本设计遵循了分而治之的思想,把相对独立的过程分开编写脚本,最后统一调用,有利于降低脚本维护难度,代码的可读性也增强了。模块化脚本设计 使用ActionQTP为模块化脚本设计提供了Action机制,可以把相对独立的测试操作放在一个个Action中,再由一个统一的Action来调用。对于前面的模块化脚本,我们可以调整成用Action实现:1、新建一
23、个Action,命名为“StartNewBrowser”,在这个新建的Action中写如下脚本:StartNewBrowserSub StartNewBrowserSystemUtil.Run Iexplore.exeEnd Sub2、新建Action“NavigateTo”,脚本如下:NavigateToSub NavigateTo Browser(Discuz!NT ASP.net|论坛 -).Navigate http:/127.0.0.1:88/dnt3/index.aspxEnd Sub3、新建Action“Login”,脚本如下:LoginSub LoginBrowser(Disc
24、uz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).Set chennengjiBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(password).Set Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.n
25、et|论坛 -).WebButton(登录).ClickIf Browser(Discuz!NT ASP.net|论坛 -).Page(用户登录 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).Exist(5) ThenBrowser(Discuz!NT ASP.net|论坛 -).Page(用户登录 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).ClickElseReporter.ReportEvent micWarning,对象不存在, Link对象不存在!End If 插入检查点,检查是否登
26、录成功If Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebElement(chennengji).Exist(5) ThenIf Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebElement(chennengji).GetROProperty(innerText)=chennengji ThenReporter.ReportEvent micPass,检查登录是否成功, Pass! 退出Browser(Discuz!NT ASP.n
27、et|论坛 -).Page(Discuz!NT ASP.net|论坛 -).Link(退出).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(用户退出 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).ClickElseReporter.ReportEvent micFail,检查登录是否成功, Fail!End IfElseReporter.ReportEvent micFail,对象不存在, WebElement对象不存在!End IfEnd Sub4、新建Action“CloseBrowser”,脚本如下:
28、CloseBrowserSub CloseBrowserBrowser(Discuz!NT ASP.net|论坛 -).CloseEnd Sub5、最后,新建一个名为“Main”的Action,在这个Action中按顺序插入对其他Action的调用:RunAction StartNewBrowser, oneIterationRunAction NavigateTo, oneIterationRunAction Login, oneIterationRunAction CloseBrowser, oneIteration最后在“Test Flow”视图中可以看到形成如图所示的测试流程:QTP1
29、0中支持动态调用Action,因此也可以写成:LoadAndRunAction Environment.Value(TestDir),StartNewBrowser,oneIterationLoadAndRunAction Environment.Value(TestDir),NavigateTo,oneIterationLoadAndRunAction Environment.Value(TestDir),Login,oneIterationLoadAndRunAction Environment.Value(TestDir),CloseBrowser,oneIteration其中使用了QT
30、P的内置环境变量TestDir来获取当前测试脚本的目录。使用QTP环境变量进行脚本参数化前面提到使用QTP的内置环境变量,实际上QTP除了有内置环境变量还,还提供用户自定义环境变量(File Settings Environment),如图所示:我们可以分析一下脚本中使用到的测试数据,定义一些全局的变量,例如页面地址、登录账号等。还可以把这些环境变量导出到外部XML文件,或者从外部XML文件加载环境变量。接下来需要对脚本做一些调整,用环境变量来替代某些测试数据:1、在StartNewBrowser这个Action中,把浏览器应用程序名替换成从环境变量读取:StartNewBrowser Env
31、ironment.Value(browser)Sub StartNewBrowser( browserApp )SystemUtil.Run browserAppEnd Sub这样,如果下次测试需要在其他浏览器进行,只需要修改环境变量即可2、在NavigateTo这个Action中,把访问论坛的首页地址替换成从环境变量读取:NavigateTo Environment.Value( HomePageURL )Sub NavigateTo( url ) Browser(Discuz!NT ASP.net|论坛 -).Navigate urlEnd Sub这样,如果下次测试的是部署在另外一个地址的
32、Discuz论坛,只需要修改环境变量即可。3、修改Login这个Action中的脚本,把测试步骤中使用的登录用户名和密码改成从环境变量读取:Login Environment.Value(LoginUserName),Environment.Value(LoginPassWord)Sub Login( UserName, PassWord )Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!
33、NT ASP.net|论坛 -).WebEdit(username).Set UserNameBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(password).Set PassWordBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebButton(登录).ClickIf Browser(Discuz!NT ASP.net|论坛 -).Page(用户登录 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转
34、向, 请点击这里.).Exist(5) ThenBrowser(Discuz!NT ASP.net|论坛 -).Page(用户登录 - Discuz!NT ASP.net|论坛).Link(如果浏览器没有转向, 请点击这里.).ClickElseReporter.ReportEvent micWarning,对象不存在, Link对象不存在!End If 插入检查点,检查是否登录成功If Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebElement(chennengji).Exist(5) ThenIf Brow
35、ser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebElement(chennengji).GetROProperty(innerText)=UserName ThenReporter.ReportEvent micPass,检查登录是否成功, Pass! 退出Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).Link(退出).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(用户退出 - Discuz!NT ASP.ne
36、t|论坛).Link(如果浏览器没有转向, 请点击这里.).ClickElseReporter.ReportEvent micFail,检查登录是否成功, Fail!End IfElseReporter.ReportEvent micFail,对象不存在, WebElement对象不存在!End IfEnd Sub4、最后修改一下Main这个Action的脚本。我们把环境变量导出到文件,存在测试脚本中的Configs目录下,命名为“Config.xml”,导出的XML文件内容如下:HomePageURLhttp:/127.0.0.1:88/dnt3/index.aspxLoginPassWor
37、dLoginUserNamechennengjibrowserIexplore.exe这样,在Main这个Action的脚本中,只需要调用Environment对象的LoadFromFile来动态加载配置文件即可:EnvFile = Environment.Value(TestDir)&ConfigsConfig.xmlfileName = Environment.ExternalFileName If (fileName = ) Then Environment.LoadFromFile(EnvFile) End If Msgbox Environment.Value(LoginPassWo
38、rd)MainSub Main LoadAndRunAction Environment.Value(TestDir),StartNewBrowser,oneIterationLoadAndRunAction Environment.Value(TestDir),NavigateTo,oneIterationLoadAndRunAction Environment.Value(TestDir),Login,oneIterationLoadAndRunAction Environment.Value(TestDir),CloseBrowser,oneIterationEnd Sub由于环境变量的
39、配置文件是在脚本中动态加载的,因此,可以编写多个配置文件用于准备不同类型或用途的测试之用。或者在测试执行之前修改好配置文件中的测试数据即可。用函数返回值控制测试流程前面我们用了模块化的思想把相对独立的测试步骤分隔到不同的Action中,这样的脚本还存在不够完善的地方,例如启动浏览器这个脚本,我们没有判断是否启动成功,如果启动浏览器失败了,那么后续的脚本实际上是不应该执行的,执行的话也会导致失败。为此,我们需要把Sub改成Function,用函数返回一个值,用于判断浏览器是否启动成功了(注意Sub是不能返回值的),修改后的StartNewBrowser的脚本如下所示:Function Start
40、NewBrowser( browserApp )SystemUtil.Run browserAppStartNewBrowser = Browser(version:=inter.*).Exist(5)End Function脚本中的函数StartNewBrowser中用了QTP的描述性编程,通过IE浏览器对象的Exist来判断是否启动了浏览器,然后返回(通过给函数名赋值的方式)。这只是第一步,由于StartNewBrowser这个Action需要在Main这个Action中调用,因此Main需要调用StartNewBrowser这个Action,StartNewBrowser应该返回一个值,
41、让Main知道浏览器是否启动了,从而决定是否继续测试:LoadAndRunAction Environment.Value(TestDir),StartNewBrowser,oneIteration,isBrowserOpenedIf isBrowserOpened=True Then 如果浏览器打开了,则继续测试因此,需要在StartNewBrowser这个Action中定义一个输出参数(Output parameters),如图所示:在StartNewBrowser这个Action的脚本中,把浏览器是否成功启动的标记赋值给输出参数“BrowserOpened”:If StartNewBro
42、wser (Environment.Value(browser) ) = True ThenParameter(BrowserOpened) = TrueEnd IfFunction StartNewBrowser( browserApp )SystemUtil.Run browserAppStartNewBrowser = Browser(version:=inter.*).Exist(5)End Function类似地,把NavigateTo这个Action修改一下,定义一个输出参数“PageOpened”,脚本修改成:Parameter(PageOpened) = NavigateTo
43、(Environment.Value( HomePageURL )Function NavigateTo( url ) Browser(Discuz!NT ASP.net|论坛 -).Navigate url NavigateTo = Browser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).Exist(6)End Function再把Login的脚本修改一下,定义两个输入参数UserName和PassWord,一个输出参数“LoginPassed”用于返回是否登录成功,脚本修改如下:Parameter(LoginPassed)
44、= Login ( Environment.Value(LoginUserName),Environment.Value(LoginPassWord) )Parameter(LoginPassed) = Login ( Parameter(UserName), Parameter(PassWord) )Function Login( UserName, PassWord ) Login = TrueBrowser(Discuz!NT ASP.net|论坛 -).Page(Discuz!NT ASP.net|论坛 -).WebEdit(username).ClickBrowser(Discuz!NT ASP.net|论坛 -).Page(Di