4

我在使用我的测试类中定义的全局变量时遇到问题,然后在库文件中引用了该变量。我正在使用 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

这是包含登录功能的库的一部分:

require 'rubygems'

 module Functions 

  def login(url, user, passw)
    @browser.goto(url)
    ...
  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

有任何想法吗?

4

2 回答 2

3

您的预测试初始化​​代码未运行。

TestUnit 框架期望安装代码在一个名为的方法中setup,而拆卸代码在一个名为的方法中teardown

您有两个选择,要么将方法重命名为startupsetup要么将方法重命名shutdownteardown,或者,如果出于其他目的需要设置/关闭,请创建委托方法:

def setup
  startup
end

def teardown
  shutdown
end
于 2013-04-08T16:43:52.357 回答
2

方法中定义的实例变量(即@browser)startup将不可用于测试。基于这个旧论坛主题http://www.ruby-forum.com/topic/144884,它是设计使然:

这种行为是设计使然。“测试隔离”的理想意味着每次测试用例开始时您都不需要太努力地获得一个干净的状态。否则,测试可能会依赖上一个测试中的 @value,并且可能会以您没有注意到的方式依赖它。

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

我曾经使用过的一种解决方法是在测试中使用相同的浏览器是使用类变量(即@@browser)。启动将如下所示。其他方法同样必须更新才能使用@@browser.

def startup
  @@browser = Watir::Browser.new :ie
  @@browser.speed = :fast
end
于 2013-04-08T17:36:14.823 回答