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

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

著者:DTS  五座 淳一   2006/10/3
前のページ  1  2  3  次のページ
インテグレーション層の単体テスト比較

   データベースアクセスを伴うこのレイヤのテストでは、テスト前後にデータベースの適切な初期化、およびデータベースの更新を確認する手段が必要となります。

   JavaはHibernateを使ったDAO、Railsはモデル(Active Record)がテスト対象となります。
Java/インテグレーション層の単体テスト

   Javaのインテグレーション層にあたるDAOをテストするのは、DbUnitというテスティングフレームワークです。DbUnitはJUnitの基本的なテスト機能に加えて、このレイヤのテストに必要なテーブルの初期化や更新の確認などの機能を備えています。

   このテーブルの初期状態などはXMLファイル、もしくはExcelファイルに記述することができます。リスト1はXMLを使用したテーブル初期化用のデータです。リスト2では、この初期化用データを使ってテーブルを初期化し、DAOのテストを実施しています。

リスト1:XMLを使用したテーブル初期化用データ
<?xml version="1.0" ?>
<dataset>
   <todos id="1" title="洗車する" progress="0" />
   <todos id="2" title="週報を書く" progress="50" />
</dataset>

リスト2:DbUnitを使用した単体テスト
public class TodoTest extends DatabaseTestCase {
   (中略)
   protected IDataSet getDataSet() throws Exception {
      return new FlatXmlDataSet(new FileReader("todo1.xml"));
   }
   public void testTodo() throws Exception {
      TodoDao todoDao = new TodoDao(session);
      List todoList = todoDao.searchAll();
      Todo todo = (Todo) todoList.get(0);
      assertEquals("洗車する", todo.getTitle());
      assertEquals(0, todo.getProgress());
   }
}


Rails/インテグレーション層の単体テスト

   Railsのインテグレーション層に該当するモデルのテストは、ユニットテストが使用されます。先の「Railsの単体テスト」の項目でも解説しましたが、ユニットテストの基本的な機能は他のxUnitファミリと共通しています。

   また、2つの要素がインテグレーション層のテストをサポートします。

  • テスト用データベース
  • フィクスチャ

表3:インテグレーション層のサポート

   テスト用データベースは、開発用や本番用のデータベースに影響を与えることなくテストを実施する仕組みです。Railsには環境モードと呼ばれている実行状況によって切り替えることができる機能があり、テスト時には、この環境モードをテストモードに切り替え、テスト用に用意されたデータベースを使用するようにします。

   もう1つが、テストデータをロードする機能であるフィクスチャです。CSV形式やYAML形式などでテストデータを作成することができます。

・リスト3:フィクスチャ(YAML形式)
wash_the_car:
   id: 1
   title: 洗車する
   progress: 0
weekly_report:
   id: 2
   title: 週報を書く
   progress: 50

リスト4:ユニットテスト
class TodoTest < Test::Unit::TestCase
   fixtures :todos

   def test_todo
      todo = Todo.find(1)
      assert_equal todos(:wash_the_car).title, todo.title
   assert_equal todos(:wash_the_car).progress, todo.progress
   end
end

   ユニットテストでは「fixtures :todos」という記述によって、用意したフィクスチャによりデータベースが初期化されます。


インテグレーション層の単体テスト比較結果

   両者ともあらかじめ用意したファイルによってテーブルを初期化する仕組みがあり、非常によく似ています。インテグレーション層の単体テストについては、ほとんど差がないと言ってよいでしょう。

前のページ  1  2  3  次のページ


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


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