はじめに
今日の朝、Twitterで突然こんなリプライをもらいました。
@jnchito want to translate my slides from railsconf 2015??
— Ryan Davis (@the_zenspider) May 11, 2015
どのスライドのことだろう?と思って調べてみたら、どうもこのページで紹介されているスライドのことみたいです。
Ruby on Rails on Minitest | 2015 Railsconf | 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
最近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に上げたらテストが落ちる
- 実行順序に依存したテストがある
- そんなときはデバッグを助けてくれるgemを使おう
- https://github.com/seattlerb/minitest-bisect
- RSpecとFactoryGirlとあれやこれや使ってます
- READMEにプラグインがいっぱいあるよ
- ただしオススメは複雑なテストを作らないこと
- とにかく使ってみよう
- 気に入るかもしれないよ
- 変化には時間がかかるものだ
- Spec形式で書きたいな
- なぜ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がそのままテストコードとしてのメリットにつながるわけではない、というのが僕の感想です。
詳しくは先日書いたこちらのエントリを参照してください。
僕のMinitestとRSpecに関する考え方は国内でも国外でもほとんど見かけないので、英語に翻訳して輸出しないといけないなーと思ったりしています。
英訳は日本語訳よりもちょっとハードルが高いので時間があるときにトライしてみようと思います。
おまけ
スライドを作ったRyanさんからお礼のリプライをもらいました〜。
@jnchito DOH. I didn’t see this tweet yet. sorry! Thank you so much! I appreciate it!
— Ryan Davis (@the_zenspider) May 12, 2015
2015.06.30 追記「RSpecユーザのためのMinitestチュートリアル」という本を書きました
電子書籍「Everyday Rails - RSpecによるRailsテスト入門」の追加コンテンツとして「RSpecユーザのためのMinitestチュートリアル」を公開しました。
詳しくは以下のエントリをご覧ください。