データベース単体テストのスクリプト
各データベース単体テストには、単一の事前テスト アクション、テスト アクション、および事後テスト アクションが含まれています。 これらの各アクションには、次のものが含まれています。
データベースで実行される Transact-SQL スクリプト
スクリプト実行から返される結果を評価するゼロ以上のテスト条件
すべてのデータベース単体テストに含める必要があるコンポーネントは、テスト アクションの Transact-SQL テスト スクリプトのみです。 テスト スクリプト自体だけでなく、テスト条件も指定して、テスト スクリプトが意図した値または値セットを返すかどうかを確認することも必要です。テスト アクションは、そのデータベース内の特定のオブジェクトを実行または変更してから、その変更を評価します。
テスト アクションごとに、1 つの事前テスト アクションと 1 つの事後テスト アクションを含めることができます。 テスト アクションと同様に、それぞれの事前テスト アクションと事後テスト アクションには、1 つの Transact-SQL スクリプトとゼロ以上のテスト条件が含まれています。 事前テスト アクションを使用すると、データベースがテスト アクションを実行し、意味のある結果を返せる状態であることを確認できます。たとえば、事前テスト アクションを使用して、テスト スクリプトがデータを操作する前に、テーブルにそのデータが含まれていることを確認できます。 事前テスト アクションがデータベースを準備し、テスト アクションが意味のある結果を返した後、事後テスト アクションは、事前テスト アクションが実行される前の状態にデータベースを戻します。事後テスト アクションを使用して、テスト アクションの結果を検証する場合もあります。 これは、事後テスト アクションがテスト アクションよりも高いデータベース権限を持っているためです。 詳細については、「接続文字列とアクセス許可の概要」を参照してください。
これらの 3 つのアクション以外に、データベース単体テストの実行前と実行後に実行される、2 つのテスト スクリプト (共通スクリプトと呼ばれます) もあります。 その結果、単一のデータベース単体テストの実行中に、最大 5 つの Transact-SQL スクリプトを実行できます。 必須の Transact-SQL スクリプトは、テスト アクション内に含まれるスクリプトのみです。共通スクリプト、事前テスト アクション スクリプト、および事後テスト アクション スクリプトは省略可能です。
次の表に、データベース単体テストに関連付けられたスクリプトの完全な一覧を示します。
動作 |
スクリプトの型 |
説明 |
---|---|---|
TestInitialize |
共通スクリプト (初期化) |
(省略可能) このスクリプトは、単体テストのすべての事前テスト アクションおよびテスト アクションに先行します。 TestInitialize スクリプトは、指定したテスト クラス内の各単体テストの前に実行されます。 このスクリプトは、特権コンテキストを使用して実行されます。 |
事前テスト |
テスト スクリプト |
(省略可能) このスクリプトは、単体テストの一部です。 事前テスト スクリプトは、単体テスト内のテスト アクションの前に実行されます。 このスクリプトは、特権コンテキストを使用して実行されます。 |
Test |
テスト スクリプト |
(必須) このスクリプトは、単体テストの一部です。 テスト スクリプトはデータベースに対して実行されます。 このスクリプトは、たとえば、テーブル値を取得、挿入、または更新するストアド プロシージャを実行します。 このスクリプトは、実行コンテキストを使用して実行されます。 |
事後テスト |
テスト スクリプト |
(省略可能) このスクリプトは、単体テストの一部です。 事後テスト スクリプトは、個別の単体テストの後に実行されます。 このスクリプトは、特権コンテキストを使用して実行されます。 |
TestCleanup |
共通スクリプト (クリーンアップ) |
(省略可能) このスクリプトは、単体テストを実行します。 TestCleanup スクリプトは、指定したテスト クラス内のすべての単体テストの後に実行されます。 このスクリプトは、特権コンテキストを使用して実行されます。 |
これらの各スクリプトが実行されるさまざまなセキュリティ コンテキストの詳細については、「接続文字列とアクセス許可の概要」および「Visual Studio のデータベース機能に必要なアクセス許可」の「データベースに対して単体テストを実行するためのアクセス許可」のセクションを参照してください。
スクリプトが実行される順序
各スクリプトが実行される順序を理解することが重要です。 その順序の変更はできませんが、実行するスクリプトを指定できます。 次の図は、2 つのデータベース単体テストを含むテスト実行で使用できるスクリプトの選択、およびスクリプトが実行される順序を示します。
注意
データ生成とデータベース配置の変更は、スクリプトが実行される前に、テスト実行の開始時に適用されます。 これらの変更は、特権コンテキスト接続文字列を使用して適用されます。 詳細については、「方法 : データベース単体テストの実行を構成する」を参照してください。
初期化スクリプトとクリーンアップ スクリプト
データベース単体テスト デザイナーでは、TestInitialize スクリプトと TestCleanup スクリプトは共通スクリプトと呼ばれます。 前述の例では、2 つの単体テストが同じテスト クラスの一部であることを前提にしています。 その結果、これらの単体テストは、同じ TestInitialize スクリプトと TestCleanup スクリプトを共有します。 単一のテスト クラス内のすべての単体テストで、常にこのようになります。 ただし、テスト実行に別のテスト クラスの単体テストが含まれる場合、関連するテスト クラスの共通スクリプトは、単体テストの実行前と実行後に実行されます。
データベース単体テスト デザイナーのみを使用して単体テストを作成した場合、テスト クラスの概念に習熟していない可能性があります。 [テスト] メニューを開き、[新しいテスト] をクリックして単体テストを作成するたびに、Visual Studio Premium ではテスト クラスが生成されます。 テスト クラスは、指定したテスト名の後に .cs または .vb 拡張子を付けてソリューション エクスプローラーに表示されます。 各テスト クラス内では、個別の単体テストはテスト メソッドとして格納されます。 ただし、テスト メソッド (つまり単体テスト) の数に関係なく、各テスト クラスにはゼロ以上の TestInitialize スクリプトと TestCleanup スクリプトがあります。
TestInitialize スクリプトを使用すると、テスト データベースを準備でき、TestCleanup スクリプトを使用すると、テスト データベースを既知の状態に戻すことができます。 たとえば、TestInitialize を使用して、後で実行するヘルパー ストアド プロシージャを作成し、テスト スクリプトで別のストアド プロシージャをテストできます。
事前テスト スクリプトと事後テスト スクリプト
事前テスト アクションと事後テスト アクションに関連付けられたスクリプトは、単体テストによって異なることがあります。 これらのスクリプトを使用すると、データベースに対する継続的な変更を設定してから、その変更をクリーンアップできます。