データベースのテスト。 開発者バージョン

私はデータベースプログラミングに数年携わってきましたが、多くの人がデータベース自体に実装されている機能をテストするのがどれほど難しいかを知っています。 このようなタスクには、テスターがSQLの知識だけでなく、場合によっては、テストされた機能の複雑さを理解する必要があります。 また、開発者は常にソリューションを詳細に説明しようとするわけではありません。

データベースロジックが現在どのようにテストされているかが興味深くなりました。 当時、インターネットでの検索が失敗したことは驚くことではないと思います。 忍耐力の欠如、または「同じ、しかし彼自身の、異なる」ことをしたいという欲求のため。 そして、使用可能なオプションは、使用の複雑さのために適合しませんでした。 たとえば、単体テストのあるclrアセンブリがありました。 後でHP QTPについて学びました。

そして、このアクティビティにより、ベースをテストするためのEclipseプラグインに組み込まれたテストコンストラクターが作成されました。 この記事では、デザイナーとの共同作業の基本について説明します。

理論は必要ない、すぐに結果が欲しい!

理論


このアルゴリズムは、次の原則に基づいています。


そして、テスターとして、どのようにテストを作成したいと思いますか:

  1. 簡単なスクリプトを 1回作成し、名前を付け、パラメーターを設定し、再利用のために保存したいと思います。 そして、プログラム自体にスクリプトテキストからパラメータを見つけさせます。 そして、データタイプと方向を尋ねます。入力はパラメーターまたは出力です。
  2. 複数のスクリプトを1つのコンポーネントに結合したいと思います 。 データベースにレコードを置き、処理されるのを待って、この処理の結果を取得する必要があるとします。 コンポーネントは、テストを作成するための基本的な論理ユニットです。
  3. そして、コンポーネントをテスト自体に結合します。 これまたはそのビジネスオペレーションをチェックするもの。

まあ、それは明らかです。 そしてチェックはどこにありますか? 結局のところ、テスト結果は期待される結果と実際の結果の比較です。 したがって、 コンポーネントテストの両方に、パラメーターのコンテキスト (詳細および以下の例)が保存され、これが期待値であるか参照値であるかが示されます。 この場合、パラメーターは同じ名前でなければなりません。 また、コンポーネントまたはテストの動作中にそのようなパラメーターの値が変化した場合、これらの値の等価性または不等価性をチェックする必要があります。 テストが失敗すると、テスト全体が失敗します。

それの由来


  1. インストールとセットアップ
  2. プロジェクト作成
  3. スクリプト作成
  4. スクリプトをコンポーネントに結合する
  5. コンポーネントからテストを作成する

インストールとセットアップ


プラグインはMS SQL Serverで動作します。

  1. 記事の最後にあるEclipseプラグインとソースへのリンク。 プラグインを入れます
  2. 空のデータベースを作成し、そのリポジトリ(データベース\ script.sql)からスクリプトを実行します
  3. 設定に2つのベースを設定します-テストの保存とテストの実行(Window \ Preferences \ SQL Test Settings)

データベースのセットアップ


プロジェクト作成


ファイル->新規->テスト-> SQLテストプロジェクト


設定済みのベースを選択し、パスワードを設定します。 完了したら、「入力したパラメーターを確認する」をクリックします。 チェックが成功すると、[完了]ボタンが使用可能になります。 クリックして、プロジェクトの作成を完了します。



デフォルトでは、目的のビューは開きません。手で実行してください。ウィンドウ->ビューの表示->その他-> SQL Test Project Explorer。 作成されたプロジェクトは次の形式で表示されます。



スクリプト作成


順序については、「スクリプト」セクションのコンテキストメニューを使用して、「サンプル」フォルダーを作成します。このフォルダーにサンプルが配置されます。 そして、「Example」フォルダのコンテキストメニューから「Get server time」というスクリプトを作成します。これにより、サーバーの日付と時刻が返されます。 「例」フォルダーを開き、ダブルクリックしてスクリプトを開きます。 このスクリプトテキストを入力し、[パラメーターの検索]ボタンをクリックします。

SELECT GETDATE() AS [:NOW] 

パラメーターは、署名paramによって検出されます。 また、スクリプトから値を取得するには、列名-パラメーター名[:param]の DataSetを返す必要があります。

DATEタイプと「出力」方向を選択します。 スクリプトを保存し、「実行」ボタンの隣で待機します。 「テスト値」列に結果が表示されます。

ウィンドウ内のスクリプト


これは簡単な例です。 それでは、タスクを複雑にしましょう。 テストで5秒間待機してから、正確に5秒間実行したことを確認する必要があります。 これはかなり人工的な作業ですが、可能性を理解するだけです。

問題を解決するには、いくつかのスクリプトを作成し、それらを組み合わせてコンポーネントにする必要があります。 これらのスクリプトは次のとおりです。

  1. 参照間隔を5秒に設定します
  2. サーバー時間を取得する#1
  3. 5秒待ちます
  4. サーバー時間を取得する#2
  5. 時間を比較し、差が5秒であることを確認します

(2)および(4)の手順については、既にスクリプトがあります。 (3)最後の1つを最も困難なものとして残しましょう。 単純なWAITFOR DELAYは使用しません。これは、一定の間隔ではなく、いつでも完了できる長期的な操作である可能性があるためです。

(1)非常にシンプルに見えるかもしれません。 唯一の出力パラメーター、INTEGERと入力します。

 SELECT 5 as [:interval] 

(5)も難しくありません。 最初の2つのパラメーターが入力されます。DATEと入力します。 3番目はINTEGERなどの出力です。

 SELECT DATEDIFF(SECOND, :from, :to) as [:interval] 

これで、スクリプトの順番(3)になります。タスクは、すばやく解決し、条件が満たされているかどうかを確認して、さらに先に進むか、少し後に実行を繰り返すことです。

 SELECT 1 as [:ret] WHERE DATEDIFF(SECOND, :from, GETDATE()) >= :interval 

このスクリプトは、from:から現在の瞬間までの秒数が「interval」パラメーター以上の場合、「 ret 」に1を返し、それ以外の場合は何も返しません。 これがチェック対象です。

スクリプトタイプ「イベント」を選択し、「パラメータ」ドロップダウンリストで「ret」を選択し、「パラメータ値」フィールドに1を入力します。 プログラムは、「ret」が1になるまで、このタイプのスクリプトを実行します。再起動は、完了後100msで行われます。

スクリプト:タイムアウトの完了を待っています


そこで、作成されたスクリプトをコンポーネントに統合しました。コンポーネントでは、期待される間隔と実際の間隔が等しいかどうかのチェックが実行されます。

スクリプトをコンポーネントに結合する


スクリプトの作成と同様に、「チェック間隔」コンポーネントを作成して開きます。 スクリプトのリスト(プロジェクトエクスプローラー)からマウスを使用して、新しく作成したスクリプトをコンポーネントウィンドウの[スクリプト]領域にドラッグします。 不要なものを転送した場合は、マウスでクリックして、[削除]ボタンをクリックします。 次のスクリプトシーケンスを取得しました。

  1. 基準間隔を設定
  2. サーバー時間を取得する
  3. タイムアウトが完了するまで待ちます
  4. サーバー時間を取得する
  5. 時差を取得する

オープンコンポーネントの[パラメータ]セクションで、4つの新しいパラメータを追加します。
パラメータコンテキスト解説
間隔標準期待値。 (1)スクリプトから取得されます
間隔テスト実際の値。 (5)スクリプトから取得されます
始めるローカルテスト開始時間。 (2)スクリプトから取得されます
終わりローカルテスト完了時間。 (4)スクリプトから取得されます

コンポーネントのパラメーターと転送されたスクリプトとの対応を設定する必要があります。 これを行うには、スクリプトのリストで最初のスクリプト「参照間隔の設定」をクリックします。 [スクリプトパラメーター]テーブルで、[間隔]パラメーターを選択し、マウスのコンテキストメニューから、コンポーネントパラメーターとの接続を設定します:標準\間隔。

スクリプトとコンポーネントのパラメーターをバインドします


同様に、残りのスクリプトへのリンクを確立します
パラメータに接続されているもの
サーバー時間を取得する
いま[ローカル]開始
タイムアウトが完了するまで待ちます
retスキップ
から[ローカル]開始
間隔[参考]間隔
サーバー時間を取得する
いま[ローカル]終了
時差を取得する
から[ローカル]開始
[ローカル]終了
間隔[テスト]間隔
コンポーネントを保存します。 私はそのような結果を得ました。
コンポーネントの最終ビュー


プログラムは起動前にデータベースからコンポーネントをロードするため、起動する前にコンポーネントを保存する必要があります。 コンポーネントウィンドウの[実行]ボタンをクリックします。 以前に開かれていなかった場合、テスト結果で新しいウィンドウが開きます。

試験結果


この結果では、コンポーネントの操作に関するすべてのデータが表示されます。どのスクリプトが実行されたか、どのデータが出力に出入りしたかが表示されます。 パラメーターの比較があった場合は、この場合のように、それも表示されます。

テストを「中断」して、それがどのように表示されるかを見てみましょう。 「時間差を取得する」スクリプトを

 SELECT DATEDIFF(SECOND, :from, :to) + 1 as [:interval] 

必要以上に1を返します。 スクリプトを保存して、コンポーネントを再度実行します。

コンポーネント結果


適切な器用さで詳細を開くと、エラーの場所さえ見つけることができます。



「Get the time difference。」というリクエストの正しい値を返すことを忘れないでください。

パラメータコンテキスト
役職価値
グローバルグローバルスコープ。 このコンテキストを持つコンポーネント変数は、テストなどでコンポーネントの外部からもアクセスできます。 コンポーネントをデバッグするとき、そのような変数では、「パラメータ」テーブルの「テスト値」列に値を設定できます
ローカルローカル変数 コンポーネントの外側には見えません
テストテスト値。 グローバルに類似
標準基準値。 グローバルに類似


コンポーネントからテストを作成する


テストは、スクリプトのコンポーネントと同じ方法でコンポーネントから構築されます。 したがって、詳細には説明しません。 「チェック間隔」テストを行い、「チェック間隔」コンポーネントを2回ドラッグします。 テストを保存して実行します。

試験結果
期待される結果:



おわりに


この記事では、テストベースの最も単純な人工的なシナリオについて説明します。 ただし、データベースにデータを保存し、処理を待機し、それを標準と比較して結果を取得する必要がある実際のシナリオでは、複雑なことはありません。 そのような非常に特定の領域でテストを作成および実行するときに、手作業のルーチンを削除することが可能かどうか疑問に思っていました。 この問題は部分的に解決されたと思います。 そして私にとっては、JavaおよびEclipseプラグインの開発を模索した経験でした。 これと別の自転車をユニバーサルバイクパークに置いてみましょう。

参照資料


GoogleDrive:Eclipseのプラグイン(Eclipse 4.5でテスト済み)
GitHubプラグインプロジェクト

Source: https://habr.com/ru/post/J278841/


All Articles