BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Multirubyでの1.8と1.9の互換性の検証

Multirubyでの1.8と1.9の互換性の検証

Rubyライブラリまたはアプリケーションに取り組んでいるデベロッパは、新たなタスクを抱え込んでいる。Rubyのバージョンに関わらず、コードが正 常に機能するよう確実にすることである。代わりのRubyを実装することが1つの理由であるが、一般的にMRIとほぼ同じように機能することを目的として いる。Ruby 1.9のリリースに伴い、この状況は変わった。Ruby 1.9に互換性がない変更があり、または少なくともコードの振る舞いに変更がある(参考記事・英語)

たとえば、1.9以前でブロックにおいて、ローカル変数に関する問題が生じた。以下は例である。
 a = 1
 foo.do_something {|a|
 a = 42
 }
 puts a
Ruby 1.8で、このコードは「42」とプリントされる。その訳は、実際ブロック変数は含まれているスコープのそれと同じであるからである。Ruby 1.9ではこれを固定して、期待通りにブロックを振る舞わせる。すなわち、「1」とプリントする。もちろん、ライブラリまたはアプリケーションのコード が以前の振る舞いに依存している場合、Ruby 1.9では違った振る舞いをする。

Zentestのパッケージがこのことを回避する。つまりMultirubyである。Zentestの作成者であるRyan Davis氏が、Ruby 1.8と1.9をMultirubyで扱う方法を紹介する(ブログ・英語)
1.9が発表された今、multirubyを使用したマルチバージョンのテストについて考えるべきではないか。multirubyはzentestファミ リーの中ではそれほど知られていないツールである。複数のパージョンのRubyや多重化コマンドを自動的にビルドしたり、個人的にインストールしたりし て、一度にそろって複数のバージョンのRubyをテストすることができる。
Zentestのインストールは単純である。
gem install ZenTest 
Multirubyは以下のように機能する。
  • たとえばRuby 1.8および1.9をダウンロードし、コンパイルする。
  • そして、 利用可能はRubyのバージョンのいずれかとの引数を実行する。
multirubyコマンドは、単にすべての指定された引数をRubyバイナリにパスするだけである。上記のコードサンプルを実行すると、以下のような出力が得られる。
VERSION = 1.8.6-p111
 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:
ご覧のように、1.8.xでの出力は「42」であるが、1.9では「1」となる。(ここで「RESULT」は、Ruby解釈プログラムの終了コードである)。

必然的に、十分に高い割合のコードがテストでカバーされている場合に、Multirubyは単に問題を浮き彫りにするのに役立つだけである。さらにバージョンの高いRubyや、JRuby 1.0や1.1、IronRubyやRubiniusが利用可能になれば、ランタイムを越えたテストを簡略化するツールが極めて有用となる。

Ruby1.9を使用して、アプリケーションまたはライブラリを移植しただろうか。少なくともテストはしただろうか。

原文はこちらです:http://www.infoq.com/news/2008/02/multiruby-testing

この記事に星をつける

おすすめ度
スタイル

BT