データベース単体テストでの Transact-SQL アサーションの使用
データベース単体テストでは、Transact-SQL テスト スクリプトが実行され、結果が返されます。 結果は、結果セットとして返される場合もあります。テスト条件を使って結果を検証できます。 たとえば、テスト条件を使用すると、結果セットで返された行数を調べたり、テストの実行にかかった時間を調べたりできます。 テスト条件の詳細については、「データベース単体テストでのテスト条件の使用」を参照してください。
テスト条件を使用する代わりに、Transact-SQL アサーション (Transact-SQL スクリプトの RAISERROR ステートメント) を使用することもできます。 状況によっては、テスト条件の代わりに Transact-SQL アサーションを使用した方がよい場合があります。
Transact-SQL アサーションの使用
データの検証に Transact-SQL アサーションとテスト条件のどちらを使用するかを決めるときは、次の点を考慮してください。
パフォーマンス。 サーバーで Transact-SQL アサーションを実行すると、クライアント コンピューターにデータを移動してローカルで操作する場合よりも処理が高速です。
使い慣れた言語。 どの言語を現在使い慣れているかに応じて、Transact-SQL アサーションか C# または Visual Basic のテスト条件を選択できます。
複雑な検証。 場合によっては、より複雑なテスト検証を C# または Visual Basic でビルドし、クライアントでテストを検証できます。
レガシ検証ライブラリ。 検証を実行するコードが既にある場合は、テスト条件の代わりに既存のコードをデータベース単体テストで使用できます。
予期される例外が指定された単体テスト メソッドのマーク
予期される例外が指定されたデータベース単体テスト メソッドをマークするには、次の属性を追加します。
<ExpectedSqlException(MessageNumber=nnnnn, Severity=x, MatchFirstError=false, State=y)> _
[ExpectedSqlException(MessageNumber=nnnnn, Severity=x, MatchFirstError=false, State=y)]
各要素の意味は次のとおりです。
nnnnn は、予期されるメッセージの番号です。たとえば 14025 です。
x は、予期される例外の重大度です。
y は、予期される例外の状態です。
指定されていないパラメーターは無視されます。 これらのパラメーターは、データベース コードで RAISERROR ステートメントに渡されます。 MatchFirstError = true を設定すると、この属性は例外のどの SqlErrors にも一致します。 既定の動作 (MatchFirstError = true) は、最初に発生するエラーにしか一致しません。
予期される例外および否定的なデータベース単体テストの使用方法の例については、「チュートリアル : データベース単体テストの作成と実行」を参照してください。
RAISERROR ステートメント
Transact-SQL スクリプトで RAISERROR ステートメントを使用すると、サーバーで Transact-SQL アサーションを直接使用できます。 構文は次のとおりです。
**RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)**
それぞれの文字について以下に説明します。
@ErrorMessage は、ユーザー定義のエラー メッセージです。 このメッセージ文字列は、printf_s 関数に似た形式で書式指定できます。
@ErrorSeverity は、ユーザー定義の重大度レベル (0 ~ 18) です。
注意
重大度レベルの値が '0' および '10' の場合、データベース単体テストは失敗しません。 0 ~ 18 の範囲で別の値を使用すると、テストが失敗します。
@ErrorState は 1 ~ 127 の任意の整数です。 この整数を使用して、コード内の異なる場所で発生した同じエラーの複数の出現を区別できます。
詳細については、Microsoft Web サイトの SQL Server Books Online の「RAISERROR (Transact-SQL)」を参照してください。 データベース単体テストでの RAISERROR の使用例については、「方法 : 単一のトランザクションのスコープ内で実行されるデータベース単体テストを作成する」を参照してください。