give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

「Ruby on Rails on Minitest」を翻訳してみた

はじめに

今日の朝、Twitterで突然こんなリプライをもらいました。


どのスライドのことだろう?と思って調べてみたら、どうもこのページで紹介されているスライドのことみたいです。

Ruby on Rails on Minitest | zenspider.com by ryan davis


発表の動画もYouTubeにありました。


RailsConf 2015 - Ruby on Rails on Minitest - YouTube


スライドはPDFで提供されていて、全部で254ページあります。

http://www.zenspider.com/pdf/2015_railsconf_ruby_on_rails_on_minitest.pdf

f:id:JunichiIto:20150512104444p:plain


最近MinitestとRSpecの比較記事をよく書いていたのでちょっと面白そうだなと思いましたが、さすがにこれを全部きれいに翻訳するのはしんどいです。
なので、ざっくりと要点だけを翻訳してみました。

「Ruby on Rails on Minitest」のざっくり翻訳

各スライドの要点を箇条書きにしていきました。
なお、コード例の部分はスライドを見れば明らかだと思うので翻訳していません。

  • Minitestって何?(3-6)
    • Ruby 1.8時代のtest/unitを置き換えたテスティングフレームワーク
    • 最初はたった90行しかなかった
    • gemとしても提供されているし、Ruby 1.9.1以降では標準で組みこまれている
    • 小さくてクリーンで速いことを目標にしている
    • 現在では多くても1600行ぐらい(訳注:各ライブラリごとに?)
  • minitest/testの紹介(7-27)
    • コード例
  • minitest/specの紹介(28-41)
    • コード例
  • 高度な機能の紹介(42-46)
    • ランダム実行してくれる
    • 並列実行もしてくれる
    • テストの信頼性が向上する
  • MinitestはJust Rubyである(47-55)
    • 何をやっているのかはコードを見れば明らか
    • マジックは全く使っていない
  • RailsとMinitestの関係(56-76)
    • Rails開発チームはMinitestを使っている
    • RailsとMinitestの組み合わせはバージョンアップしても問題なく動く
    • ただしRails 4.2になるとテストがランダム実行するのちょっと影響があるかも(でも良い影響だ)
    • Railsは今後もMinitestを使っていくだろう
  • ActiveSupport::TestCase(76-84)
    • トランザクション管理をしてくれる
    • Fixturesが使える
    • setup do / test do が使える
    • アサーションが追加されている
    • コード例
  • ActionController::TestCase(85-90)
    • ActionやStateを扱える
    • 追加のアサーションがある
    • コード例
  • ActiveDispatch::IntegrationTest(91-95)
    • 追加されたアサーションは大量
    • コード例
    • 詳しくはRails guidesを参照
  • ここまでのまとめ(96-101)
    • とてもシンプル
    • とてもパワフル
    • 使ってみよう
    • テストしやすくなるよ
  • よくあるトラブルシューティング(102-126)
    • Spec形式で書きたいな
      • minitest-spec-railsを使おう
      • コード例
    • Rails4.2に上げたらテストが落ちる
    • RSpecとFactoryGirlとあれやこれや使ってます
      • READMEにプラグインがいっぱいあるよ
      • ただしオススメは複雑なテストを作らないこと
    • とにかく使ってみよう
    • 気に入るかもしれないよ
    • 変化には時間がかかるものだ
  • なぜMinitestを使うのか?(127-139)
    • 「なぜテストするんだ?」という言葉は「作業が遅れるじゃないか」と同じ意味になっている
    • あなたを困らせるつもりはない
    • むしろお手伝いをしたいんだ
    • 「みんなRSpecを使ってる(あなた)」
    • そんなことはない
    • Rails開発チームもDHHもtenderloveもみんな使ってる
  • RSpecとの機能的な違い(140-180)
    • RSpec独自の機能一覧
    • Minitest独自の機能一覧
    • Myron Marston氏による比較(翻訳記事
    • RSpecの素晴らしい点は全て第一級クラスになっているところだ(Myron)
    • それがすべての元凶だ(私)
    • どっちの意見も正しい
    • MinitestはJust Rubyだ
    • RSpecは車輪の再発明をしている
    • RSpecは独自のオブジェクトモデルを使っている
    • Rubyの初学者にとっては混乱の元になる
    • RSpecは何をやっているのかわからない
    • RSpecがやっていることはマジックだ
    • 「学習コストが高いと考えている人もいる(Myron)」「そのとおり(私)」
    • MinitestとRSpecのコード量の比較
    • わかりやすさの違いだけではない
  • パフォーマンスの比較(180-198)
    • RSpecの抽象化や車輪の再発明にはどれくらいのコストがかかっているのか?
    • グラフで見るパフォーマンス比較
    • 「RSpecは十分速いと思うよ(あなた)」
    • いや、ちりも積もれば山となる
    • デバッグやリファクタリングでテストを回すたびに直線的にパフォーマンスの差が広がっていく
    • パフォーマンスを上げたいならテストケースを減らすのではなくMinitestに乗り換えよう
    • もしくはリファクタリングを全くしないことだ(つまりテストを再実行しないことだ)
  • まとめ(234-254)
    • 何を使ってもいいよ
    • 自分に一番合ったツールを使えばいい
    • でもMinitestの技術的なメリットはたくさん伝えた
    • 自分にとって一番良いと思うツールを選ぼう
    • 人気があるからという理由だけで選ばないで
    • 「でもMinitestに関する記事は少ないよ?誰も使ってないの?(あなた)」
    • いや、記事が少ないのはMinitestは理解しやすいからだ
    • Minitestのユーザーはいないわけじゃない
    • 自分の仕事に集中できてるんだ
    • 使ってみよう
    • 気に入るかもしれないよ
    • とにかく、MinitestはJust Rubyだ
    • おしまい

まとめ

MinitestがJust Rubyだ、というのはよく聞く議論ですね。
ただし、実際にMinitestでテストコードを書いてみるとJust Rubyがそのままテストコードとしてのメリットにつながるわけではない、というのが僕の感想です。
詳しくは先日書いたこちらのエントリを参照してください。

blog.jnito.com


僕のMinitestとRSpecに関する考え方は国内でも国外でもほとんど見かけないので、英語に翻訳して輸出しないといけないなーと思ったりしています。
英訳は日本語訳よりもちょっとハードルが高いので時間があるときにトライしてみようと思います。

おまけ

スライドを作ったRyanさんからお礼のリプライをもらいました〜。


2015.06.30 追記「RSpecユーザのためのMinitestチュートリアル」という本を書きました

電子書籍「Everyday Rails - RSpecによるRailsテスト入門」の追加コンテンツとして「RSpecユーザのためのMinitestチュートリアル」を公開しました。
詳しくは以下のエントリをご覧ください。

blog.jnito.com