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

From: 古川大輔 <mogya99@...>
Date: 2014-01-25 05:25:47 UTC
List: ruby-list #49741
須藤さんありがとうございます。



#複雑なことがしたかったわけじゃないのですけど、メタプログラミングが面白くてつい...

教えていただいた案だとテストごとにbrowserを定義しないといけないと思ったので、そこをまとめるイメージで書いてみました。

# browser_testbase.rb
require "test-unit"
class Browser1Test < Test::Unit::TestCase
  def browser
    "browser1"
  end
end
class Browser2Test < Test::Unit::TestCase
  def browser
    "browser2"
  end
end
 ↑こういうブラウザごとの基底クラスを用意しておいて
# testbase.rb
require "browser_testbase.rb"
module SearchTests
  def test_search1
    STDERR.puts "[test]%s with %s"%['search1',browser.to_s]
  end
end
class SearchWithBrowser1 < Browser1Test
  include SearchTests
end
class SearchWithBrowser2 < Browser2Test
  include SearchTests
end
こんなふうにテストを書くことで、テストを一個書けばブラウザの個数だけテストしてもらうことができるようになりました。

ただ、ファイルを作るたびにクラス定義を書かないといけないのがdryでない感じなのですけど、ここはしょうがないのでしょうか?
例えばこの後 test_add.rbを作ると
# test_add.rb
module AddTests
  def test_add1
    STDERR.puts "[test]%s with %s"%['add1',browser.to_s]
  end
end
class AddWithBrowser1 < Browser1Test
  include AddTests
end
class AddWithBrowser2 < Browser2Test
  include AddTests
end
となって、うしろのクラス宣言を毎回ブラウザの数だけ書かないといけないのはなんとかならないの?というふうに感じています。

----- Original Message -----
> From: Kouhei Sutou <kou@cozmixng.org>
> To: ruby-list@ruby-lang.org
> Cc: 
> Date: 2014/1/25, Sat 11:01
> Subject: [ruby-list:49740] Re: test-unitで使用するテストケースを動的に生成したい
> 
> 須藤です。
> 
> In <612264.71399.qm@web100217.mail.kks.yahoo.co.jp>
>   "[ruby-list:49739] test-unitで使用するテストケースを動的に生成したい" on Fri, 24 Jan 
> 2014 23:03:29 +0900 (JST),
>   古川大輔 <mogya99@yahoo.co.jp> wrote:
> 
>> 
>  似たようなパターンのテストを複数実施するために、define_methodでテストを生成して実行したいと考えているのですが、うまいこといかないのでアドバイスいただけないでしょうか?
> ...
>> 
> #ちなみに最終的に何をしたいかというと、Selenium::WebDriverを使ってIEやFireFoxなど複数のブラウザオブジェクトを生成し、そのそれぞれに対して同じテストを実施したいと考えています。
> 
> そんな難しいことをしなくてもよいですよ。
> test-unitは「いつも通りのRubyスクリプト」として書いていい感
> じに動くことを大事にしているので、いつも通りに書けば実現でき
> ます。
> 
> Rubyでは実装を共有するためにモジュールを使いますよね。今回は
> 「同じテストを実施したい」ということなので、「テストの中身」
> を共有すればよいですね。ということで、モジュールを作ります。
> 
> --
> require "test-unit"
> 
> module SearchTests
>   def test_search1
>     STDERR.puts "[test]%s with %s"%['search1',browser.to_s]
>   end
> end
> --
> 
> ↑ではbrowserを使っていますが、このモジュールでは定義していま
> せん。今回はこのbrowser毎にテストを実施したいということなので、
> browser毎にテストケースを作り、それに↑で作ったモジュールを
> includeします。
> 
> --
> class Browser1Test < Test::Unit::TestCase
>   include SearchTests
> 
>   def browser
>     "browser1"
>   end
> end
> 
> class Browser2Test < Test::Unit::TestCase
>   include SearchTests
> 
>   def browser
>     "browser2"
>   end
> end
> --
> 
> いつも通りのRubyスクリプトですよね。
> 難しく考えなくてよいですよ。
> 
> 実際に実行してみるとbrowser毎に同じ内容のテストを実施してい
> ます。
> 
> --
> % ruby /tmp/b.rb
> Loaded suite /tmp/b
> Started
> [test]search1 with browser1
> .[test]search1 with browser2
> .
> 
> Finished in 0.00116859 seconds.
> 
> 2 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 
> notifications
> 100% passed
> 
> 1711.46 tests/s, 0.00 assertions/s
> --
> 
>>  ということで、テストは生成されているのですけど、実行してもらえないようです。
>>  どこかもうちょっと早いタイミングで生成する必要があるのかと思うのですけど、initializeでもダメだったので、どうしたものかと考えています。
> 
> 参考までに。。。
> 
> test-unitは、最初に、登録されているテストを列挙して、実際に実
> 行するテストをフィルター(-nオプションなどで実行するテストを
> 絞り込めます)して、それからstartupやテストケースオブジェクト
> を作っているので、古川さんが試したタイミングではすでに間に合
> わないのです。
> 

In This Thread