Rails テストに関する便利だけど見過ごされがちな 2 つの rake タスク

Rails テストで便利であるにもかかわらず知名度の低い、かわいそうな 2 つのタスク:

  • rake test:recent タスク
  • rake test:uncommitted タスク

を紹介します。この記事は執筆時点の Rails 3.1.0.rc5 を対象としています。

Rails 謹製のテストタスク: rake test:*

RSpec 使っていますか?

もはや「デファクトスタンダードとなりつつある *1RSpec ですが、残念なことに私は使っていません。でも。そんな Test::Unit 遣いのために、Rails は便利な rake タスクを用意しています。たとえば、

  • rake test
  • rake test:units
  • rake test:functionals
  • rake test:integration

の各タスクは RailsによるアジャイルWebアプリケーション開発 第3版 でも紹介されているくらい有名です。しかし,これ以外のタスクも日の当たらないところで、活躍する日々を待ち続けています。

rails new で作成したアプリケーションで rake -T test: してみると,

$ rake -T test:
rake test:recent       # Run tests for {:recent=>"test:prepare"} / Test recent changes
rake test:single       # Run tests for {:single=>"test:prepare"}
rake test:uncommitted  # Run tests for {:uncommitted=>"test:prepare"} / Test changes since last c...

と、test:recent、test:single、test:uncommitted の 3 つのタスクを確認できます。今回は、このうち、「便利なのに見過されがちな」 test:recent と test:uncommited を紹介します。

rake test:recent

rake test:recent タスクは、10 分以内に変更されたモデルとコントローラを探して、それらに関連した unit テストや functional テストを実行する rake タスクです。たった今修正したところだけテストしたいんだけど、というときに便利です。

edgeguides では、

rake test:recent Tests recent changes

Testing Rails Applications — Ruby on Rails Guides

としか説明されていないのですが、rails/testing.rake at master · rails/rails · GitHub を追いかけると、ちゃんと 10 分以内の変更が対象だと分かります。

rake test:uncommitted

rake test:uncommitted タスクは、(Subversion か Git を使っている場合に限り)最後のコミットからモデルとコントローラを探し、それらに関連した unit テストや functional テストを実行する rake タスクです。これも、今修正したところだけテストしたいんだけど、というときに便利です。

おわりに

Google 先生に聞いてみても、今回の 2 つのタスクをまとめて取り上げた日本語ブログ記事が見つからなかったので紹介してみました。元ネタは Rails Test Prescriptions (Pragmatic Programmers) の 37 ページあたりです。この本は,Rails 入門者がAgile Web Development with Rails 3.2 (Pragmatic Programmers) の次に読む本としてお勧めです。日本語版が出ればもっといいんですけどね。

実を言うと、test:recent と test:uncommitted を知らなかった頃は、テストケースを一つ一つ実行したり、test:units の実行に数十秒待たされたりしていました。この 2 つの rake タスクで快適な Test::Unit 生活を送りましょう。

*1:Rails3レシピブック 190の技 の第 8 章の扉に書いてあった文章より