SQL Server の単体テストでのテスト条件の使用
SQL Server 単体テストでは、1 つ以上の Transact-SQL テスト スクリプトが実行されます。 結果は Transact-SQL スクリプト内で評価することができ、エラーを返してテストに失敗するには THROW または RAISERROR が使用されます。また、結果を評価するテスト内でテスト条件を定義することもできます。 テスト結果として、 SqlExecutionResult クラスのインスタンスが返されます。 このクラスのインスタンスには、1 つ以上のデータセット、実行時間、およびスクリプトの影響を受けた行数が含まれます。 この情報すべては、スクリプトの実行中に収集されます。 これらの結果は、テスト条件を使用して評価できます。SQL Server Data Tools には、定義済みのテスト条件が用意されています。 また、カスタム条件を作成して使用することもできます (「SQL Server の単体テストのカスタム テスト条件」を参照してください)。
定義済みテスト条件
次の表に、SQL Server 単体テスト デザイナーの [テスト条件] ウィンドウを使用して追加できる定義済みテスト条件を示します。
テスト条件 | テスト条件の説明 |
---|---|
データ チェックサム | Transact-SQL スクリプトから返された結果セットのチェックサムが予期されるチェックサムと一致しない場合に失敗します。 詳細については、「データ チェックサムの指定」を参照してください。 Note: テストを実行するたびに異なるデータが返される場合、このテスト条件はお勧めしません。 たとえば、結果セットに生成された日付または時刻が含まれる場合、または ID 列が含まれる場合、実行のたびにチェックサムが異なるため、テストは失敗します。 |
空の ResultSet | Transact-SQL スクリプトから返された結果セットが空でない場合に失敗します。 |
実行時間 | Transact-SQL テスト スクリプトの実行時間が予期された値を超えた場合に失敗します。 既定の実行時間は 30 秒です。 実行時間は、テスト スクリプトのテストのみに適用され、事前テスト スクリプトまたは事後テスト スクリプトには適用されません。 |
予期されるスキーマ | 結果セットの列およびデータ型が、テスト条件に指定された列およびデータ型と一致しない場合に失敗します。 テスト条件のプロパティを通じて、スキーマを指定する必要があります。 詳細については、「予期されるスキーマの指定」を参照してください。 |
結果不確定 | 結果が不確定なテストを常に作成します。 これは、すべてのテストに追加される既定の条件です。 このテスト条件は、テストの検証が実装されていないことを示すために含まれています。 このテスト条件は、他のテスト条件を追加した後に、テストから削除します。 |
ResultSet が空ではありません | 結果セットが空の場合に失敗します。 テスト スクリプトでこのテスト条件または EmptyResultSet を Transact-SQL @@RAISERROR 関数と共に使用して、更新が適切に行われたかどうかをテストできます。 たとえば、更新前の値を保存し、更新を実行し、更新後の値を比較して、予期された結果が得られない場合はエラーを発生させることができます。 |
行数 | 結果セットに予期された行数が含まれていない場合に失敗します。 |
スカラー値 | 結果セット内の特定の値が指定した値と等しくない場合に失敗します。 既定の [予期された値] は null です。 |
注意
実行時間テスト条件では、Transact-SQL テスト スクリプトを実行する必要がある制限時間を指定します。 この制限時間が経過した場合、テストは失敗します。 テスト結果には、継続時間統計情報も含まれています。この情報は、実行時間テスト条件とは異なります。 継続時間統計には、実行時間だけでなく、データベースに 2 回接続する時間 (事前テスト スクリプトや事後テスト スクリプトなどの他のテスト スクリプトを実行するため、およびテスト条件を実行するため) も含まれます。 したがって、継続時間が実行時間より長くても、テストに合格する可能性があります。
報告された継続時間には、テストの実行前に行われるデータの生成およびスキーマの配置に要する時間は含まれません。 テストの継続時間を表示するには、[テスト結果] ウィンドウで実行されたテストを選択し、右クリックして [テスト結果の詳細の表示] をクリックします。
SQL Server 単体テストにテスト条件を追加するには、SQL Server 単体テスト デザイナーの [テスト条件] ウィンドウを使用します。 詳細については、「SQL Server の単体テストにテスト条件を追加する方法」を参照してください。
また、テスト メソッド コードを直接編集して機能を追加することもできます。 詳細については、「SQL Server の単体テストを開いて編集する方法」および「単一のトランザクションのスコープ内で実行する SQL Server の単体テストを作成する方法」を参照してください。 たとえば、Assert ステートメントを追加することにより、テスト メソッドに機能を追加することができます。 詳細については、「SQL Server の単体テストでの Transact-SQL アサーションの使用」を参照してください。
予期されるエラー
成功すべきではない動作をテストする SQL Server 単体テストを作成することができます。 これらの予期されるエラーは、ネガティブ テストとも呼ばれます。 例として、次のようなものがあります。
顧客のデータを削除するストアド プロシージャが、無効な顧客 ID を指定した場合に失敗することを検証する。
注文に応じるストアド プロシージャが、注文が行われていない場合または既に注文に応じた場合に失敗することを検証する。
注文を取り消すストアド プロシージャが、完了した注文または既に取り消された注文を取り消すことができないことを検証する。
予期される例外をスローするストアド プロシージャ用 SQL Server 単体テストを定義できます。 単体テスト メソッドに属性を追加して、予期される例外を示すことができます。 これにより、その例外が発生したときにテストが失敗するのを防ぐことができます。
SQL Server の単体テスト メソッドに予期される例外を指定するには、次の属性を追加します。
[ExpectedSqlException(MessageNumber = nnnnn, Severity = x, MatchFirstError = false, State = y)]
各要素の説明は次のとおりです。
nnnnn は、予期されるメッセージの番号 (たとえば 14025) です。
x は、予期される例外の重大度です。
y は、予期される例外の状態です。
指定されていないパラメーターは無視されます。 これらのパラメーターは、データベース コードの THROW ステートメントに渡します。 MatchFirstError = false を指定すると、この属性は例外のいずれの SqlError にも一致します。 既定の動作 (MatchFirstError = true) は、最初に発生するエラーにしか一致しません。
予期される例外と SQL Server のネガティブ単体テストの使用方法の例については、「チュートリアル: SQL Server の単体テストの作成と実行」を参照してください。
データ チェックサムの指定
SQL Server 単体テスト デザイナーを表示するには、ソリューション エクスプローラーで単体テストのソース コード ファイルをダブルクリックします。
データベース単体テストにデータ チェックサム テスト条件を追加した後、次の手順に従って予期されるチェックサムを構成する必要があります。
予期されるチェックサムを指定するには
テスト条件の一覧で、チェックサムを指定する [データ チェックサム] テスト条件をクリックします。
F4 キーを押して [プロパティ] ウィンドウを開きます。 または、[表示] メニューの [プロパティ] をクリックします。
(省略可能) テスト条件の "(名前)" プロパティを、わかりやすい名前に変更することもできます。
"構成" プロパティで、参照ボタン ([...]) をクリックします。
[TestConditionName の構成] ダイアログ ボックスが表示されます。
テストするデータベースへの接続を指定します。 詳細については、方法:データベース接続の作成をご覧ください。
既定では、テストの Transact-SQL 本体が編集ウィンドウに表示されます。 必要に応じて、予期する結果を生成するようにコードを変更できます。 たとえば、テストに事前テストのコードがある場合、そのコードを追加することができます。
重要
以前にチェックサムを指定したチェックサム条件を変更した場合、編集ウィンドウで加えた変更は保存されません。 これらの変更を再度行ってから [取得] をクリックする必要があります。[取得] をクリックします。
指定したデータベース接続に対して Transact-SQL が実行され、結果がダイアログ ボックスに表示されます。
結果が予期していたテスト結果と一致する場合は、[OK] をクリックします。 それ以外の場合は、Transact-SQL 本体を変更し、結果が期待どおりになるまで手順 6、7、8 を繰り返します。
テスト条件の [値] 列には、予期されるチェックサムの値が表示されます。
予期されるスキーマの指定
SQL Server 単体テストに予期されるスキーマ テスト条件を追加した後、次の手順に従って予期されるスキーマを構成する必要があります。
予期されるスキーマを指定するには
テスト条件の一覧で、スキーマを指定する [予期されるスキーマ] テスト条件をクリックします。
F4 キーを押して [プロパティ] ウィンドウを開きます。 または、[表示] メニューの [プロパティ] をクリックします。
(省略可能) テスト条件の "(名前)" プロパティを、わかりやすい名前に変更することもできます。
"構成" プロパティで、参照ボタン ([...]) をクリックします。
[TestConditionName の構成] ダイアログ ボックスが表示されます。
テストするデータベースへの接続を指定します。 詳細については、方法:データベース接続の作成をご覧ください。
既定では、テストの Transact-SQL 本体が編集ウィンドウに表示されます。 必要に応じて、予期する結果を生成するようにコードを変更できます。 たとえば、テストに事前テストのコードがある場合、そのコードを追加することができます。
重要
以前にスキーマを指定した予期されるスキーマ条件を変更した場合、編集ウィンドウで加えた変更は保存されません。 これらの変更を再度行ってから [取得] をクリックする必要があります。[取得] をクリックします。
指定したデータベース接続に対して Transact-SQL が実行され、結果がダイアログ ボックスに表示されます。 ここでは、結果の値ではなく、結果セットのスキーマ (形状) を検証しているため、列が期待どおりに表示されていれば、返される結果内のデータを確認する必要はありません。
結果が予期していたテスト結果と一致する場合は、[OK] をクリックします。 それ以外の場合は、Transact-SQL 本体を変更し、結果が期待どおりになるまで手順 6、7、8 を繰り返します。
テスト条件の [値] 列には、予期されるスキーマに関する情報が表示されます。 たとえば、"2 個のテーブルが必要です" のように表示されます。
拡張可能なテスト条件
6 つの定義済みテスト条件に加えて、独自の新しいテスト条件を記述することもできます。 これらのテスト条件は、SQL Server 単体テスト デザイナーの [テスト条件] ウィンドウに表示されます。 詳細については、「SQL Server の単体テストのカスタム テスト条件」を参照してください。
参照
SQL Server の単体テストの作成と定義
SQL Server の単体テストでの Transact-SQL アサーションの使用
SQL Server の単体テストのスクリプト