4

ライブラリ ファイルで参照されるテスト クラスで定義されたグローバル変数の使用に問題があります。Ruby 1.9.3p392 と test-unit 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

2

メソッドで定義されたインスタンス変数 (@browser など) はstartup、テストでは使用できません。この古いフォーラム スレッドhttp://www.ruby-forum.com/topic/144884に基づいて、これは設計によるものです。

その動作は仕様です。「テストの分離」という理想は、テスト ケースが開始されるたびに白紙の状態にするために一生懸命働く必要がないことを意味します。そうしないと、テストが前のテストの @value に依存する可能性があり、気付かない方法でそれに依存する可能性があります。

もちろん、他の永続変数はテストの分離を台無しにする可能性があります。各テスト ケース間で Ruby を停止して再起動することはありません。しかし、少なくともそれが発生した場合、@instance 変数のせいではありません。

テスト全体で同じブラウザーを使用するために使用した回避策の 1 つは、クラス変数 (つまり@@browser) を使用することでした。スタートアップは次のようになります。他のメソッドも同様に、使用するには更新する必要があります@@browser

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