配置脚本的原理及实现
配置脚本既通过将操作有效的函数华,通过简单的描述来达到编写脚本的效果。基于自己的脚本引擎技术去实现脚本配置已经实现,基于QTP去实现脚本配置技术我还在探索,与大家共勉。
例如:
【编写脚本层】
打开 http://www.sina.com.cn
输入 用户名,admin,登录页面
输入 密码,123456,登录页面
按钮 确定,登录页面
【生成脚本层】
SystemUtil.Run "http://www.sian.com.cn"
WebElementCheck "用户名:","admin","title:=登录页面","name:=登录页面"
qWebEditClick "用户名:","123456","title:=登录页面","name:=登录页面"
qButtonClick "确定","name:=登录页面"
【底层函数库】
'*************************************************************************
'*模板名称: AUTO
'*开发日期: 2009-10-9
'*最后修改日期: 2009-10-9
'*输入参数:
'*输出参数:
'*脚本描述: 文本检查点
'*************************************************************************
Sub WebElementCheck(Bntext,Dtime,pageName,BrowserName)
For i=0 to Dtime
bd =Browser(BrowserName).Page(pageName).Object.body.innerHTML
If InStr(bd, Bntext) > 0 Then
Reporter.ReportEvent micPass, "检查点:" & Bntext,"Pass"
Exit sub
Else
wait(1)
End If
next
Reporter.ReportEvent micFail, "检查点:" & Bntext, "Fail"
End Sub
'*************************************************************************
'*模板名称: AUTO
'*开发日期: 2009-10-9
'*最后修改日期: 2006-10-9
'*输入参数:
'*输出参数:
'*脚本描述: 按钮单击
'*************************************************************************
Sub qButtonClick(BnText,pageName,BrowserName,i)
Browser(BrowserName).Page(pageName).WebButton("value:=" & BnText,"index:=" & i).click
End sub
'*************************************************************************
'*模板名称: AUTO
'*开发日期: 2009-10-9
'*最后修改日期: 2009-10-9
'*输入参数:
'*输出参数:
'*脚本描述: 弹出框单击
'*************************************************************************
Sub qDialogClick(BnText,BrowserName)
Browser(BrowserName).Dialog("text:=Windows Internet Explorer","nativeclass:=#32770").WinButton("text:=" & BnText).Click
End Sub 实现配置脚本的意义在于降低自动化测试成本,可以将编写脚本的工作的技术门槛降低。
降低脚本编写、维护的成本。 LZ这个思路和Mercury内部很早前有人提出的框架类似,将单步操作函数化,但仔细想想看。。。这样真的有很大的用处么。。。 敏捷编程:函数原子化。。。我导师一直这么教导说~~ 当对象层数达到10+时 你是如何解决的呢? 呵呵 目前自己也在尝试和这样的一个模式
对各个页面元素的操作函数化
再根据这些函数来生成操作脚本 (如登陆脚本)
根据业务将操作脚本形成业务函数(比如登陆函数)
至于 hsjzfling说到的这样做用处几何?呵呵hsjzfling兄可以说说自己的见解
基于对象的编程和描述性编程这两种形式 在很早前论坛都激烈辩论过这个看项目实际情况和个人喜好了 假如实现了,意义是比较重大的。自动化测试的成本至少要下降50%(大型系统)。
我们这已经实现了字符终端的函数包装化。
针对QTP的包装还在尝试。
主要难点是对象定位的问题。
例如:
用户名:输入框
密码:输入框
通过【用户名】去定位【输入框】。因为一个系统的风格不统一。往往需要好几种函数去定位。 原帖由 xiaoyaoke 于 2009-10-29 17:44 发表 http://bbs.51testing.com/images/common/back.gif
敏捷编程:函数原子化。。。我导师一直这么教导说~~
你想表达的是不对QTP脚本进行包装还是支持? 原帖由 lantianwei 于 2009-10-29 18:18 发表 http://bbs.51testing.com/images/common/back.gif
当对象层数达到10+时 你是如何解决的呢?
我觉得这个是描述性编程和对象库编程的区分。和包装QTP脚本无关系。
针对我说的这种模式可以结合配置脚本和脚本录制的方式,对于不能配置的采取脚本录制,可以配置的才配置。 举个最简单的例子来说明吧
引用LZ的代码
Sub qButtonClick(BnText,pageName,BrowserName,i)
Browser(BrowserName).Page(pageName).WebButton("value:=" & BnText,"index:=" & i).click
End sub
以这个过程为例,写出来的脚本就是
qButtonClick “Submit”,"Page","Browser",0
我并不觉得这比直接录制得到的脚本更直观。
Browser("Browser").Page("Page").Button("Submit").Click
而在开发成本上,也许写一行代码花费的时间不会比录制要长太久(至于长多久主要取决于调试得到index的值),但前期开发、学习该过程的开销就有点得不偿失了。
就维护量来说,假若Button的名称变化了,你认为是去查找所有的代码将"Submit"替换为"Commit"方便呢,还是修改一次共享对象库或者修改该业务所在的公用Action的对象库赖的方便。
将原子业务封装成可公用的函数、过程或者Action,这是必要的,较理想的情况下,所有基于UI测试的自动化用例所在的Test,只需要由一串公用业务的调用+一组测试数据来组成。 首先我肯定将原子业务封装成可公用的函数、过程或者Action的必要性。
这个就是一个案例。一个流程由多个这样的案例组成。并且案例与案例之间存在数据传递关系。就是所谓的业务流。
其实脚本
qButtonClick “Submit”,"Page","Browser",0
和
Browser("Browser").Page("Page").Button("Submit").Click
看上去复杂度是差不多。
但是其根本qButtonClick “Submit”,"Page","Browser",0可以描述成【按钮 确定,登录页面】,将脚本层屏蔽。
其实自动化测试最大的成本投入就是脚本的制作及维护,如何有效的控制这块成本。
一个普通QTP自动化测试工程师=3-5K
一个编写如此傻瓜式脚本的工程师=2-3K
就测试架构而论,这个想法真没技术含量,就如何自动化测试架构去节省测试成本,个想法就是块砖。等着大家的玉。:lol 有一个需求 要实现Browser("Browser").Page("age").Frame("fmr").Frame("ddd").Button("Submit").Click (界面上有很多同名的Submit按钮)
用你的这类方式 你会产生何种类似[输入 用户名,admin,登录页面]脚本呢?
[ 本帖最后由 lantianwei 于 2009-10-30 16:52 编辑 ]
回复 11# 的帖子
先谈谈开发维护效率这块,页面中往往会有多个frame,不定数量的frame中可能存在多个不定数量的同名对象,仅仅在编写脚本时确定index就是个很头痛的问题了,更不用说将来软件变更为一个frame中出现两个同名对象,这时去维护那么多个index工作量将会是多大。再看看人力资源的成本
一个普通QTP自动化测试工程师=3-5K
一个编写如此傻瓜式脚本的工程师=2-3K
你觉得编写"如此傻瓜式的脚本"比录制还简单么,你觉得"普通的QTP自动化测试工程师"要比"编写如此傻瓜式脚本的工程师"多哪些技能和知识? 这么写也就完全不用对象库了吧。那还不如直接用
Set qtp=Browser(BrowserName).Page(pageName)
qtp.webbutton("").click 原帖由 lantianwei 于 2009-10-30 16:51 发表 http://bbs.51testing.com/images/common/back.gif
有一个需求 要实现Browser("Browser").Page("age").Frame("fmr").Frame("ddd").Button("Submit").Click (界面上有很多同名的Submit按钮)
用你的这类方式 你会产生何种类似[输入 用户名,admin,登录页面]脚本呢?
我现在迷惑的就是这个问题。现在时引入了index这个参数。 原帖由 ls_721521 于 2009-10-30 17:16 发表 http://bbs.51testing.com/images/common/back.gif
这么写也就完全不用对象库了吧。那还不如直接用
Set qtp=Browser(BrowserName).Page(pageName)
qtp.webbutton("").click
偏题了,兄弟 原帖由 hsjzfling 于 2009-10-30 17:00 发表 http://bbs.51testing.com/images/common/back.gif
先谈谈开发维护效率这块,页面中往往会有多个frame,不定数量的frame中可能存在多个不定数量的同名对象,仅仅在编写脚本时确定index就是个很头痛的问题了,更不用说将来软件变更为一个frame中出现两个同名对象,这时 ...
同12楼,是面临index的问题。
技能问题我就不做解释了。函数化后配合开发的编辑脚本的平台是可以降低编辑脚本的技能水平。
回复 15# 的帖子
如果有那么方便的方法就可以省略掉复杂的对象层次结构与对象属性去识别到对象,并且还非常便于开发和维护,那开发QTP的设计师又何必费尽千辛万苦弄上这些东西呢,死胡同啊回复 17# 的帖子
也许按照你设想的开发平台确实能降低"编辑脚本的技能水平",但势必要增加能使用这个平台的技能水平。而"一个编写如此傻瓜式脚本的工程师"总不能只写脚本而不调试,他总要保证脚本能跑通才能交差吧,平台可很难去帮助定位错误解决错误吧,这些还是"一个普通QTP自动化测试工程师"需要具备的技能。在人员分配方面,想独立分配出一批只写脚本不管通不通过的廉价工程师,恐怕也是不太可能的吧。
这都还是理论上的分析,希望LZ能多权衡这些风险。当然LZ也可能已经有了很好的应对之策,我们也很乐于看到LZ能有很好的实践成果继续给大家分享。 呵呵,我来支持hsjzfling的;P
页:
[1]
2