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