mrubyを使っていたところ、あるmrbgemが思った通りに動かなかったとする。あなたはまず真っ先に自分のコードを疑い、次にmrbgemの挙動を疑うであろう。
しかしmrbgemにはテストが十分に書かれていないかもしれない。ので、自分でテストケースを追加して手元で走らせ、様子を見たいと思うのが人として自然な成り行きである。
ところでmrbgemのリポジトリなどを見てもどのようにビルドしテストを実行させているのかが全く不明なケースが多く、なにこれどうやるの? という疑問を当然のように持つと思うので、そのような人のためのメモがこのエントリ。
ちょっと調べると以下のようなエントリがひっかかりますが、これは2年前のもので、この通りに build_config.rb を書いて上書きして走らせてもmrbgemのテストは実行されません。注意。
mrubyのモジュールmrbgemを開発した際に簡単にTravis CIを設定する方法 - 人間とウェブの未来
どうするか
現代(2017年10月)においては mrbgem のリポジトリのクローンからテスト実行までは以下のようにします。例として mruby-foo というmrbgemをどこかからcloneしてきて、その中のテスト(おそらく test/*.rb に書いてある)を実行するものとします。
手順としてはまず対象のmrbgemのcloneから。
$ git clone https://github.com/foobar/mruby-foo.git $ cd mruby-foo
その中でさらにmrubyをcloneする(テスト実行用のmrubyバイナリをここから作る)。
$ git clone https://github.com/mruby/mruby.git $ cd mruby
そのmrubyのビルド設定において、テスト実行時に有効になる設定があるのでそこに1行を加える。
この "conf.gem '..'" によりmrubyの親ディレクトリ(つまりmruby-foo)が依存関係に含まれ、かつテストも実行されるようになる。
@@ -111,20 +111,21 @@ end MRuby::Build.new('test') do |conf| # Gets set by the VS command prompts. if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] toolchain :visualcpp else toolchain :gcc end enable_debug + conf.gem '..' conf.enable_bintest conf.enable_test conf.gembox 'default' end
あとは rake test すればよい。末尾にテスト実行結果が出てくるはず。おしまい。
>>> Test test <<< mrbtest - Embeddable Ruby Test ...................................................................................................?.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................?.......................................................................................................................................................................................... Skip: Struct.new removes existing constant redefining Struct with same name cause warnings Skip: Module#prepend super in alias super does not currently work in aliased methods Total: 982 OK: 982 KO: 0 Crash: 0 Time: 0.58 seconds ................ Total: 16 OK: 16 KO: 0 Crash: 0 Time: 0.56 seconds
余談
ところでこの mruby のテストで使える assert がわからん。以下のように書いても OK と言われてしまう。どういうこと?
assert('Must fail') do 1 == 0 end
追記(assertについて)
上述の余談の件、わかった。最近に mruby/test/assert.rb における assert の挙動が変更されていた。
github.com
ということで上記のような(falseを返したらfailすると期待しているような)テストケースは全部動かなくなっている。以下のように明示的に assert_* メソッドを書くべき。
assert('Must fail') do assert_equal 1, 0 end
これ、今までいくつかのmrbgemを見た記憶によると(特に大量にmrbgemを書いている何人かがauthorの)mrbgemのテストが軒並みぶっこわれてるんじゃないなあ。きびしい。