SQL Server の単体テストのスクリプト
各 SQL Server 単体テストには、1 つの事前テスト アクション、テスト アクション、および事後テスト アクションが含まれています。 これらの各アクションには、次のものが含まれています。
データベースで実行される Transact-SQL スクリプト
スクリプトの実行から返された結果を評価する 0 個以上のテスト条件
すべての SQL Server 単体テストに含める必要があるコンポーネントは、テスト アクションの Transact-SQL テスト スクリプトのみです。 テスト スクリプト自体に加え、テスト条件も指定して、テスト スクリプトが期待した値または値セットを返したかどうかを確認することも必要な場合があります。 テスト アクションは、そのデータベース内の特定のオブジェクトを実行または変更してから、その変更を評価します。
テスト アクションごとに、1 つの事前テスト アクションと 1 つの事後テスト アクションを含めることができます。 テスト アクションと同様に、それぞれの事前テスト アクションと事後テスト アクションには、1 つの Transact-SQL スクリプトと 0 個以上のテスト条件が含まれます。 事前テスト アクションを使用すると、データベースがテスト アクションを実行し、意味のある結果を返すことができる状態であることを確認できます。 たとえば、事前テスト アクションを使用すると、テーブルにデータが含まれていることを確認した後、テスト スクリプトがそのデータを操作することができます。 事前テスト アクションによってデータベースが準備され、テスト アクションよって意味のある結果が返された後、事後テスト アクションは、事前テスト アクションが実行される前の状態にデータベースを戻します。 場合によっては、事後テスト アクションを使用してテスト アクションの結果を検証することもあります。 これは、事後テスト アクションのデータベース権限がテスト アクションのデータベース権限よりも高いためです。 詳細については、「接続文字列とアクセス許可の概要」を参照してください。
これら 3 つのアクション以外に、SQL Server の単体テストの実行前と実行後に毎回実行される、共通スクリプトと呼ばれる 2 つのテスト スクリプトもあります。 その結果、1 つの SQL Server 単体テストの実行中に、最大 5 つの Transact-SQL スクリプトを実行できます。 テスト アクションに含まれる Transact-SQL スクリプトのみ必須で、共通スクリプト、事前テスト アクション スクリプト、事後テスト アクション スクリプトは省略可能です。
次の表に、SQL Server の単体テストに関連付けられているスクリプトの一覧を示します。
操作 | スクリプトの種類 | 説明 |
---|---|---|
TestInitialize | 共通スクリプト (初期化) | (省略可能) このスクリプトは、単体テストのすべての事前テスト アクションおよびテスト アクションの前に実行されます。 TestInitialize スクリプトは、指定されたテスト クラス内の各単体テストの前に実行されます。 このスクリプトは、特権コンテキストを使用して実行されます。 |
事前テスト | テスト スクリプト | (省略可能) このスクリプトは単体テストの一部です。 事前テスト スクリプトは、単体テスト内のテスト アクションの前に実行されます。 このスクリプトは、特権コンテキストを使用して実行されます。 |
テスト | テスト スクリプト | (必須) このスクリプトは単体テストの一部です。 たとえば、このスクリプトでは、テーブルの値を取得、挿入、または更新するストアド プロシージャを実行できます。 このスクリプトは、実行コンテキストを使用して実行されます。 |
事後テスト | テスト スクリプト | (省略可能) このスクリプトは単体テストの一部です。 事後テスト スクリプトは、各単体テストの後に実行されます。 このスクリプトは、特権コンテキストを使用して実行されます。 |
TestCleanup | 共通スクリプト (クリーンアップ) | (省略可能) このスクリプトは単体テストの後に実行されます。 TestCleanup スクリプトは、指定されたテスト クラス内のすべての単体テストの後に実行されます。 このスクリプトは、特権コンテキストを使用して実行されます。 |
これらの各スクリプトが実行するさまざまなセキュリティ コンテキストについて詳しくは、「接続文字列とアクセス許可の概要」と、「SQL Server Data Tools に必要な権限」の SQL Server 単体テストのアクセス許可に関するセクションをご覧ください。
スクリプトの実行順序
各スクリプトが実行される順序を理解することが重要です。 その順序を変更することはできませんが、実行するスクリプトを決めることができます。 次の図は、2 つの SQL Server 単体テストを含むテスト実行で使用できるスクリプトの選択と、スクリプトの実行順序を示します。
Note
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 を使用して、後で実行するヘルパー ストアド プロシージャを作成し、テスト スクリプトで、別のストアド プロシージャをテストすることができます。
事前テスト スクリプトと事後テスト スクリプト
事前テスト アクションと事後テスト アクションに関連付けられたスクリプトは、単体テストごとに異なる場合があります。 これらのスクリプトを使用すると、データベースに対する増分変更を設定しから、その変更をクリーンアップできます。