たごもりすメモ

コードとかその他の話とか。

mrbgemをビルドしてテストを手元で走らせる(2017年版)

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のテストが軒並みぶっこわれてるんじゃないなあ。きびしい。