pockestrap

Programmer's memo

ruby-signatureにテストファイルのジェネレータを追加した

ruby-signatureとは

github.com

Ruby 3に向けて、Rubyの型定義ファイル周りを提供するプロジェクトです。

https://speakerdeck.com/soutaro/ruby-hack-challenge-holiday-number-8 このスライドも参考になるでしょう。

この記事では組み込みライブラリの型定義にフォーカスして説明します。

ruby-signatureでは組み込みライブラリの型定義を提供しています。 ですが、まだまだ型が間違っていることもあり、無限のPRチャンスが広がっています。

また、組み込みライブラリの型定義をテストする仕組みもあるのですが、肝心のテストはほとんど書かれていません。 2019/11/14現在で組み込みライブラリの型定義は56ファイルありますが、そのテストは13ファイルしかありません。

$ ls stdlib/builtin/ | wc -l 
56

$ ls test/stdlib/ | wc -l 
13

テストファイルのジェネレータ

今回は、このPRでこの足りないテストファイルのジェネレータを追加しました。

github.com

たとえばまだ存在しないRubyVMモジュールへのテストファイルを追加するには以下のようなrake taskを実行します。

$ bundle exec rake 'generate:stdlib_test[RubyVM]'
Created: test/stdlib/RubyVM_test.rb

するとメッセージにもあるとおり、test/stdlib下にRubyVM_test.rbが生成されます。

class RubyVMTest < StdlibTest
  target RubyVM
  using hook.refinement

  # def test_method_name
  #   # Call the method
  #   method_name(arg)
  #   method_name(arg, arg2)
  # end
end

このファイル内で、RubyVMモジュールの各メソッドを呼び出すようなテストを書きます。

余談ですが、ジェネレータとしてPRをせずに、足りないテストファイルを全部生成したPRを送るのもありかなと当初思っていました。 ですが、空のテストファイルだけが置かれているよりはテストファイルがそもそも存在しないほうが、テストが書かれていない現状がより伝わりやすいし、どのモジュールにテストが書かれていないのか明確で良いかなと思ったのでこうしています。

テストの書き方

github.com

だいたい上のドキュメントに書かれています。 簡単に言えば、型定義を行ったメソッドを単にテストメソッド内で呼び出せば、refinementsを使って引数と戻り値の型チェックを勝手にやってくれるようになっています。


というわけで、Ruby 3にむけてruby-signatureにPRを送ってみてはいかがでしょうか。

追記

adventar.org

ruby-signatureのAdvent Calendarもあるので、ruby-signatureにPRを送ったらこちらにも参加してみてはいかがでしょうか。