Ruby 在Cucumber中测试失败时实例化watir浏览器而不使用singleton模式
我一直在尝试创建一个可用于快速引导基于浏览器的验收测试套件的。关于经常关闭和重新打开浏览器窗口的常见反模式(这会给测试套件增加不必要的延迟),可以通过向env.rb文件添加以下内容来避免:Ruby 在Cucumber中测试失败时实例化watir浏览器而不使用singleton模式,ruby,singleton,cucumber,watir-webdriver,Ruby,Singleton,Cucumber,Watir Webdriver,我一直在尝试创建一个可用于快速引导基于浏览器的验收测试套件的。关于经常关闭和重新打开浏览器窗口的常见反模式(这会给测试套件增加不必要的延迟),可以通过向env.rb文件添加以下内容来避免: browser = Watir::Browser.new Before do @browser = browser end at_exit do browser.close end 但我不确定如何合并此行为,同时在测试失败时仍重新启动浏览器(这确保失败的测试不会泄漏浏览器状态并导致失败级联到不相
browser = Watir::Browser.new
Before do
@browser = browser
end
at_exit do
browser.close
end
但我不确定如何合并此行为,同时在测试失败时仍重新启动浏览器(这确保失败的测试不会泄漏浏览器状态并导致失败级联到不相关的场景)
我目前的方法是将Watir::Browser
实例化包装在Browser
单例类中,如下所示:
# support/browser.rb
class Browser
class << self
def instance
@browser
end
def start(name: 'chrome')
@name = name
@browser = Watir::Browser.new(name.to_sym)
end
def stop
@browser.close # if a page hangs this will fail with a selenium unknown error
rescue Selenium::WebDriver::Error
puts 'Failed to close old browser (possibly because page is hanging), starting new one!'
end
def restart
stop
start(name: @name)
end
end # singleton methods
end
这是可行的,但是有没有更好的方法来写呢?如果应用程序不稳定,那么这种方法就没有用了。我建议创建一个新的browser实例,并在场景结束时将其关闭。避免使用singleton的动机是什么?我个人喜欢这种方法。你有什么问题吗?另一种方法是在
之前和退出时在范围之外定义浏览器。听起来您需要在测试之间传递一些全局状态。我会尽量避免使用单例,因为它会导致糟糕的设计,特别是当支持代码变得越来越复杂,并且不容易进行单元测试时。但从直觉上讲,如果我需要在测试之间保留一些全局状态,我就不能对类的实例进行操作是有道理的。显然,web应用之间可能存在很大的差异,但你的恐惧和代码是合理的还是合理的?由于应用程序的浏览器状态,您是否实际遇到结转错误?在过去几年使用Watir&Cucumber进行的测试中,我本人从未遇到过这个问题。(尽管我承认我的测试中没有一个假设浏览器已经在需要的页面上,等等)最近的一个例子是,在当前用户注销之前,我检查我想要的用户是否已经登录,然后与所需的用户登录。@ChuckvanderLinden我最初编写代码的原因是由于我正在测试的一个遗留应用程序的问题,在该应用程序中,由于难以跟踪会话错误,页面偶尔会挂起(重新启动浏览器可以让测试继续进行而不会出现问题)导致后续不相关的测试失败。我认为这唯一有用的时间是当我们处理javascript模型时,如果测试失败,让它保持打开状态,可能会导致后续测试失败,因为该模型会阻止“注销”链接或任何其他导航链接。
Browser.start
Before do
@browser = Browser.instance
end
After do |scenario|
Browser.restart if scenario.failed?
end
at_exit do
Browser.stop
end