[ruby-list:49743] Re: test-unitで使用するテストケースを動的に生成したい

From: Nobuyoshi Nakada <nobu@...>
Date: 2014-01-26 06:31:18 UTC
List: ruby-list #49743
なかだです。

(2014/01/24 23:03), 古川大輔 wrote:
> 実際やってみると
> $ ruby -v
> ruby 1.9.2p320 (2012-04-20 revision 35421) [x86_64-linux]
> $ ruby pc/search.rb
> Loaded suite pc/search
> Started
> [called]startup
> [define]test_search1_with_browser1
> [define]test_search1_with_browser2
> tests:[:test_default, :test_search1_with_browser1, :test_search1_with_browser2]
> .
> Finished in 0.003118883 seconds.
> 1 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
> 100% passed
> 320.63 tests/s, 0.00 assertions/s
> 
> ということで、テストは生成されているのですけど、実行してもらえないようです。
> どこかもうちょっと早いタイミングで生成する必要があるのかと思うのですけど、initializeでもダメだったので、どうしたものかと考えています。

自動的にメソッドを定義する一般的な方法として回答しますと、メソッド内で定義したのではそのメソッドが呼ばれるまで定義されません。
クラス定義内で定義すれば、通常のメソッド同様すぐに使えるようになります。

  require "test-unit"
  class Search1 < Test::Unit::TestCase
    def _test_search1(browser)
      STDERR.puts "[test]%s with %s"%['search1',browser.to_s]
    end
    def test_default
      STDERR.puts "tests:%s"%self.methods.grep(/^test/).to_s
    end

    browsers = ['browser1','browser2']
    # _test_で始まるメソッドを元に各ブラウザに対するテストを生成する
    instance_methods(false).grep(/\A_test_/) {|method_name|
      browsers.each{|browser|
        test_name = "#{method_name[1..-1]}_with_#{browser}"
        STDERR.puts "[define]#{test_name}"
        define_method(test_name) {
          send(method_name,browser)
        }
      }
    }
  end

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread