TOPシステム開発> ビジネス層の単体テスト比較
徹底比較!!Ruby on Rails vs Javaフレームワーク
徹底比較!!Ruby on Rails vs Javaフレームワーク

第5回:テストフレームワーク

著者:DTS  五座 淳一   2006/10/3
前のページ  1  2  3
ビジネス層の単体テスト比較

   このレイヤのテスト対象としては、SpringのサービスレイヤとRailsのコントローラ(Action Controller)が該当します。
Java/ビジネス層の単体テスト

   このレイヤのテスト対象はSpringのサービスレイヤになります。要件によっては複雑になりがちな実装箇所ですが、幸いなことに純粋なJavaプログラムのテストであるため、テストの進め方は比較的単純です。

   このレイヤーのテストには、JUnitが使用されます。

リスト5:JUnitを使用した単体テスト
public class TodoListTest extends TestCase {
   (中略)
   public void testTodoList() throws Exception {
      assertEquals("洗車する", ((Todo) todoList.get(0)).getTitle());
      assertEquals(0, ((Todo) todoList.get(0)).getProgress());
   }
}


Rails/ビジネス層の単体テスト

   Railsのコントローラが主にビジネス層の実装になります。「テスト戦略」の項目でも解説しましたが、このコントローラだけを対象にした単体テストは実施しません。そのかわりに、機能テストと呼ばれるコントローラとモデルを統合した、他の単体テストよりも上位レベルのテストが実施されます。

   では、コントローラだけでの単体テストを実施することは不可能なのでしょうか。実は、コントローラだけで単体試験を実施することもできます。「第4回:DIコンテナとの比較」で紹介したモックオブジェクトを使用することでコントローラだけの単体テストを実施することができます。しかし、効率的な品質保証を念頭においているRailsでは、コントローラだけの単体テストが実施されることはあまりありません。

リスト6:機能テスト
class TodosControllerTest < Test::Unit::TestCase
   fixtures :todos

   def setup
      @controller = TodosController.new
      @request = ActionController::TestRequest.new
      @response = ActionController::TestResponse.new
   end

   def test_add
      post :add, :todo => {:title => '書籍を購入する', :progress => 0}
      assert_equal "success", flash[:notice]
      assert_redirected_to :action => 'list'
      assert_equal 3, Todo.find_all.size
   end
end


ビジネス層の単体テスト比較結果

   このレイヤの両者のテストは、それぞれのテスト戦略によって実施されるテストの位置づけが異なっているため、単純な比較はできません。


プレゼンテーション層の単体テスト比較

   Javaのプレゼンテーション層にあたるJSF、特にJSPについては、単体テストが実施しづらい箇所です。サーバサイド用の単体テストフレームワークCactusを用いることでJSPについてもテストを実施することもできますが、不具合が混入しやすいロジックを明確に分離できること、Seleniumなどの結合試験ツールが使いやすくなってきていることなどの理由から、この部分の単体テストを実施しない場合もあります。

   Railsには、プレゼンテーション層用のテストは用意されていません。


その他の比較

   その他のテストに関係する周辺技術やツールについて、表4にまとめました。ほとんど差がないといってよいでしょう。

  Java Rails
自動化 AntやMavenを使用してテストを自動化できる rakeを使用してテストを自動化できる
GUIテスト IDEに含まれている IDEに含まれている
カバレッジ jcoverageなどのツールで測定できる Ruby Coverageなどのツールで測定できる
モックオブジェクト DIコンテナなどを使用して実現できる Ruby言語のダイナミックな仕組みで実現できる

表4:その他の比較


まとめ

   両者のテストを比較してみると、GUIテストツールやカバレッジなどの周辺ツールも含め、テスティングフレームワークが提供する機能的な差はほとんどなく、テスト戦略の比較の章で示したテストの進め方だけに違いがあることがわかります。

   両者の戦略の違いによって「分業を重視しているJavaのテスト」と「効率を重視しているRailsのテスト」となっていることがわかります。

   次回は、Railsに影響を受けたフレームワーク、GrailsとRailsの比較を行います。

前のページ  1  2  3


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


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