続・Rails 3.x 時代のテストフレームワーク
先日の記事Rails 3.x 時代のテストフレームワークで、私は「Railsのテストを取り巻く状況が複雑に拡散しつつある」と書き、デファクトスタンダードがまだ現れていないんじゃないか、ということを示唆しました。
その後、この件について他の人が書いているのを更に読んだり、実際にフレームワークを使ってみたりして、わかったことや考えたことをまとめてみようと思います。
まず、Railsで使用できる代表的な4つのテストフレームワーク Test::Unit, RSpec, Shoulda, Cucumber の基礎知識と相互関係について。
Test::Unit は、Ruby 実行系と一緒にインストールされる標準ライブラリの1つです。20世紀末に提唱されたソフトウェア開発手法エクストリーム・プログラミング(XP)が求めるテスト駆動開発をRubyで実践するために作られました。Java 用の JUnit、.Net Framework 用 の NUnit などと並んで xUnit と総称されるテストフレームワーク群の1つです。
著作権表示によれば Ruby 1.8.x にバンドルされている Test::Unit は 2000 年にリリースされ、2003 年以降は開発が止まっています。Ruby on Rails は Test::Unit を少し拡張しつつ、内部に取り込んでいます。Rails のデフォルトのテストフレームワークです。
Ruby 1.9.1 に Test::Unit の効率的な代替品である minitest が標準ライブラリとしてバンドルされ、Test::Unit は minitest をベースにして書き換えられています。また、改良版の Test::Unit 2.x が 2008 年以降活発に開発されていますが、こちらは Ruby 実行系にバンドルされていません。
RSpec は、テスト駆動開発から派生したビヘイビア駆動開発を実践するために作られた新しいフレームワークです。
2005 年 8 月に最初のプレビュー版(Ver. 0.1.0)が発表されていますが、世間の注目を集めるようになったのは、RSpec 1.0 がリリースされた 2007 年 5 月以降です(参考: Google Trends: rspec)。Rails の開発で本格的に利用され始めるのがいつなのか明確ではありませんが、2008 年 7 月に Rails のドキュメントに RSpec に関する記述が追加されています。この頃までに、Rails コミュニティでの受容がかなり進んだものと思われます。
Shoulda は、ボストンとニューヨークに拠点を持つ技術コンサルティング会社 thoughtbot, inc. が、顧客のために Web アプリケーションを作る際に開発したライブラリをオープンソースプロジェクトとして公開したものです。RSpec が Test::Unit の対抗馬として現れたのに対して、Shoulda は既存のテストフレームワークを拡張する存在です。RSpec は Test::Unit とも RSpec とも共存できます。
しかし、現実には Shoulda は RSpec のライバルです。開発者は次の 4 つの方法のどれかを選ぶことになります。
- Test::Unit を単体で使う
- Test::Unit に Shoulda を組み合わせる
- RSpec を単体で使う
- RSpec に Shoulda を組み合わせる
Rails には Test::Unit が組み込まれているので、Shoulda と RSpec のどちらか一方または両方をインストールして利用するのですが、おそらく Shoulda を使う人の多くは RSpec のどこかが気に入らないのです。RSpec と Shoulda を組み合わせるケースは少ないと思われます。
初期の Shoulda の歴史はよく分かりません。2008 年 9 月に発表された Shoulda 2.0 から Gem としてインストールできるようになりました。
Cucumber は「受け入れテスト」のためのフレームワークです。これを利用すると、人間が実際にブラウザで動作チェックを行うのと同じようなやり方で、コンピュータにアプリケーションをテストさせることができます。
Cucumber の起源は RSpec 付属の Story runner というツールですが、現在の Cucumber は RSpec プロジェクトから独立し、Java や .NET でも使える汎用ツールに発展しています。当然ながら、Test::Unit 単体で開発する場合でも、RSpec や Shoulda を組み合わせる場合でも、Cucumber は利用可能です。Cucumber プロジェクトは 2008 年 4 月に始まりました。まだまだ歴史の浅いツールと言えるでしょう。
さて、ここから 4 つのテストフレームワークを具体的に比較していきたいと思いますが、「基礎知識と相互関係」の記述が当初の予定よりも長くなってしまいましたので、稿を改めることにします。
(2010/05/06)
記事に関するご質問は、 hermes@oiax.jp までメールでお送りください。
ウェブサイト構築の発注先を検討されているお客様は、ご相談フォームをご利用ください。
- はじめに
- Rails はエンタープライズの世界で主流になるか (2008/03/29)
- Rails 2.0 ベンチマーク (2008/03/30)
- テスト駆動開発とデバッグコード (2008/04/07)
- Git or Mercurial (2008/04/22)
- RESTful Ruby on Rails -- その美しさと難しさ (2008/04/23)
- RESTful Ruby on Rails -- 単数と複数 (2008/04/24)
- Rails のソースコードを読む (2008/05/02)
- sudo: no passwd entry for app! (Capistrano 2.3.0) (2008/05/12)
- Rails on GlassFish (2008/06/18)
- 「Ruby は型宣言がないけど、ちゃんとしたシステムに使えるのか」という質問にどう答えるか (2008/11/23)
- 「Ruby はスクリプト言語だけど、遅くないですか」という質問にどう答えるか (2008/11/24)
- どのプログラミング言語が将来的に有望か (2009/01/10)
- どのフレームワークが将来的に有望か (2009/01/11)
- フレームワーク対 CMS (2009/01/12)
- Rails 2.3 で spawner/reaper は DEPRECATED に (2009/03/25)
- db/seeds.rb (2009/06/08)
- LESSとSass (2009/08/03)
- Rails 2.3.4 と I18n (2009/08/15)
- RubyGems のアップデート(上書きインストール) (2010/02/03)
- クリエイティブ・コモンズの Rails 教材 (2010/03/08)
- Yet Another Ruby Reference (2010/03/12)
- Rails で MongoDB を使ってみた (2010/03/23)
- Rails で MongoDB を使ってみた(2) (2010/03/25)
- 祝 Ruby on Rails 3.0 beta2 リリース (2010/04/02)
- Rails 3.x 時代のテストフレームワーク (2010/04/24)
- 続・Rails 3.x 時代のテストフレームワーク (2010/05/06)
- Test::Unit と RSpec と Shoulda (2010/05/06)
- Windows + Rails + MySQL 5.1 (2010/07/20)
- Ruby on Rails 2.3.9 リリース (2010/09/05)
- Railtie と Engine と Plugin の関係 (2010/10/23)
- Rails 3.0 と Internet Explorer (2010/11/19)
- acts_as_list: gem か plugin か (2010/11/29)
- さようならNetBeans/こんにちはRedcar (2011/01/28)
- RubyGems 1.5 が出たけど (2011/02/04)
- はじめる!Rails3 第2巻の執筆を始めました (2011/03/20)
- NetBeans 7.0にRuby on Railsプラグインをインストールする手順 (2011/03/21)
- Resqueを利用したRailsでの非同期処理/バッチ処理 (2011/03/23)
- Resqueワーカーをデーモンとして動かす (2011/04/02)
- はじめる!Rails3 第2巻の執筆(経過報告) (2011/04/23)
- はじめる!Rails3 第2巻の執筆(経過報告 No.2) (2011/05/11)
- Rails 3.1: assign_attributesメソッド (2011/05/14)
- Rails 3.1: has_secure_passwordメソッド (2011/05/27)
- はじめる!Rails3 第2巻の執筆(経過報告 No.3) (2011/06/06)
- Ruby on Rails 3.2 を Windows にインストールする手順をかなり丁寧に説明してみました (2011/07/22)
- Ruby on Rails 3.2 を Mac OS X にインストールする手順をかなり丁寧に説明してみました (2011/08/07)
- はじめる!Rails3 第2巻の執筆(経過報告 No.4) (2011/08/15)
- WindowsマシンにUbuntuをインストールしてRails開発を始めるには (2011/08/29)
- Rails 3.xでISO-2022-JP(JISコード)の電子メールを送る: mail-iso-2022-jp (2011/12/05)
- はじめる!Rails3 第3巻について (2011/12/30)
- NetBeans 7.1にRuby on Railsプラグインをインストールする手順 (2012/01/26)
- はじめる!Rails3 第3巻について(経過報告) (2012/02/29)
- はじめる!Rails3 第3巻について(経過報告2) (2012/03/17)
- Ruby on Railsで複合キーを扱う(1) (2012/03/25)
- Ruby on Railsで複合キーを扱う(2) (2012/03/26)
- Ruby on Railsで複合キーを扱う(3) (2012/03/27)
- Ruby on Railsで複合キーを扱う(4) (2012/03/28)
- Ruby on Railsで複合キーを扱う(5) (2012/03/29)
- Ruby on Railsで複合キーを扱う(6) -- 最終回 (2012/03/31)
- Ruby on Railsで複合キーを扱う(7) -- 補遺 (2012/04/01)
- Ruby on Rails 3.2 を Ubuntu にインストールする手順をかなり丁寧に説明してみました (2012/04/22)
- Ruby on Rails 3.2 を Cygwin にインストールする手順をかなり丁寧に説明してみました (2012/05/05)
- Ruby/Railsを学習・開発する環境としてのCygwin (2012/05/06)
- UbuntuにNetBeans IDE 7.1をインストールする手順 (2012/06/08)
- UbuntuにNetBeans IDE 7.2をインストールする手順 (2012/08/22)
- NetBeans 7.2にRuby on Railsプラグインをインストールする手順 (2012/08/31)
- RSpecとCapybaraでJavaScript/Ajaxをテストする (2012/10/01)
- Passenger 向けに AppArmor を設定する (2013/01/06)
- Railsセキュリティアップデートへの対処法 (2013/01/30)
- NetBeans 7.3にRuby on Railsプラグインをインストールする手順 (2013/05/02)

