TOPシステム開発> はじめに
徹底比較!!Ruby on Rails vs Javaフレームワーク
徹底比較!!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  五座 淳一氏
著者プロフィール
株式会社DTS  五座 淳一
技術部所属。入社以来、交換機や携帯電話、Webシステムなど様々な開発を担当する。Ruby on Rails上に構築したオープンソースのCMS「Rubricks」(http://rubricks.org/)のコミッタ。


INDEX
第5回:テストフレームワーク
はじめに
  インテグレーション層の単体テスト比較
  ビジネス層の単体テスト比較