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