RubymineでRailsのテストをデバッグする

RailsやRubyでの開発で、vimからRubymineに切り替えて数ヶ月が経ちました。エディタのサポート機能では正直「それvimでもできるよ」ということが多いのですが、さすがにRubymineはIDEということもあり、デバッガについてはvimよりも手軽に、かつ使いやすい仕上がりになっています。本記事ではRubymineを使ってRailsのテストをデバッグする場合の基本的な使い方についてまとめてみます。

# ブレークポイントを使ったデバッグ

IDEを使わない場合、Railsでのデバッグはpryやデバッグログを見るということが中心になっているかと思いますが、IDEを利用する開発では「デバッガでブレークポイントを設定して見たい箇所で止める」というのが基本的なフローでは無いかなと思います。Rubymineでも、ブレークポイントを使ってIDE上でより簡単にデバッグが可能です。

今回は簡単なデモ用にRailsを使って新規プロジェクトを作りました。このプロジェクトではminitest-railsを使い、Bookというモデルを作成してあります。このminitest-railsが自動的に作ったテストを使って説明をしていきます。

## gemの追加

`rails new` でプロジェクトを作成したら、Rubymineでデバッガを動作させるのに必要なgemをGemfileに追記して、`bundle install`を走らせます。

```rb
  gem 'ruby-debug-ide'
  gem 'debase'
```

今回は`minitest-rails`を使っているので、そちらもGemfileに追記し、`rails g minitest:install`を実行してminitestを利用可能にしておきましょう。

## デバッガ設定の選択

ここからデバッガの設定になります。まずはデバッガを走らせるための設定をします。メニューから `Debug...` を選択します。

![01_debugger_menu.png](https://qiita-image-store.s3.amazonaws.com/0/5974/d3d47a90-5793-cd64-d156-76d956d76b4d.png)

すると、以下のようなポップアップメニューがでてきます

![02_choose_debugger_setting.png](https://qiita-image-store.s3.amazonaws.com/0/5974/0c7f738c-6a9b-8767-d498-f840453e6237.png)

RubymineはRailsプロジェクトの場合、自動的にtestとspec用の設定が行われていますので、`test: `で始まるタスクを選択します。これでデバッガ設定は完了で、以後は `Debug...` ではなく、`Debug`をメニューバーから選択することで実行が可能です。なお、このコマンドにはデフォルトで `Control + D` がショートカットキーとして割り当てられていますので、活用しましょう。

## テストの実行とブレークポイントによる中断

今回はデバッガの使い方に関するデモが目的なので、`rails g model Book title:string` して出来ただけのシンプルなモデルのテストを使います。無意味にlistという配列を定義していますが、これについてはデバッガ実行中の画面で説明します。

![03_test.png](https://qiita-image-store.s3.amazonaws.com/0/5974/2fda6ce3-6c5f-570e-534f-db0a9a8aabb3.png)

上のスクリーンショットで13行目の行番号右側に赤い丸がついていますが、これがブレークポイントです。行番号の右側をマウスでクリックすることでブレークポイントをつけることができます。テストを実行してここを通ると、自動で実行が中断され、その時点でのプログラムに関する情報を見ることができます。

## デバッガの実行

ここで`Debug`コマンドを走らせます。すると、Rubymineの画面下部にデバッグウィンドウが表示されます。

![05_stop_at_breakpoint.png](https://qiita-image-store.s3.amazonaws.com/0/5974/0cc6802d-44aa-ab6b-cec1-48498a81670e.png)

デバッグウィンドウには４つのタブがあります。上記スクリーンショットで表示されているDebuggerタブには、左から順にスタックフレーム、停止されたスコープで参照できる変数、ウォッチ式の３つが表示されています。また、このデバッガ実行時にコードを見てみると、list変数の右側に実行時の値が自動的に表示されているのが分かります。単純にインスタンス変数等の中身を確認したいだけであれば、この画面だけでも十分かもしれません。オブジェクトの中身を見たい場合はデバッグウィンドウのVariablesを利用しましょう。


## Watch式

複数の変数の値を同時に見たい場合は、Watch式を入力しておくと便利です。Watch式はDebuggerタブで一番右にあるエリアで、ここに入力した式はプログラムの実行停止時に自動的に評価されて値が表示されます。

![07_watches.png](https://qiita-image-store.s3.amazonaws.com/0/5974/c1036400-6445-1e98-9729-13bb8ea4a01c.png)

Watch式の入力中には補完も効きます。typo等で存在しないメソッドをwatchするということを避けられていいですね。

![08_completion_for_watch_statement.png](https://qiita-image-store.s3.amazonaws.com/0/5974/138f873b-a58a-f6f3-5161-e6d2ba19f58a.png)

## Interactive console

Rubymineでも、`pry`のように停止した箇所でコードを実行することができます。デバッグウィンドウで Interactive consoleタブを選択すると、コンソールが開くので、そこで必要なコマンドを実行しましょう。ただし、日本語の入力や表示は文字が長くなるとうまく動かないケースがあるようです。

![06_interactive_console.png](https://qiita-image-store.s3.amazonaws.com/0/5974/757ce18f-f928-e722-956b-ecd80e50495f.png)

## テスト実行ログの確認

`log/test.log` にはテスト実行時のログが記載されます。普段はそれほど見ないファイルではないかと思いますが、デバッグに手間取った際にデバッグメッセージを仕込んでそれを確認したい場合や、ActiveRecordが投げたSQLの確認に利用すると便利です。テスト実行ログはデバッグウィンドウの Test Logタブで確認できます。

![10_test_unit_log.png](https://qiita-image-store.s3.amazonaws.com/0/5974/81cf6b3d-91ee-f659-6bd7-e0312e2f5d48.png)


## その他の機能

他にもRubymineにはステップ実行や、ブレークポイントではなく、指定した例外が発生したときに停止する機能などもあります。

また、今回はテストのデバッグを取り上げましたが、[RubyMineでPowを使いながらDebugする方法](http://qiita.com/spring_aki/items/8319af8ec12b444f167b)もあります。複数プロジェクトの開発を同じMac上で行おうとする場合、Powを使うと管理がしやすいため、Powと組み合わせて使えるのは大きなメリットですね。