たとえば、1.9以前でブロックにおいて、ローカル変数に関する問題が生じた。以下は例である。
a = 1Ruby 1.8で、このコードは「42」とプリントされる。その訳は、実際ブロック変数は含まれているスコープのそれと同じであるからである。Ruby 1.9ではこれを固定して、期待通りにブロックを振る舞わせる。すなわち、「1」とプリントする。もちろん、ライブラリまたはアプリケーションのコード が以前の振る舞いに依存している場合、Ruby 1.9では違った振る舞いをする。
foo.do_something {|a|
a = 42
}
puts a
Zentestのパッケージがこのことを回避する。つまりMultirubyである。Zentestの作成者であるRyan Davis氏が、Ruby 1.8と1.9をMultirubyで扱う方法を紹介する(ブログ・英語)。
1.9が発表された今、multirubyを使用したマルチバージョンのテストについて考えるべきではないか。multirubyはzentestファミ リーの中ではそれほど知られていないツールである。複数のパージョンのRubyや多重化コマンドを自動的にビルドしたり、個人的にインストールしたりし て、一度にそろって複数のバージョンのRubyをテストすることができる。Zentestのインストールは単純である。
gem install ZenTestMultirubyは以下のように機能する。
- たとえばRuby 1.8および1.9をダウンロードし、コンパイルする。
- そして、 利用可能はRubyのバージョンのいずれかとの引数を実行する。
VERSION = 1.8.6-p111ご覧のように、1.8.xでの出力は「42」であるが、1.9では「1」となる。(ここで「RESULT」は、Ruby解釈プログラムの終了コードである)。
42
RESULT = 0
VERSION = 1.9.0-0
1
RESULT = 0
TOTAL RESULT = 0
failures out of 2
Passed: 1.8.6-p111, 1.9.0-0
Failed:
必然的に、十分に高い割合のコードがテストでカバーされている場合に、Multirubyは単に問題を浮き彫りにするのに役立つだけである。さらにバージョンの高いRubyや、JRuby 1.0や1.1、IronRubyやRubiniusが利用可能になれば、ランタイムを越えたテストを簡略化するツールが極めて有用となる。
Ruby1.9を使用して、アプリケーションまたはライブラリを移植しただろうか。少なくともテストはしただろうか。
原文はこちらです:http://www.infoq.com/news/2008/02/multiruby-testing