2013-01-22 44 views
4

使用ruby的watir测试一个web应用程序会在最后打开浏览器。网上的一些建议是,为了做一个真正的单元测试,你应该在每次测试(在拆卸调用中)打开和关闭浏览器,但这是缓慢而毫无意义的。或者它们做这样的事情:如何在watir测试套件结束时关闭浏览器?

def self.suite 
    s = super 
    def s.afterClass 
    # Close browser 
    end 

    def s.run(*args) 
    super 
    afterClass 
    end 
    s 
end 

但会要求摘要输出不再显示(类似“100次测试,100个断言,0失败,0错误”应仍显示)。

如何在测试结束时使用ruby或watir关闭浏览器?

+0

您正在使用哪个测试跑步者?测试::单位? –

+0

Test :: Unit :: TestCase只要它的工作原理相同,它不会打扰我。试图让我获得更好的工作。 – 0xdabbad00

回答

2

RSpec和黄瓜都有“终结”钩。

RSpec的:

describe "something" do 
    before(:all) do 
    @browser = Watir::Browser.new 
    end 
    after(:all) do 
    @browser.close 
    end 
end 

黄瓜(env.rb):

browser = Watir::Browser.new 

#teh codez 

at_exit do 
    browser.close 
end 
9

当你想使用在您RSpec规格唯一的浏览器,那么你可以使用:suite挂钩,而不是:all其中将在每个示例组中创建并关闭浏览器:

RSpec.configure do |config| 
    config.before :suite do 
    $browser = Watir::Browser.new 
    end 

    config.after :suite do 
    $browser.close if $browser 
    end 
end 

但是,如果出于某种奇怪的原因,你不希望自己使用的RSpec或任何测试框架,那么你可以使用Ruby的Kernel#at_exit方法:

# somewhere 
$browser = Watir::Browser.new 
at_exit { $browser.close if $browser } 

# other code, whenever needed 
$browser.foo 

我还是建议使用一个测试框架,而不是创建你从头开始。

+0

@pguardiario全局变量在这里是必需的,因为在RSpec中设置':suite'钩子中的变量意味着范围与所有示例/示例组不同。另外,在有意义的地方使用单身对象的全局变量(你只有一个浏览器,对吗?)并不是'shit hack'。或者,你会如何解决它? –

+0

我真的没有更好的东西。对不起,我正在删除该评论。 – pguardiario