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

From: Kouhei Sutou <kou@...>
Date: 2014-01-25 02:01:57 UTC
List: ruby-list #49740
須藤です。

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