在ruby单元测试中访问全局变量

在ruby单元测试中访问全局变量,ruby,unit-testing,watir,Ruby,Unit Testing,Watir,我在使用my test类中定义的全局变量时遇到问题,该变量随后在库文件中引用。我正在使用Ruby 1.9.3p392和测试单元2.5.4 这是运行测试的代码: require 'rubygems' gem 'test-unit' require 'test/unit' require 'ci/reporter/rake/test_unit_loader' load '../lib/functions.rb' require 'watir' class Test_002 < Test::U

我在使用my test类中定义的全局变量时遇到问题,该变量随后在库文件中引用。我正在使用Ruby 1.9.3p392和测试单元2.5.4

这是运行测试的代码:

require 'rubygems'
gem 'test-unit'
require 'test/unit'
require 'ci/reporter/rake/test_unit_loader'
load '../lib/functions.rb'
require 'watir'

class Test_002 < Test::Unit::TestCase

  include Functions

  class << self
   def startup
      @browser = Watir::Browser.new :ie
      @browser.speed = :fast
    end

    def shutdown
      @browser.close
    end
  end

  def test_001_login
    login('some_url', 'some_user', 'some_passw')
  end
end
这是输出:

Started
E
===============================================================================
Error: test_001_login(Test_002)
  NoMethodError: undefined method `goto' for nil:NilClass
(...)
     23:   end
     24:   
     25:   def test_001_login
  => 26:     login('some_url', 'some_user', 'some_passw')
     27:   end
     28:    
     29: end
===============================================================================

Finished in 3.0043 seconds.

1 tests, 0 assertions, 0 failures, 1 errors, 0 pendings, 0 omissions, 0 notifications
0% passed

0.33 tests/s, 0.00 assertions/s

有什么想法吗?

您的测试前初始化代码没有运行

TestUnit框架希望设置代码位于名为
setup
的方法中,拆卸代码位于名为
teardown
的方法中

您有两个选项,将方法
启动
重命名为
设置
,将方法
关闭
重命名为
拆卸
,或者,如果出于其他目的需要设置/关闭,请创建代理方法:

def setup
  startup
end

def teardown
  shutdown
end
startup
方法中定义的实例变量(即@browser)将不可用于测试。基于此旧论坛线程,其设计如下:

这种行为是故意的。“测试隔离”的理想意味着您不需要在每次测试用例启动时都付出太多的努力来获得一份干净的记录。否则,一个测试可能依赖于上一个测试中的@值,并且可能以您没有注意到的方式依赖它

当然,任何其他持久变量都可能破坏测试隔离。我们不会在每个测试用例之间停止并重新启动Ruby。但至少当它发生时,@instance变量不会受到责备

我在测试中使用同一浏览器时使用的一个变通方法是使用类变量(即
@@browser
)。启动过程如下所示。其他方法同样必须更新才能使用
@@browser

def startup
  @@browser = Watir::Browser.new :ie
  @@browser.speed = :fast
end

我相信测试前的初始化代码正在运行。新版本的测试单元有一个和方法。这很有意义。也许这不是我想要实现的最好的设置。我已经创建了一个测试套件,我构建它的方式是在Watir中包含一个自动化的测试用例,并将每个块(步骤+验证)定义为一个单元测试用例。这就是我试图创建@browser实例,然后将其余步骤作为单元测试运行的原因。是否有其他更好的方法来处理此问题?听起来您计划让测试用例中的每个测试依赖于之前的测试(即测试002依赖于测试001结束时的浏览器状态)。我曾经使用过这样的测试套件;这并不理想。如果一个测试失败,您必须重新运行所有内容以重新检查测试。共享浏览器实例(以保存浏览器的启动/关闭)可以。但测试本身不应该是独立的。
def startup
  @@browser = Watir::Browser.new :ie
  @@browser.speed = :fast
end