テストを中心にした Rails 開発
執筆: Brian Leonard、管理: Beth Stearns
2007 年 12 月 [リビジョン番号: V6.0--1]
この記事では、Ruby および Rails のコードをテストする際に役立つ NetBeans IDE の機能について説明します。使用可能なテストのオプションはいくつかあり、アプリケーションの単体テストが簡単になります。
この記事には、Ruby テクノロジでのプログラミングの基礎知識が必要です。
目次
この記事を使用するには、次のソフトウェアが必要です。
NetBeans IDE による Ruby のテストのサポート
NetBeans IDE は、Ruby のテストフレームワークとテスト機能をいくつかサポートします。サポートされている内容と、これらのテスト機能の使用方法について説明します。また、エラーの追跡や、ソースコードとテストケース間の移動を簡単にする NetBeans の優れた機能もいくつか示します。
Ruby に関連するテスト機能を取り上げる前に、単体テストとその基本的な概念について簡単に説明します。単体テストとは、アプリケーションのソースコードの各ユニットが適切に動作することを検証するために開発者が行うテストを意味します。ユニットは、テスト可能なアプリケーションの最小部分として定義されています。そのため、オブジェクト指向プログラミングでは、ユニットはクラスであり、また基底クラス、スーパークラス、抽象クラス、または派生クラス (子クラス) であることもあります。一方、手続き型のプログラミングでは、ユニットは通常、個々のプログラム、機能、または手続きです。モジュールは、アプリケーションのより大きな部品であり、通常は複数のユニットから構成されるため、ユニットとモジュールを混同しないように注意してください。
単体テストでは通常、それぞれが独立した一連のテストケースが必要です。特に、実際のオブジェクトを使用することが難しかったり、時間がかかったり、生成が困難であったりする場合、テストケースでは、テストに役立つモックオブジェクトが使用されることがあります。モックオブジェクトは、実際のオブジェクトの動作を制御された方法で再現するので、別のオブジェクトの動作をテストするために使用されます。モックオブジェクトのよい例としては、車の衝突テストで実際の人間の代わりに使われるダミーが挙げられます。
テストハーネス、つまり自動テストのフレームワークも、単体テストでは重要です。テストハーネスは、ソフトウェアコードの集まりで、プログラムユニットを動かすデータをさまざまな条件下でテストし、その間にユニットの動作と出力を監視します。テストハーネスは繰り返し使用できるため、単体テストを自動化します。
Test::Unit でのテスト
Ruby には、Test::Unit として指定される、組み込み型のテスト用フレームワークがあります。NetBeans IDE は Test::Unit を直接サポートするため、プロジェクトの「新規」メニューからすぐに新規の単体テストを作成できます。「プロジェクト」ウィンドウで Ruby プロジェクトを右クリックし、「新規」>「Ruby 単体テスト」を選択します。
「新規 Ruby 単体テスト」ダイアログで、テスト実行対象のクラス、テストファイル名、そのモジュール、プロジェクト内で対象が存在するディレクトリの場所など、単体テストのファイルに関する情報を入力するように求められます。「完了」をクリックするとスケルトンの単体テストファイルが作成されるので、ここに具体的なテストコードを追加します。このファイルは、プロジェクト内の指定したフォルダ場所に格納されます。
クリックして拡大
単体テストをテストまたは実行する方法は、複数あります。多くの場合、「エディタ」ウィンドウのコンテキストメニューから「ファイルを実行」または「ファイルをテスト」オプションを使用します。「プロジェクト」ウィンドウのファイルで、「実行」>「ファイルを実行」を呼び出すこともできます。
「ファイルをテスト」と「ファイルを実行」オプションの使用
「エディタ」のコンテキストメニューと「実行」メニューで使用できる「ファイルをテスト」 (Ctrl+F6) オプションは、テストファイルを実行する場合に適しています。「ファイルをテスト」は、テストファイル自体から実行することも、テスト対象のクラスから実行することもできます。「ファイルを実行」オプションは、同様に「エディタ」のコンテキストメニューと「実行」メニューの両方から使用できますが、テスト対象のクラスのテストファイル内にいる必要があります。「ファイルをテスト」オプションの利点は、テスト対象のファイル内にいても構いませんが、そのクラスのテストファイル内にいる必要がないことです。
「ファイルをテスト」オプションを使用する利点を説明するために、Rails のコントローラ用の単体テストを行なっていると仮定します。コントローラのテストファイル内にいる場合、「ファイルをテスト」オプションを実行すると、テストとしてこの同じテストファイルが実行されます。一方、コントローラのクラス自体を同じくらい簡単に編集できます。コントローラのクラスを編集中にそれをテストする場合、Ctrl+F6 キーを押して「ファイルをテスト」を実行するだけで、現在いるクラスに対応するテストファイルが実行されます。代わりに、コントローラのクラスで「ファイルを実行」オプションを使用する場合、コントローラの URL がブラウザで表示されます。そのため、アプリケーションの一部分をブラウザで実行する場合に「ファイルを実行」オプションを使用し、アプリケーションのその部分に対応するテストを実行する場合に「ファイルをテスト」オプションを使用するようにしてください。
このほかにも「ファイルをテスト」と「ファイルを実行」のオプションには重要な違いがあります。「ファイルをテスト」オプションをテストファイルに適用した場合、ファイルをテストとして実行します。ファイルをテストとして実行すると、IDE は実行コードをテストとして扱い、出力にエラーがないかを確認します。現在、エラーが見つかると、IDE は自動テストの赤いメッセージと同じように、「エディタ」ウィンドウのフッターに赤字の警告を作成します。
「プロジェクトを実行」と「プロジェクトをテスト」の違いも同様です。プロジェクトのコンテキストメニューでは「テスト」と表示される「プロジェクトをテスト」オプションは、そのプロジェクトのすべてのテストを実行します。現在、プロジェクトの全テストの実行は、Rails プロジェクト対してのみ機能します。プロジェクトの「実行」オプションは、実際にはブラウザでプロジェクトを実行します。
一番下にある「出力」ウィンドウには、単体テストの実行で生成された出力が表示されます。テストの出力はハイパーリンクされているので、「ナビゲート」>「次のエラー」メニューオプションを使用して移動できます。
「エディタ」ウィンドウのコンテキストメニューで使用できる「テストへ移動」アクションのオプションを使用すると、クラスとその対応するテストケース間をすばやく移動できます。「エディタ」ウィンドウでソースファイル内の任意の場所を右クリックし、「ナビゲート」>「テストへ移動」オプションを選択します (Windows の場合 Control+Shift+T、MacIntosh の場合 Command+Shift+T)。「テストへ移動」アクションは Test::Unit の表記規則を認識します。また Rails の表記規則、RSpec の表記規則、および ZenTest の表記規則も認識します。
クリックして拡大
自動テスト
Ruby プロジェクトには、「自動テスト」オプションを含めることもできます。自動テストは、ファイルが変更されると、自動的に単体テストを実行します。Rails プロジェクトやその他多くの場合、自動テストは実行する必要のある単体テストを判別できます。自動テストがこの判別を行うことができない場合は、すべての単体テストをデフォルトで実行します。
「自動テスト」オプションは、ZenTest の Ruby Gem をインストールすると利用可能になります。「ツール」メニューの「Ruby Gems」オプションを使用して、ZenTest やその他の Ruby Gem をインストールします。このオプションを選択した場合、IDE はインストール済みの Ruby Gem を読み込み、利用可能な Gem と新しい Gem をすべて表示します。「インストール済み」タブをクリックすると、すでにインストールした Ruby Gem が表示されます。
クリックして拡大
ZenTest がインストールされていない場合、「新しい Gem」タブをクリックし、一覧で「zentest」を探して選択し、「インストール」をクリックします。
クリックして拡大
ZenTest とその関連ライブラリ、およびツールがインストールされていることを示すメッセージが表示されます。
ZenTest がインストールされると、プロジェクトのコンテキストメニューに「自動テスト」オプションが表示されるはずです。「プロジェクト」ウィンドウで Ruby プロジェクトのノードを右クリックし、「自動テスト」を選択すると、プロジェクトで「自動テスト」が起動します。前に説明したように、ファイルが変更されると、自動テストは適切な単体テストまたはすべての単体テストのいずれかを実行します。
自動テストの出力が「出力」ウィンドウに表示されます。エラーが発生すると、自動テストでは「エディタ」ウィンドウのフッターに概要メッセージが表示されます。「出力」ウィンドウの「自動テスト」区画が非表示であっても、「自動テスト」タブをクリックして出力の詳細を調べ、エラーの原因を判別できます。「自動テスト」の出力のハイパーリンクをクリックして、エラーが発生したテストケースに直接移動することもできます。
クリックして拡大
「テストへ移動」(Ctrl+Shift+T) アクションのショートカットは自動テストのコンテキストでも機能するので、該当するテストファイルに直接移動できます。
注: 自動テストのサポートは、近い将来機能が改善される予定です。改善点には、テストのエラーをタスクリストに表示する機能が含まれる可能性があります。JRuby による自動テストのサポートも改善される予定です。JRuby 上で自動テストを正常に実行する際に問題が発生する場合、当面はネイティブの Ruby に切り替えてください。
Rspec によるテスト
rspec Ruby Gem は、単体テスト用のもう 1 つのツールです。これは JRuby ディストリビューションの一部として NetBeans IDE にバンドルされているので、バンドル版の Ruby インタプリタを使用する場合、rspec はすでにインストールされています。rspec をインストールすると、プロジェクトには仕様ファイルを格納する spec ディレクトリが含まれます。
ただし、ネイティブの Ruby を使用する場合 (「オプション」ダイアログでインタプリタを切り替えることによって指定可能)、rspec がインストールされていることを確認する必要があります (「自動テスト」の節の最初の図を参照)。インストールされていない場合、「ツール」>「Ruby Gems」をクリックし、「新しい Gem」タブでインストールします。Rails で rspec を使用する場合、別の Ruby Gem をインストールする必要があることがあるため、これらの手順を確認してください。
「テストへ移動」アクションを使用すると、これらの仕様ファイルを開くことができます。「エディタ」のコンテキストメニューから「ファイルをテスト」または「ファイルを実行」を使用して、rspec コントロールの下にある仕様ファイルを実行します。これは、spec ディレクトリ内の spec.opts ファイルにある仕様ファイルオプションに、テストが従うことを意味します。この場面で、「ファイルをテスト」と「ファイルを実行」の使用に適用される考慮事項は、前述のとおりです。また、IDE 内からテストを実行したり、赤色や緑色のフラグをオフにするなど別のオプションの組み合わせを使用したりできます。異なるオプションを持つ spec.opts.netbeans というファイルを作成し、そのファイルを同じ spec ディレクトリに配置します。
まだ利用できませんが、spec ファイルのテンプレートが提供される予定です。
まとめ
この記事では、Ruby アプリケーションのテストに関する NetBeans IDE 機能を取り上げました。基本的な単体テスト機能、自動テスト、および rspec を説明しました。また、Ruby Gem を IDE にインストールする方法と、IDE のテストのショートカット機能を使用する方法も説明しました。
次の手順
>> その他の NetBeans Ruby ドキュメント