【发布时间】:2014-06-03 18:52:35
【问题描述】:
我的团队目前正在使用我们旧的 UI 验收测试脚本并将它们自动化。为此,我们使用了 Jruby、Cucumber 和 Watir-Webdriver。到目前为止,自动化过程进展顺利。我们唯一的问题是我们的步骤定义开始有点失控了。
例如,在我们的大多数场景中是这样的部分:
Given I press the SEARCH_BUTTON
Then I should land on the SEARCH_PAGE
步骤定义如下所示:
Given(/I press the (.*)$/) do |buttonName|
if buttonName == 'SEARCH_BUTTON'
eval "$browser.#{$DataHash['home']['searchButton']}.when_present.click"
elsif buttonName == 'LOGIN_BUTTON'
eval "$b.#{$DataHash['loginPage']['loginButton']}.click"
elsif buttonName == 'HOME_BUTTON'
eval "$b.#{$DataHash['mainPage']['HomeButton']}.click"
elsif buttonName == 'ADD_PRODUCT_BUTTON'
#This if else ladder goes on like this for another 300+ lines
...
end
end
$DataHash 变量引用config.yml,它使用哈希来存储我们正在使用的所有不同的网络元素。
config.yml
home:
searchButton: "link(:id => 'searchBtn')"
searchTypeSelectBox: "select_list(:name => 'matchType')"
searchResetButton: "button(:id => 'resetSearch')"
#rest of the elements on the home page...
loginPage:
loginButton: "link(:id => 'login')"
#rest of the elements on the login page...
....
所以$browser.$DataHash['home']['searchButton'].when_present.click 等价于$browser.link(:id => 'searchBtn').when_present.click
我们为用户可以点击的每个按钮使用这个基本步骤定义,此时这个步骤定义类似于 300 多行代码。其中大部分是像上面这样的单行。我们的其他步骤定义也有同样的问题。有没有什么好的方法可以重构我们的步骤定义,使其不那么臃肿,或者至少更容易搜索,同时又不会降低实际步骤的可重用性?
最初,我们认为我们可以根据正在测试的页面在多个文件中拥有相同的步骤定义。所以在searchDefinitions.rb 中会有一个Given(/I press the (.*)$/) do |buttonName| 的步骤定义,它只有在搜索页面上找到的不同按钮。然后在homeDefinitions.rb 中将是相同的步骤定义,但只有主页按钮的代码。基本上打破了跨多个文件的 if-else 阶梯。当然,Cucumber 不允许在多个文件中定义相同的步骤,所以现在我们有点不知所措。
【问题讨论】:
-
你让我参与了“重构”和“大规模”。我有一个答案,但请在
elsif buttonName == 'LOGIN_BUTTON'之后写下这一行,这样我就可以确定我正在解决所有必要的变化。 -
@DaveSchweisguth 在示例代码中添加了几行以显示问题。希望能更好地理解问题
-
我正在寻找另一条 eval 行。
-
啊,明白了。例如添加了一些。它们之间唯一真正的区别是用于查找正确 html 元素的哈希值
-
$DataHash 值是否总是“link(:id => 'something')”?
标签: webdriver refactoring cucumber jruby acceptance-testing