前回はRailsで使われるテストフレームワークをご紹介しました。});インテグレーションテストのために「Cucumber」を利用する前回は、Railsで使われるテストフレームワークをご紹介しました。今回から、いよいよ実際のテストを書きます。書くだけでは物足りないので、前々回の連載で指摘したコードレビューの結果から、リファクタリングの候補をリストアップし、テストを書きながら1つ1つつぶしていきましょう。bitlyの設定はサーバの立ち上げ時にするべき重複したコード本来モデルにあるべきロジックがコントローラにある不必要な構文「then」などまずは1の、「bitlyの設定」のロジックを変更したいと思います。conf["apikey"])ただ、普通にリファクタリングによってコードを変更しても、ちゃんと機能するかどうかが不安なので、先にインテグレーションテストを設定しましょう。ここではRails開発者の間で人気の高いCucumber(キューカンバー)を利用します。Cucumberの設定はcucumber-railsを使うと簡単にできるようです。Gemfileに以下を追加します。install」としてgemをインストールした後に、以下のようにrspecとcucumberをそれぞれインストールします。--capybaraその後にgeneratorを使うと、以下のような「feature」の雛形が作られます。"Create"では、実際のfeatureを書いてみましょう。featureというのは機能のことで、どういう機能があって、誰が何ができるかを自然言語(ここでは英語ですが、日本語も使えます)で記述します。最初に、ログイン状態であればitemが追加登録できるというfeatureの記述例です。item"この状態でcucumberを走らせると、以下のステップを作る必要があると警告がでてきます。hadend逆に言うとそれ以外のステップはすでに存在するということです。cucumber:install」としたときに、以下のファイルが作られています。features/step_definitions/web_steps.rbfeatures/support/env.rbfeatures/support/paths.rblib/tasks/cucumber.rakescript/cucumberその中の「web_steps.rb」ファイルを覗いてみると以下のようなステップが作られています。endendでは、未定義のステップをfeatures/step_definitions.rbに追加します。ユーザーがログインするフローを記述します。in"}endログインの詳細は今回のfeatureではあまり重要視していない部分なので、ここでは1つのステップにまとめてみました。これで以下のように、ちゃんとfeatureがパスするはずです。passed)0m15.348s実は今回のコミットではfeatures/support/env.rbに以下のような設定も付け加えておきました。:seleniumCucumberは、通常はWebratというブラウザの動きをシミュレートするライブラリを使います。シミュレータではJavaScriptの動作などをテストすることができません。そこでCapybaraというライブラリを使います。Capybaraを使うと、実際にブラウザを立ち上げて自動テストするためのさまざまなツールと簡単に統合することができます。ここではSeleniumというツールを使っています。することで「@javascript」が付いたfeatureを、実際にブラウザ上でテストすることができるようになります。今回はブラウザとしてFirefoxを使っていますが、他のブラウザに切り替えることでクロスブラウザテストが可能です。実際のブラウザを使った自動テストはシミュレート版より遅いので、必要なテストにだけ使ったほうが良いですが、実際にコードを書かないステークホルダー(実際にシステムを使うエンドユーザーやプロジェクトに出資しているビジネスオーナーなど)や、プロダクトオーナーに自動化テストの威力をデモしたいときには、Sleniumのようにブラウザで自動で動くものを見せると結構インパクトがあるのでお勧めです。「グリーン、レッド、グリーン、リファクター」のリズムで通常のテスト駆動開発では「レッド、グリーン、リファクター」のリズムで行うのが良いと言われます。レッドはテストケースが失敗していることを示し、グリーンはテストがパスしたことを示します。テスト駆動開発では、最初にテストを書き、このテストが失敗するのを確認します(レッド)。次に、このテストをパスさせるための最低限のコードを書きます(グリーン)。最後に、書かれたコードをリファクタリングすることで「機能追加」と「コードをきれいにする作業」を、順を追って行います。既存のコードに後からテストを追加する場合、この手法は一見使えないように思えますが、何とかするやり方はあります。先ほどのテストがグリーンなのを確認した後、リファクタリングする予定の箇所を一度削除してみましょう。conf["apikey"])その状態でテストを走らせると、もちろんレッド(失敗)になりますよね。passed)その状態で、今度はbitlyの設定をconfig.rbに移行します。conf["apikey"])config.rbの中ではItemsControllerのクラス変数(@@bitly)は設定できないので、コンスタント(BITLY)に変えてみました。この状態でもう一度テストを走らせてみましょう。passed)ちゃんとグリーンがでましたね。このように「グリーン、レッド、グリーン、リファクター」の手順を踏むことで、現在変更している箇所をカバーするテストがあるのをちゃんと確認しながらリファクターをすることができました。次回はコントローラのテストに移っていきます。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。