小井土です。
> 十河です。
> お返事ありがとうございます。
中略
> データベースに直接関係してくるテストも、開発中に移行元データが入ってきた
> り、まったく違うテスト用のデータが入ってきたりと、完全でないテストがだん
> だん増えてきてしまったりします。
> (DB内のデータに依存したテストコードを書いているのでこれが間違いなのかも)
>
> ふと、トランザクションをSetUpで開始して、TereDownでロールバックすること
> で、テストデータを残さずに、データベースのテストが行えるかなと思いました。
>
> データベースに対してのテストはどのように行われていますでしょうか?
これとほぼ同じことを小さいFW化して、テストするというのをPASSJのXPの
セミナーでデモしました。
#実際には、まだ利用していません。
これもテストカタログに入れる予定です。
SQL-Serverは、トランザクションがネスティングできるので、比較的きれいに実現
できました。
ポイントは、コネクションの共有化とトランザクションの入れ子構造です。
問題は、テストコードは含まれないが、テストのためのコードが含まれていること
ですね。
以下はそのときのテストケースです。
DatabaseAccessTestCaseというクラスで、テーブルの件数取得やテーブルデータの
読み込み関数を提供しています。
using System;
using System.Data.SqlClient;
using OSK.DatabaseAccess.Core;
using NUnit.Framework;
namespace OSK.DatabaseAccess.Tests
{
 /// <summary>
 /// SimleDatabaseAccessTestCase の概要の説明です。
 /// </summary>
 [TestFixture]
 public class SimpleDatabaseAccessTestCase : DatabaseAccessTestCase
 {
  private SimpleDatabaseAccess target;
  private const string connectionString = "server=(local); uid=sa; pwd='OSKPassword';
database=testDB";
  [SetUp]
  public void SetUp()
  {
   target = new SimpleDatabaseAccess( connectionString );
   SetUpContextHandler( target, connectionString );
  }
  [TearDown]
  public void TearDown()
  {
   TearDownContextHandler();
  }
  [Test]
   public void AddTest()
   {
     string[] newData;
     int recordCount;
     recordCount = GetRecordCount("TestData");
     target.Add("XYZ", "東京都");
     Assertion.AssertEquals("データが追加されなかった", recordCount + 1,
GetRecordCount("TestData"));
     Console.WriteLine("RecordCount=" + recordCount.ToString());
      newData = ReadOneRecord("Select * From TestData Where name='XYZ' " );
      Assertion.AssertEquals("読み込み確認できなかった", "東京都", newData[2] );
    }
 }
}