小井土です。
> 十河です。
> お返事ありがとうございます。
中略
> データベースに直接関係してくるテストも、開発中に移行元データが入ってきた
> り、まったく違うテスト用のデータが入ってきたりと、完全でないテストがだん
> だん増えてきてしまったりします。
> (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] );
}
}
}