From: SASADA Koichi Date: 2007-06-28T03:45:09+09:00 Subject: [ruby-dev:31076] Re: $&;[] dumps core  ささだです。 Yusuke ENDOH wrote: >> ついでに、出来たら testcase な書き方で例を出していただける >> と、テストにさくっと追加できて幸せです。 > > よくわかりませんが、a = ($&;[]); assert_equal([], a) とか書けば > いいんでしょうか。  いい機会なのでまとめておきます。  現在、テストを書くところが Ruby にはいくつかあります。以下に 私が知っていることを書きますので参考にしてください。私の調べた 範囲だけなので、何か不備・不足があればご指摘ください。 (1) bootstraptest/ 目的・特徴: ・メソッド呼び出しや多重代入など、「動かないと話ならない」  機能をテスト ・たとえば、コアの中身を変えた時などに利用。あと、別の Ruby イ ンタプリタの開発初期などに利用可能だと思う ・後述の sample/test.rb の欠点を補うために用意 ・テストごとに別プロセスで実行するので、大きなプログラムでしか 再現しないバグ(GCのバグなど)は発見できないことが多い ・テストごとに別プロセスで実行するので、状態を変にするプログラ ムのテストには適している(Kernelのメソッド再定義実験とか) ・テスト管理プログラムが 1 file (bootstraptest/runner.rb)な ので、簡単にいじったりできる。 記述方法: ・bootstraptest/test*.rb に記入 ・make btest で bootstraptest/test_*.rb 全部を実行 ・assert_equal(expected, program) と記述 ・program は単体で実行可能なこと 実行方法: ・make btest OPTS='--set foo' で、foo というファイル名を実行 ・BASERUBY(ruby 1.8 など、外部プログラム)でテストを実行 (driver)。つまり、テストする側は信頼できる(たぶん) ・driver は、ビルドした miniruby (target)に、program を実行 させ、その結果を expected と比較する。 ・target を変更するには OPTS に --ruby=[target] を追加する。た とえば、jruby を指定すれば、jruby の 1.9 仕様チェックになる (やるのかしらん) (2) sample/test.rb 目的・特徴: ・従来からあった処理系のテスト。bootstraptest/ 相当だった。 ・一か所で例外が起きると、その後実行されないので、網羅的なテス トには向かない ・たくさん機能をテストするので、ある程度完成度の高い処理系じゃ ないとテストを通らない。というか、テストが最後まで実行できない ・なので、failure はあるが、yarv は結構凄い。 ・昔からあるテストなので、インストール前にとりあえず試す人が多い。 記述方法: ・sample/test.rb に記入 ・test_ok() メソッドの第一引数に false が来ると失敗 ・test_ok(expected == result) がイディオム 実行方法: ・make test で実行 ・ビルドした miniruby で全部実行 ・miniruby なので拡張ライブラリ(.so)が使えない。 ・ビルドした miniruby が腐ってると、テスト結果も信用ならないか もしれない (3) test/ 目的: ・test/unit を利用したテスト ・主に、拡張ライブラリやライブラリのテストなどに利用 ・ruby のコアの機能についてのテストも存在 ・test/unit は optparse.rb を利用しているが、optparse.rb は変 態的な Ruby の機能をたくさん使っているので、かなり完成度の高い Ruby処理系じゃないと、このテストは実行できない ・もちろんビルドした ruby が腐っていると結果は信用できないが、 test/unit が実行できている時点で大分信用できるかもしれない(で きないかもしれない。実体験として。) 記述方法: ・test/unit の記法により記述 ・test/test_foo.rb、もしくは test/foo/test_*.rb に記述 ・ruby のコア機能は test/ruby/test_*.rb に記述 実行方法: ・make test-all と実行すると、test/ 以下の全テストが実行される ・make test-all TESTS=xxx とすると、xxx のテストが実行される  たとえば、TESTS=ruby だと、test/ruby/ 以下が実行される ・TESTS に '-x yyy' とすると、yyy という名前の含んだテストが実 行されない。 ・TESTS に '-v' を含ませておくと、テスト項目が表示される ・その他、オプションは test/unit に準ずる(多分) ・ビルドした ruby プログラムで全部実行する ・ruby なので拡張ライブラリ(.so)を使える  で、今回のケースを (1), (2), (3) のどれに分類するか、なんで すが、あんまり統一した基準がありません。上記特徴を見て、書きや すいところがいいのかもしれません。  たとえば、bootstraptest/test_mine.rb というファイルを作っ て、そこに assert_equal() として記述しておいてやり、make btest OPTS=--set=mine として実行するようにすれば、自分用テストがや りやすいかもしれません。  そういえば、今のバージョンって田中所有の網羅的なテストって 通ってます? -- // SASADA Koichi at atdot dot net