基于Selenium的Dojo Web功能测试
关键词:软件测试,Selenium,Dojo
作者:BIce 创建时间:2011-03-15 11:28:50
由于最近的需要,需要对团队编写的web项目(dojo+spring)进行功能测试,也是为了方便自动化回归测试需要,查找了下Web测试可用的测试工具,可选的大概有Selenium ,watir, 和rational functional tester (IBM),最后选择了Selenium作为使用的工具,主要原因是Selenium比较容易学习,收集到的资料比较多,而watir需要ruby作为脚本语言 对此不熟所以目前放弃,而强大如rational functional tester声称支持dojo,但录制调试FireFox脚本时会出现类似卡死的状况,而脚本保存会直接失败,而对于FireFox而言 Selenium的IDE则足够强大,通过IDE的简单录制加上手动加工最后导出到目标脚本(我采用的Java方式)则可以生成快速的质量较高的脚本。
主要问题:
1. dojo框架所给出的各个控件并不会像传统的html标签一样,一旦代码书写完成就有固定的html id和html结构,dojo会自动为每个所使用的控件创建一系列节点,并随机给每个控件一个"控件类别+顺序号"的html id,这样就给书写selenium用例带来了麻烦.
2. dojo框架提供的控件使用的事件机制无法用普通的Selenium Ide录制来完成,必须给以加工才可以使用,否则无法触发实际控件的动作。
3. dojo作为一个ajax工具包,当然使用了ajax框架,所以web的行为具有异步特征,在进行事件的模拟(类似单击下拉框进行选择时)由于一般此种控件的数据源会在服务器处获得由此会产生一个ajax调用,在此时直接执行单击动作会无法找到相应节点(因为数据还木有返回,节点当然就无法生成),从而产生一个element not found的错误而导致测试出错.
给出目前具体的测试方案:要使用Firebug加以辅助
1. 在Filefox下使用Selenium IDE进行简单的测试用例录制,
首先 对需要进行ajax调用的地方加上pause(xxTime)命令以忙等(应该可以用waitForCondition命令完成,但是由于dojo控件的复杂性暂时使用忙等的策略)
其次 主要问题1 的节点无法保证正确定位的问题 采取每个用例重新登录,刷新页面,保证每次测试和录制脚本时浏览器环境保持一致,来达到其即使按顺序号进行ID的生成,也可以保证找到正确的节点(这样也可以时每个用例不相干扰,但是感觉方法较笨等待改进)
最后 对于事件的模拟问题,需要针对每个dojo widget进行测试,以确认每个dojo widget的模拟方法,比如一般对于widget 的click方法如果不起作用的话,可以换做clickAt方法,对于某些widget ,录制的行为有可能作用的target位置有误,可以借用Firebug进行确认,下面只给出FilteringSelect下拉框控件的click我的解决方法,由于FilteringSelect的实现html dom不是select标记,所以Selenium的api select命令无法使用。
命令序列为: clickAt //div[@id='widget_dijit_form_FilteringSelect_XXX']/div[1] 其中XXX为其顺序号 Firebug确认
pause 2000 忙等ajax数据调用
mouseOver //div[@id='widget_dijit_form_FilteringSelect_XXX_dropdown']/ul/li[text()='YYY']
dojo FilteringSelect 控件的option被实现为ul / li 其中text()="YYY"为选则的option value
clickAt //div[@id='widget_dijit_form_FilteringSelect_0_dropdown']/ul/li[text()='YYY']
mouseOver到要选择的option后 使用clickAt 选择option 至此一次select option完成
(以下省略一千字...)
2. 假定你已完成了Selenium 脚本的录制,那么可以进行下一步了,使用Selenium RC进行测试,在IDE中选择将脚本转换成喜欢的语言的脚本(本人使用Java ,以下均为Java脚本为例,并采用了JUnit 进行集成).
在Eclipse中新建工程,新建JUnit TestCase 将刚生成的脚本代码复制到testXXX方法中,并在项目中导入Selenium RC Java库,并在TestCase中import进相应的文件,这个测试用例就可以执行了,而其后的TestCase 和TestSuite等内容如何组织,就看个人喜欢啦。
另注:Selenium 有个缺点,它在遇到js错误的时候不会像watir可以停止测试执行,它会直接进行后续的测试而忽略这个错误,所以当js错误的时候Selenium无法测试出来,解决方法可参考 http://www.silverwareconsulting.com/index.cfm/2010/6/7/Checking-for-JavaScript-Errors-with-Selenium 的做法。
再多一嘴,目前的selenium-server-standalone-2.0b2版本中 -firefoxProfileTemplate选项开启配置后无法启动浏览器,使用selenium-server-standalone-2.0b1版本即可 mark:2011.3.15