我们正在重构使用Ruby和Selenium编写的自动化脚本,并讨论了在ruby中使用eval运算符来减少代码。这就是我们所拥有的
我有一个方法'ValidateViewPageElements',它是一个getter方法,它从web ui获取所有值,并将它与我们的xml数据存储库进行比较。我还有一个我编写的CustomAssertion类,它包含一个方法'verify_browser_element',它接受实际值(Web对象的值)和期望值,并基本上完成断言应该做的事情。如果值匹配,则会记录成功,如果不匹配,则会记录错误。
def validateViewPageElements()
CustomAssertion.verify_browser_element_value(complete_field.exists?, false)
CustomAssertion.verify_browser_element_value(editdarrecord_field.exists?, false)
CustomAssertion.verify_browser_element_value(addvehicle_field.exists?, false)
end
重构上述代码评论注释之一是使用eval表达式并执行以下操作以最小化代码
def validateViewPageElements()
array = ["complete_field","editdarrecord_field","addvehicle_field"]
for i in 0..array.length
CustomAssertion.verify_browser_element_value(eval array[i].value, false)
end
end
我已经阅读了一些关于证明使用eval语句及其缺点的文章,但是在上述情况下是否需要使用它。我不使用上述重构的建议如下。 Eval语句每次使用时都会创建一个新字节。 2.它没有向开发人员说明定义方法的内容。 3.引入循环以最小化代码行并不是非常有利。 4.难以在循环中更改期望值,因为它们都必须相同。
在上述情况下是否应该避免eval还有其他原因,或者我的假设是错误的,并且在上面的案例中使用它来将15个断言行减少到5行代码是一个好习惯吗?请帮我。
谢谢。
在Ruby中使用for
循环很简单,使用eval
这么简单的东西让我质疑你的评论者的理智。你通常在Ruby中使用迭代器而不是循环,你可以使用send
而不是eval
:
def validateViewPageElements()
%w[complete_field editdarrecord_field addvehicle_field].each do |m|
CustomAssertion.verify_browser_element_value(send(m).value, false)
end
end
我也切换到%w[]
的字符串数组,这样的报价噪音更少。
为什么不简单:
def validateViewPageElements()
[complete_field, editarrecord_field, addvehicle_field].each {|field| CustomAssertion.verify_browser_element_value(field.exists?, false)}
end