0

データベースと通信するユニット統合テストを作成するにはどうすればよいですか。例えば:

public int GetAppLockCount(DbConnection connection)
{
    string query := 
          "SELECT"+CRLF+
          "   tl.resource_type AS ResourceType,"+CRLF+
          "   tl.resource_description AS ResourceName,"+CRLF+
          "   tl.request_session_id AS spid"+CRLF+
          "FROM sys.dm_tran_locks tl"+CRLF+
          "WHERE tl.resource_type = 'APPLICATION'"+CRLF+
          "AND tl.resource_database_id = ("+CRLF+
          "    SELECT dbid"+CRLF+
          "    FROM master.dbo.sysprocesses"+CRLF+
          "    WHERE spid = @@spid)";

    IRecordset rdr = Connection.Execute(query);

    int nCount = 0;
    while not rdr.EOF do
    {
       nCount := nCount+1;
       rdr.Next;
    }

    return nCount;
 }

この場合、私はこのバグのコードを追い払おうとしています(IRecordset空のレコードセットを返します)。

[UnitTest]
void TestGetLockCountShouldAlwaysSucceed();
{
   DbConnection conn = GetConnectionForUnit_IMean_IntegrationTest();
   GetAppLockCount(conn);
   CheckTrue(True, "We should reach here, whether there are app locks or not");
}

今必要なのは、ユニット統合テストを実行するときにデータベースに接続する方法だけです。

テストランナーが見つけられるように、接続文字列をどこかに保存しますか?または.iniまたは.xmlファイル.config


注:言語/フレームワークに依存しません。コードには、意図的に次の要素が含まれています。

  • C#
  • デルファイ
  • ADO.net
  • ADO
  • NUnit
  • DUnit

そのポイントを家に追いやるために。

4

1 に答える 1

1

今必要なのは、ユニット統合テストを実行するときにデータベースに接続する方法だけです。

既存のデータベースまたはインメモリデータベースのいずれかを使用します。私は、現在使用している既存のデータベースの両方を試しました。このデータベースは、antファイルのLiquibaseスクリプトを使用してスプラットおよび再構築されています。インメモリの利点-他のアプリケーションに依存しません。短所-それほど現実的ではなく、起動に時間がかかる場合があります。実際のデータベースの長所-実世界と同じにすることができます短所-サードパーティのマシンにアクセスする必要があります。新しいユーザーを設定する(つまり、新しいデータベースを作成する)作業が増えます

テストランナーが見つけられるように、接続文字列をどこかに保存しますか?.iniまたは.xmlまたは.configファイル?

うん。C#では.configファイルを使用し、Javaでは.propsファイルを使用しました。インメモリを使用すると、これをバージョン管理にスローできます。これは、各ユーザーで同じであり、実際のデータベースがどこかで実行されている場合は、ユーザーごとに異なる必要があるためです。

シードデータも考慮する必要があります。Javaでは、過去にdbUnitを使用しました。最も読みやすいわけではありませんが、機能します。今、私はRubyActiveRecordタスクを使用しています。

どうやってこれを始めますか?まず、データベースを再構築できますか?この道をはるかに進む前に、これを自動化できる必要があります。

次に、テスト用に空のローカルデータベースを構築する必要があります。私は開発者ごとに1人で行きます。他のいくつかのチームは共有していますが、コミットしていません。.NET / MS SQLの世界では、メモリ内で行うのは非常に簡単だと思います。

于 2012-05-11T11:35:10.827 に答える