 |

|
徹底比較!!Ruby on Rails vs Javaフレームワーク |
第5回:テストフレームワーク
著者:DTS 五座 淳一 2006/10/3
|
|
|
1 2 3 次のページ
|
 |
はじめに
|
今回は、テスティングフレームワークについて比較したいと思います。
一般的にテストフェーズは、表1のようなフェーズが定義されていますが、Javaフレームワークを使用した場合でも、Railsを使用した場合のテストでも結合テスト以降に差異はありません。したがって、今回は単体テストフェーズを中心に比較を行います。
フェーズ |
説明 |
代表的なツール |
単体テスト |
クラスやメソッドなど一部のモジュールに焦点を当てたテストを実施します。 |
JUnit |
結合テスト |
単体テスト済みのモジュールを組み合わせ、外部仕様に合っているか確認します。Webアプリの場合、ブラウザからの動作確認がこのテストになります。 |
Selenium |
システムテスト |
機能だけでなく、性能など非機能要求も含めたシステム全体の動作を確認するテストを実施します。 |
JMeter |
表1:テストフェーズ
|
Javaの単体テスト
|
Javaの単体テストといえばJUnitが有名です。JUnitはKent Beck氏とErich Gamma氏によって開発されたJava用のテスティングフレームワークです。JUnitの登場以来、テスティングフレームワークは、様々言語に波及し.NET用のNUnitやPython用のpyUnitなど、xUnitファミリと呼ばれる各言語用テスティングフレームワークが登場してきました。
Javaの場合、Webアプリケーションの単体テストで使用されるのは、このJUnitだけではなく、用途によってJUnitを拡張したフレームワークをいくつか使い分けます。Javaの単体テストでよく使用されるテスティングフレームワークを表2にまとめました。
名称 |
概要 |
JUnit |
シンプルな単体テストフレームワーク |
DbUnit |
データベースアクセス用の単体テストフレームワーク |
Cactus |
サーバサイド用の単体テストフレームワーク |
表2:Javaテスティングフレームワーク
|
Railsの単体テスト
|
Rubyには、Ruby本体に組み込まれている「Test::Unit」というテスティングフレームワークがあります。Railsのテストでは、このTest::UnitをRailsアプリ用に拡張したユニットテストと機能テストの2つのテストの仕組みが用意されています。
Test::Unitも、xUnitファミリの一員ですので、何らかのxUnitを使用した方であればスムーズに導入できるでしょう。
|
テスト戦略の比較
|
Java(注1)とRailsでは、それぞれどのようにテストを進めていくのでしょうか。図1は、各実装がどのようなテストフェーズを経由して、結合テストフェーズへと進むのかを示しています。
※注1:
今回は、本連載で取り扱ったJSF/Spring/Hibernateを採用したWebアプリケーションのテストに焦点を当てました。

図1:テスト戦略 (画像をクリックすると別ウィンドウに拡大図を表示します)
|
Javaのテスト戦略
|
今回は、テスト対象としてJSF/Spring/Hibernateを採用したWebアプリケーションを例にあげましたが、各レイヤが分割しやすい構造になっているため、実装箇所すべてに単体テストを割り当てることができます。
確かに、実装箇所はすべて単体テストによって確認することができますが、設定ファイルについては、結合試験まで検査を持ち越してしまっているので注意が必要です。
|
Railsのテスト戦略
|
RailsはJavaに比べてレイヤ分割を重視していない分、単体テストを実施できる箇所が少ないということがわかります。
Railsでは2つのテストが用意されています。1つ目がモデルをテストするための、ユニットテスト、もう1つがコントローラとモデルを統合してテストする機能テストです。
テスト戦略で注目していただきたいのが、2つ目の機能テストです。コントローラだけをテストするのではなく、モデルも含めたテストとすることで、モデルのモックオブジェクトを作成する手間を省いた効率的なテスト戦略になっています。
また、モデルやコントローラを作成するgenerateスクリプトを実行することで、テストを記述するためのファイルも生成することができます。
|
テスト戦略の比較結果
|
両者のテスト戦略を比較してみるとJavaの方が、個々の実装に対して厳密に単体テストを実施することが可能となっています。実装ごとに単体テストを実施できることで、それぞれに品質を確保することができ、分業しやすいということがいえます。
また、検査対象を絞り込むことにより、少ないコストで欠陥を検出できるというメリットもあります。
一方、Railsのテスト戦略は効率的なテスト戦略となっていますが、モデル、コントローラの順にテストを実施することが前提となっており、モデルの開発とコントローラの開発を分業することが難しくなっています。
以上のことから、テスト戦略の観点では、効率を重視したRailsのテスト戦略と分業を意識したJavaのテスト戦略になっているということがわかります。
|
1 2 3 次のページ
|

|
|

|
著者プロフィール
株式会社DTS 五座 淳一
技術部所属。入社以来、交換機や携帯電話、Webシステムなど様々な開発を担当する。Ruby on Rails上に構築したオープンソースのCMS「Rubricks」(http://rubricks.org/)のコミッタ。
|
|
|
|