实例解析AUTOMATION TEST FRAMEWORK (1)
上一篇 / 下一篇 2013-03-25 10:27:47 / 个人分类:测试
什么是Automation Test Framework
自动化测试框架,是多个基础测试模块,管理模块,统计模块,执行模块等组成的可复用的底层模块集合。
举个实际的例子,Selenium本身就是一个Framework。我们基于Selenium对我们要测试的产品进行二次封装,例如基于page,或者基于element,就形成了个新的Framework。然后我们基于这个新的Framework,去开发一些复用的模块,方法等等。然后基于这些复用的方法和模块,我们去开发测试用例。
这听起来,很像是软件开发中常见的三层结构之类的感觉。不错,所谓的Automation Test Framework,其实很多时候,就是基于现有的一些Framework,比如Selenium,Watir来控制底层操作,我们自己二次开发的代码是基于产品的业务逻辑进行封装,然后实现自动化测试用例。
所以,框架的意思,就是你能搭建一个能让上一层依赖你而且满足上层需求的底层驱动集。很多公司是直接使用现成的测试框架进行开发测试用例,有些公司会根据具体的业务需求扩展现在有的测试框剪来满足需要。
所以,测试框架应该是个动态的框架,当你只是使用它时,它只是个静态工具而已。
框架的组成部分
我们拿Test Studio提供的免费的开源框架来做个实例,它包含了一下几个主要的部分:
· Automation Infrastructure library
· Internet Explorer client
· Firefox client
· Silverlight plug-in
· HTTP Proxy
· ASP.NET TestRegion Custom Control.
其中,Automation Infrastructure Library就是最底层的支撑框架,我们如何去识别element,如何操作element都依赖于此,如同一个程序语言的核心库。
而且它自带了一些自我定制的client,用于对指定的浏览器进行操作。这些操作,实际上是封装了操作系统自带的方法。所以,该软件只能在基于Net Framework的操作系统上运行。同时提供了一个Plug-in用于对Silverlight进行支持。
而HTTP Proxy的作用有两个,一个是在录制的时候作为监听端口的控制,从而将需要的控制信息录制下来。在回放的时候,作为监听去收集log信息。
从以上我们可知,框架的组成部分,都是你在测试中需要处理的行为,比如怎么获得浏览器,怎么进行浏览器操作,怎么进行录制,怎么进行log记录等等。
框架的核心
对于一个Web自动化测试框架来说,最核心的部分是要提供如下的功能:
· 浏览器的控制
· 页面元素对象的的识别
· 页面元素对象的搜索
· 页面元素对象的操作
· 进行断言
· Dom的构建
· 处理错误信息
· 记录日志
让我们看看,Test Studio的测试框架是怎么样实现的。
Manager.ActiveBrowser
在其中封装的对浏览器的操作,这些操作包含了:
•Browser.Actions
•Browser.Find
•Browser.DomTree
•Browser.Window
其中,Browser.Actions提供了如下几类方法:
Browser Control – 用于对Browser进行控制,从而是的browser能够按照我们需要的行为进行操作。这些操作是基于Browser对象进行的。每一个新打开的窗口,都代表了一个Browser对象,我们可以对对象进行具体的操作,例如:转向指定的URL,返回上一个page,等待,刷新等等。
DOM automation – 用于对基于DOM存在的元素进行操作。所有的DOM操作,都是使用一个Action对象进行控制。这些Action对象是在一个Browser对象创建时,基于DOM对象生成的。举一个具体的Action对象的例子,比如Set Text,本身是一个Action,即所谓的行为,我们把这个行为当作一个对象来进行操作,那么我们就可以实现对于个Text Field的element对象来执行一个Action对象。Element是要操作的对象,而Action对象包含的是对这个element进行操作的操作内容和数据。
Pure UI automation – 这里面包含的是纯粹的那些GUI的操作,例如鼠标点击,和键盘输入。这些操作作为“Desktop”存在。例如Simulate方法,就是要进行set Focus on,action和data enter的操作集合。
我们来看一些具体的实例来帮助我们理解:
对Browser的操作
ActiveBrowser.NavigateTo("http://www.google.com");
当前页面转向URL:http://www.google.com
当存在base URL时,可以直接使用间接地址:
ActiveBrowser.NavigateTo("~/videosearch");
可以对Browser本身的属性进行操作,例如验证browser的Title:
string pageTitle = ActiveBrowser.PageTitle;
Assert.AreEqual("Video Search Page", pageTitle, "Actual page title = \"{0}\"", pageTitle);
在鼠标点击事件后,browser等待操作完成
Desktop.Mouse.Click(MouseClickType.LeftClick, 300, 275);
ActiveBrowser.WaitUntilReady();
对element的操作
查找一个id为input1的文本框对象
Element input1 = ActiveBrowser.Find.ById("input1");
查找一个id为textarea1的文本域对象
Element textArea = ActiveBrowser.Find.ById("textarea1");
查找一个id为inputradio的Radio button对象
Element inputradio = ActiveBrowser.Find.ById("inputradio");
查找一个id为inputcheck的checkbox对象
Element inputcheck = ActiveBrowser.Find.ById("inputcheck");
查找一个id为selection的下拉框对象
Element selection = ActiveBrowser.Find.ById("selection");
对DOM的操作
在对象input1里面输入字符串“test1”
ActiveBrowser.Actions.SetText(input1, "test1");
选择radio button对象inputradio
ActiveBrowser.Actions.Check(inputradio, true);
钩取checkbox对象inputcheck
ActiveBrowser.Actions.Check(inputcheck, true);
在下拉框列表selection中选择序号为4的选项
ActiveBrowser.Actions.SelectDropDown(selection, 4);
在下拉框列表selection中选择文本为“one1”的选项
ActiveBrowser.Actions.SelectDropDown(selection, "one1");
在下拉框列表selection中选择值为“test”的选项
ActiveBrowser.Actions.SelectDropDown(selection, "test", true);
而在Browser.Find中有存在哪些操作呢,主要是如何根据不同的信息进行element的定位,可以使用的方式有如下几种:
Find.ById()
Find.ByName()
Find.ByTagIndex()
Find.ByAtrributes()
Find.AllByAttributes()
Find.ByContent
Find.AllByContent()
Find.ByXPath
Find.AllByXPath()
Find.AllByTagName()
Find.ByNodeIndexPath()
Find.ByParam()
Find.AllByParam()
Find.FromCollection()
Find.ByCustom()
Find.AllByCustom()
以上的方式,基本上可以保证找到所需的element对象。我们来举几个例子:
页面上有个元素具有id属性,id为input1
Element e = Find.ByID(“input1”)
页面上有个元素具有name属性,name为searchbtn
Element e = Find.ByName(“searchbtn”)
页面上有多个table,那么我们可以根据序号选择需要的表,比如第2个
Element e= Find.ByTagIndex(“table”, 2)
如果想使用多个属性值寻找
Element e = Find.ByAttributes(“class=inputclass”, “name=input1”)
如果有多个匹配对象返回,那么返回的是第一个
Element e= Find.ByAttributes(“class=myclass”)
如果想返回所有的匹配对象,那么可以这么操作
List <Element> e=Find.AllByAttributes(“class=myclass”)
如果想根据全文匹配查找一个字符串,那么是l来标识
Element e = Find.byContent(l:Education)
如果想根据部分匹配查找一个字符串,那么是p来标识
Element e = Find.byContent(p:Education)
如果想根据正则表达式来匹配一个字符串
Element e = Find.ByContent(@"x:^(<tr>\s*<td\s*scope=.*>\s*Education)");
如果想返回所有匹配的对象,可以使用部分匹配
IList<Element> alle = Find.AllByContent("p:car");
以上的例子就是为了说明Test Studio是如何对Browser的操作进行封装的,基本上采用的方式是以Data-Driven方式进行的。更加关心的是通过数据来获得对象。
那么让我们看看Action是怎么进行Keyword-Driven的封装。
Manager.ActiveBrowser.Actions
在其中封装的对数据对象的操作,这些操作包含了:
Actions.Click
Actions.SetText
Actions.Check
Actions.WaitForElement
这些操作,是依据你要进行的处理进行封装。更加在意的是有哪些操作,而不在意是那些数据要进行操作。这个封装方式,更像是将ActiveBrowser,也就是Browser对象进行方法封装,凡是在Browser对象中封装的element都可以使用这些Action方法。
Manager.ActiveBrowser.Find
这个模块,是为了满足在Browser对象中封装的DOM列表中进行查找的操作。它封装了一个很重要的功能Find.SearchRegion。 他和Action对象一样,是对Browser封装的有效补充。Action是被Browser对象中的DOM所筛选出来的element,在页面上查找匹配对象后,该对象进行的操作。而Find起到的作用就是在页面上查找匹配对象,是通过实际的页面来反向查找DOM的过程。
Manager.ActiveBrowser.DomTree
既然所有的操作实际上都是因为Browser封装了DOM树实现的,那么需要一些方法进行DOM树的操作,之所以把这些方法放到Browser之外进行封装,那是因为DOM树的创建和更新是在进行录制过程中实现的。所以,不需要很臃肿的包含在主包中。
它包含的两个主要内容是TreeBuilder.TestRegion's和 TreeBuilder.Root。一个是用来获取DOM树,就是从root节点load的过程。另外一个就是创建树的builder。
Manager.ActiveBrowser.Window
那么Browser是存在于哪里呢,是在一个Window窗口中,所以有时候也需要对这些容器进行操作,我们也把相关的操作封装起来。
主要的方法有两个:Window.Handler用来对窗口进行处理, 而 Window.GetBitmap()为了存照给log使用。要知道Browser是不存在状态的,真正具有各种状态的是Windows,尤其是在切换不同的Browser的实例时,切换的对象是Window本身,而不是这个容器里的Browser对象。
Manager.ActiveBrowser.Frames
Frame这个东西挺讨厌的,类似于在Browser里面搞了个分裂活动,很多测试框架都不得不专门对它进行封装操作。
Manager.ActiveBrowser.Regions
这个封装的是要返回的具体对象,总不能老拿庞大的Browser对象到处跑。封装的方法就是Count, Item, Items这几个比较重要的对象。实际上,有点像把一个立体的DOM树平铺到二维数组中,这样的话才便于操作。
Manager.Desktop
剩下的是Desktop对象,实际上就是封装了鼠标和键盘的事件。
Manager.Log
而log中封装的就是日志操作,这个就不用说了。让我们回头来再回顾一下:
Manager.ActiveBrowser
Manager.ActiveBrowser.Actions
Manager.ActiveBrowser.Find
Manager.ActiveBrowser.DomTree
Manager.ActiveBrowser.Window
Manager.ActiveBrowser. Frames
Manager.ActiveBrowser. Regions
Manager.Desktop
Manager.Log
从上面的说明可知,Web Automation的操作,就是对页面上的元素进行操作,这些元素都被封装在ActiveBrowse的DOM树中。
而Actions中封装就是这些元素对象的共用方法,Find中封装的是如何在DOM树中查找,DOMTree封装的是对DOM树的操作。而Regions封装的是DOM树的组织方式和映射方式。
Window是封装的容器,Frames是特殊的控制,不得不封装在外。
所以所有的核心都是以包围ActiveBrowser所实例化的Browser对象进行的。
所以我们在使用该测试架构时,可以按照如下方式进行:
根据页面逻辑或者业务逻辑,封装Page对象,这些对象是作为Browser对象的实例存在,该page中所有的html element都存储到该Browser对象的DOM树中。这样就根据page来封装了所有需要操作的element对象。
然后根据业务逻辑或者业务流程,调用page中封装的element对象,实现一些可以复用的业务逻辑或者方法。
然后根据Data-driven或者Keyword-driven的方式去实现自动化测试用例。
从而以一个三层结构的方式完成了测试框架的搭建。从而能够减少因为需求更新导致的代码更新的工作量和减少平行依赖性带来的风险。
从上面过程可以看出,现有的test framework实际上都是封装好的半成品,将底层构建好以后,能够让你迅速的基于底层框架搭建上层框架,从而建立真正适用于你要测试产品的框架,或者集成到已有的测试框架中。甚至可以被更高级的开放框架所引入,达到丰富其他框架的目的,例如robot+selenium形成一个新的测试框架。
TAG:
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | 5 | 6 | ||||
7 | 8 | 9 | 10 | 11 | 12 | 13 | |||
14 | 15 | 16 | 17 | 18 | 19 | 20 | |||
21 | 22 | 23 | 24 | 25 | 26 | 27 | |||
28 | 29 | 30 |
我的存档
数据统计
- 访问量: 150821
- 日志数: 185
- 文件数: 6
- 建立时间: 2007-08-06
- 更新时间: 2015-01-06