Ruby on Railsのテストをデバッグする

Ruby on Railsは、テスト駆動開発をサポートしている。

これ自体は便利ではある。しかし、テストで不合格になった場合には、どうやってデバッグするのか?

 

pメソッドなんかを駆使して何度もテストを実行するという方法は、お手軽だが生産的ではない。

やはりデバッガで起動して問題がどこにあるのかを細かく解析できたほうが生産的だろう。

 

ということで、今回は、Ruby on Railsのテストをデバッグする方法について紹介する。

まずは環境の確認

今回の記事を執筆している私の環境は次の通り。

もしも環境が違う場合には、期待通りに動作しない可能性があるためご注意を。

前準備

まずは、説明のための前準備として、サンプルのrailsプロジェクトを作成しておこう。

DebugSampleプロジェクトと、SampleModelを作成する。

rails new DebugSample
cd DebugSample
rails generate scaffold SampleModel comment:string

 

次に、テスト用のテストデータベースを準備する。

rake db:migrate
rake db:test:load

 

これで、テストを実行することができるようになった。

nagahoge@NAGA /k/home/aptanaws/StudyRuby/rails/DebugSample
$ ruby -Itest test/functional/sample_models_controller_test.rb
Run options:

# Running tests:

…….

Finished tests in 1.570000s, 4.4586 tests/s, 6.3694 assertions/s.

7 tests, 10 assertions, 0 failures, 0 errors, 0 skips

そのままではtest/unit/sample_model_test.rbにはテストの記述が無いため、今回はtest/functional/sample_model_controller_test.rbを使う。

デバッガライブラリdebuggerをインストールする

Ruby on Railsのデバッグには、debuggerというライブラリを使用する。(rails専用というわけではなく、rubyで動作するデバッガ。)

gem install debugger

このdebuggerライブラリは、ruby-debugの派生ライブラリだ。

ruby-debugライブラリがruby1.8上で動作するのに対して、debuggerライブラリはruby1.9上で動作する。

ググると、railsのデバッグはruby-debugでやるといいよといった情報が結構得られるが、ruby1.9を使用しているのであれば、debuggerでないといけない。

 

rubyの標準添付ライブラリにdebugライブラリがあるが、こちらを使用すると意図した動作にならないという理由で、debuggerライブラリを使用する。

テストをデバッグする

さて、debuggerライブラリをインストールしたら、先ほど作成したサンプルプロジェクト(DebugSample)に話をもどす。

test/functional/sample_models_controller_test.rbの内容は、次のようになっていると思う。

これを、9行目の

部分でブレークしたいとする。

 

その場合、ブレークしたいポイントに、debuggerメソッドを記述する。

 

この状態で、debuggerライブラリをインクルードしてテストを実行する。

nagahoge@NAGA /k/home/aptanaws/StudyRuby/rails/DebugSample
$ ruby -rdebugger -Itest test/functional/sample_models_controller_test.rb
Run options:

# Running tests:

…test/functional/sample_models_controller_test.rb:10
get :index
(rdb:1)

 

すると、debuggerメソッドを記述した次の行で処理がブレークされる。

あとは、down, step, up, where, breakをはじめとした、デバッガ用のメソッドを駆使してデバッグすればよい。
(デバッガ用メソッドはhelpコマンドで確認可能)

&nsap;

(rdb:1) p assigns(:sample_models)
[#<SampleModel id: 298486374, comment: “MyString”, created_at: “2012-08-25 11:38
:11”, updated_at: “2012-08-25 11:38:11”>, #<SampleModel id: 980190962, comment:
“MyString”, created_at: “2012-08-25 11:38:11”, updated_at: “2012-08-25 11:38:11”
>]

あとがき

本当は、Aptana Studio等の、IDE上でデバッガが動作すればよかったのですが、残念ながら、Rubyデバッグ環境最速構築&デバッグ方法解説で紹介した方法では、ブロックの中身をデバッグすることができませんでした。
(そしてrubyのテストは、testメソッドにブロックを渡して定義します。)

そのための苦肉の策というか、しょうがないのでdebuggerライブラリを使用して、CUI上からデバッグするという方法を採っています。

 

IDE上でデバッグする方法を知っている方いたら、この場で言うのもなんですけど、教えてもらえるとありがたいです。
▄█▀█●ペコリン

コメントを残す

トラックバック: http://pgnote.net/wp-trackback.php?p=528