应用Selenium和Ruby进行面向领域的Web测试
上一篇 / 下一篇 2007-07-03 16:04:53 / 个人分类:16.开源技术 & 开源文化
查看( 2270 ) /
评论( 3 )
这是一篇非常非常好的文章,其中提出的自动化测试的思想让我对自己以往所设计的自动化测试框架产生了新的想法,并发现可以进一步的改进来提高自动化测试脚本和框架的可读性、可靠性和可维护性。这些思想不仅仅适用于 Selenium 的自动化测试,更可以供其他所有的自动化测试框架所参考。—— Jackei 注
H+E;p}+I"W/RnC [#@051Testing软件测试网o0whCBS!C*J
51Testing软件测试网TpO;~`
51Testing软件测试网z9Db(Dh
5U$[B8Z!~?*u0作者徐昊发布于 2007年5月21日 下午10时46分
$pGW.Bw0社区Agile,Ruby主题开放源代码,单元测试,Ruby on Rails应用Selenium进行Web测试时,经常会遇到下面的几个麻烦问题:
b;A g*uaB0
5@'sD~ ?K9C_P0Page Object Pattern里有四个基本概念:Driver、Page、Navigator和Shortcut等。Driver是测试真正的实现机制,比如 Selenium,比如Watir,比如HttpUnit。它们懂得如何去真正执行一个Web行为,通常包含像Click、Select、Type等这样的表示具体行为的方法;Page是对一个具体页面的封装,它们了解页面的结构,知道诸如id、name、class和xpath这类实现细节,并描述用户可以在其上进行何种操作;Navigator则代表了URL,表示一些不经页面操作的直接跳转;最后Shortcut就是helper方法了,需要看具体的需要而定。下面来看一个超级简单的例子——测试登录页面。
1C's9S-Z.m!LhS01. Page Object假设我们使用一个单独的登录页面进行登录,那么可能会将登录的操作封装在一个名为LoginPage的page object里:51Testing软件测试网!V6A1CB ?gU
classLoginPage
Nfj:U8[ tuJGm.q8?0 definitialize driver
@0S1hh;[0 @driver=driver51Testing软件测试网gC*@ xe-a~7Hd
end51Testing软件测试网gSh,b/xtw
)x-p&{`f0 deflogin_as user
2Di O&L(o A/A"X]{0 @driver.type'id=', user[:name]
5BS)M;[j0 @driver.type'xpath=', user[:password]
t a k"Z&_ qQ8H*Q0 @driver.click'name='51Testing软件测试网8sKR$A|&qRH:j
@driver.wait_for_page_to_load
q?p Qo0 end
3a[v B)L V0end
[m1H6{\&qm^051Testing软件测试网*]qb3~0w.`.F1J
login_as是一个具有业务含义的页面行为。在login_as方法中,page object负责通过依靠id、xpath、name等信息完成登录操作。在测试中,我们可以这样来使用这个page object:51Testing软件测试网o!c*I:bX ^k!@K
page=LoginPage.new $selenium51Testing软件测试网O%tZ1IYu'^(rRn
page.login_as :name=>
/iBmJMd0'xxx', :password=>
0rg3qKOAZQ0'xxx'51Testing软件测试网B$q:@-q/G$`1q*tgXl$v3S
v:};N/Bt?O.q%F2x0不过既然用了Ruby,总要用一些ruby sugar吧,我们定义一个on方法来表达页面操作的环境:51Testing软件测试网~mDU/ebB$a
defon page_type,&block51Testing软件测试网;i5f&r(p.MYR
page=page_type.new $selenium51Testing软件测试网"`#tS1j4N,in
page.instance_eval&blockifblock_given?
{TmrW"^s@Lx0end
,s*H`:W F7HkUR'o6B0
E8\*M3Na'?Z0之后我们就可以使用page object的类名常量和block描述在某个特定页面上操作了:
6u.R-d}EV1m0on LoginPage do51Testing软件测试网PmY|9_KHq.u
login_as :name=>51Testing软件测试网/O$i)k b#`Ejd C
'xxx', :password=>51Testing软件测试网'~.F9pO{!|
'xxx'51Testing软件测试网$_#U9P2JXN
end51Testing软件测试网S)I2g;X7K+o.Uq3?C
I)la2tAY,pK0除了行为方法之外,我们还需要在page object上定义一些获取页面信息的方法,比如获取登录页面的欢迎词的方法:
"wz?7Q/I }:d0defwelcome_message51Testing软件测试网J W7nBX!o@ g1}B\
@driver.get_text'xpath='51Testing软件测试网3i&o&S
H+E;p}+I"W/RnC [#@051Testing软件测试网o0whCBS!C*J
51Testing软件测试网TpO;~`
51Testing软件测试网z9Db(Dh
5U$[B8Z!~?*u0作者徐昊发布于 2007年5月21日 下午10时46分
$pGW.Bw0社区Agile,Ruby主题开放源代码,单元测试,Ruby on Rails应用Selenium进行Web测试时,经常会遇到下面的几个麻烦问题:
b;A g*uaB0
- 大量使用name、id、xpath等页面元素。无论是功能修改、UI重构还是交互性改进都会影响到这些元素,这使得Selenium测试变得非常脆弱。
- 过于细节的页面操作不容易体现出行为的意图,一段时间之后就很难真正把握测试原有的目的了,这使得Selenium测试变得难于维护。
- 对具体数据取值的存在依赖,当个别数据不再合法的时候,测试就会失败,但这样的失败并不能标识功能的缺失,这使得Selenium测试变得脆弱且难以维护。
5@'sD~ ?K9C_P0Page Object Pattern里有四个基本概念:Driver、Page、Navigator和Shortcut等。Driver是测试真正的实现机制,比如 Selenium,比如Watir,比如HttpUnit。它们懂得如何去真正执行一个Web行为,通常包含像Click、Select、Type等这样的表示具体行为的方法;Page是对一个具体页面的封装,它们了解页面的结构,知道诸如id、name、class和xpath这类实现细节,并描述用户可以在其上进行何种操作;Navigator则代表了URL,表示一些不经页面操作的直接跳转;最后Shortcut就是helper方法了,需要看具体的需要而定。下面来看一个超级简单的例子——测试登录页面。
1C's9S-Z.m!LhS01. Page Object假设我们使用一个单独的登录页面进行登录,那么可能会将登录的操作封装在一个名为LoginPage的page object里:51Testing软件测试网!V6A1CB ?gU
classLoginPage
Nfj:U8[ tuJGm.q8?0 definitialize driver
@0S1hh;[0 @driver=driver51Testing软件测试网gC*@ xe-a~7Hd
end51Testing软件测试网gSh,b/xtw
)x-p&{`f0 deflogin_as user
2Di O&L(o A/A"X]{0 @driver.type'id=', user[:name]
5BS)M;[j0 @driver.type'xpath=', user[:password]
t a k"Z&_ qQ8H*Q0 @driver.click'name='51Testing软件测试网8sKR$A|&qRH:j
@driver.wait_for_page_to_load
q?p Qo0 end
3a[v B)L V0end
[m1H6{\&qm^051Testing软件测试网*]qb3~0w.`.F1J
login_as是一个具有业务含义的页面行为。在login_as方法中,page object负责通过依靠id、xpath、name等信息完成登录操作。在测试中,我们可以这样来使用这个page object:51Testing软件测试网o!c*I:bX ^k!@K
page=LoginPage.new $selenium51Testing软件测试网O%tZ1IYu'^(rRn
page.login_as :name=>
/iBmJMd0'xxx', :password=>
0rg3qKOAZQ0'xxx'51Testing软件测试网B$q:@-q/G$`1q*tgXl$v3S
v:};N/Bt?O.q%F2x0不过既然用了Ruby,总要用一些ruby sugar吧,我们定义一个on方法来表达页面操作的环境:51Testing软件测试网~mDU/ebB$a
defon page_type,&block51Testing软件测试网;i5f&r(p.MYR
page=page_type.new $selenium51Testing软件测试网"`#tS1j4N,in
page.instance_eval&blockifblock_given?
{TmrW"^s@Lx0end
,s*H`:W F7HkUR'o6B0
E8\*M3Na'?Z0之后我们就可以使用page object的类名常量和block描述在某个特定页面上操作了:
6u.R-d}EV1m0on LoginPage do51Testing软件测试网PmY|9_KHq.u
login_as :name=>51Testing软件测试网/O$i)k b#`Ejd C
'xxx', :password=>51Testing软件测试网'~.F9pO{!|
'xxx'51Testing软件测试网$_#U9P2JXN
end51Testing软件测试网S)I2g;X7K+o.Uq3?C
I)la2tAY,pK0除了行为方法之外,我们还需要在page object上定义一些获取页面信息的方法,比如获取登录页面的欢迎词的方法:
"wz?7Q/I }:d0defwelcome_message51Testing软件测试网J W7nBX!o@ g1}B\
@driver.get_text'xpath='51Testing软件测试网3i&o&S