我在使用我的测试类中定义的全局变量时遇到问题,然后在库文件中引用该变量。我使用的是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
有什么想法吗?
答案 0 :(得分:3)
您的预测试初始化代码未运行。
TestUnit框架要求设置代码位于名为setup
的方法中,拆解代码位于名为teardown
的方法中
您有两个选项可以将方法startup
重命名为setup
,将方法shutdown
重命名为teardown
,或者,如果您出于其他目的需要设置/关闭,创建委托方法:
def setup
startup
end
def teardown
shutdown
end
答案 1 :(得分:2)
startup
方法中定义的实例变量(即@browser)将无法用于测试。基于这个旧的论坛帖子http://www.ruby-forum.com/topic/144884,它是设计的:
这种行为是设计的。理想的“测试隔离”意味着每次测试用例启动时都不需要太努力就能获得干净的平板。否则,测试可能依赖于之前测试中的@value,并且可能以您不注意的方式依赖它。
当然,任何其他持久变量都可能破坏测试隔离。我们不会在每个测试用例之间停止并重新启动Ruby。但至少在它发生的时候,@ instance变量不会受到责备。
我曾经使用的一种解决方法是我曾经在测试中使用相同的浏览器是使用类变量(即@@browser
)。启动将如下所示。同样必须更新其他方法以使用@@browser
。
def startup
@@browser = Watir::Browser.new :ie
@@browser.speed = :fast
end