utPLSQLの使い方

PLSQLのテストを自動化してくれるのがutPLSQLです。

環境設定が必要ですがその辺はわかりません。

utPLSQLの使い方は「ut_」で始まるパッケージ、パッケージボディを作成します。例えばut_TESTPROCEDUREなどにします。

パッケージ部にut_setup,ut_teardownを宣言する必要があります。

ut_setupは、複数あるテストプロシージャの一番先頭で1回だけ実行されます。

反対にut_teardownは、テストプロシージャの最後に1回だけ実行されます。

パッケージの作成例です。

CREATE OR REPLACE PACKAGE ut_TESTPROCEDURE IS
BEGIN
  PROCEDURE ut_setup;-- 最初に一度実行
  PROCEDURE ut_teardown; -- 最後に一度実行

  -- テスト
  PROCEDURE ut_test01;
  PROCEDURE ut_test02;
END;

テストは各プロシージャで行いますが、パッケージ部に記述しているプロシージャのみテストが実行されます。

ボディ部に書いていても、パッケージ部に記述していないプロシージャはテストされません。

そのため、一時的にテストしたくない場合はパッケージ部のプロシージャ宣言をコメントアウトします。

作成したutPLSQLを実行する方法ですが、sql*plusで実行する場合、以下のように実行します。

set serveroutput on
exec utp.utplsql.test('TESTPROCEDURE',recompile_in=>FALSE)

第一引数はパッケージ名の「ut_」を除いた部分を指定します。第二引数はリコンパイルしないようにFALSEとしています。

テストに成功した場合、「SUCCESS」と表示され、失敗した場合「FAILURE」と表示されます。

各テストプロシージャで検証を行う方法ですがいくつか知っている範囲で記述します。

  1. 変数がnullであるかどうか
    utp.utassert.isnull(‘タイトル’,変数);
  2. 変数が期待値であるかどうか
    utp.utassert.eq(‘タイトル’,変数,期待値);
  3. 2つのテーブルが等しいかどうか
    utp.utassert.eqtable(‘タイトル’,テーブルA,テーブルB);
  4. 2つのクエリー結果が等しいかどうか
    utp.utassert.eqquery(‘タイトル’,sql文,sql文);
  5. 不明
    utp.utassert.this

上記を使用してテストをします。

eqtableとeqqueryは同じように思いますが、eqtableで更新日付や登録日付などがあると2つのテーブルを比較しても時間が異なるためエラーとなります。

そういった場合にeqqueryを使用してsql文を記述し、更新日付や登録日付を抜いたsql文を記述すれば、データの比較が行えます。

パッケージボディの例です。

CREATE OR REPLACE PACKAGE BODY ut_TESTPROCEDURE IS

PROCEDURE ut_setup IS
BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE TMP$EMPLOYEE AS SELECT * FROM EMPLOYEE';
END;

PROCEDURE ut_teardown IS
BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE TMP$EMPLOYEE';
END;

-- テストプロシージャ
PROCEDURE test01 IS
BEGIN
  INSERT ALL
    INTO EMPLOYEE ~
  SELECT * FROM DUAL;

  INSERT ALL
    INTO TMP$EMPLOYEE ~
  SELECT * FROM DUAL;

  -- プロシージャテスト
  パッケージ.プロシージャ('10','20',errCd,errMsg,ret);

  -- 検証
  utp.utassert.eq(ret,0);
  utp.utassert.isnull(errCd);
  utp.utassert.isnull(errMsg);
  utp.utassert.eqtable('テーブル同一チェック',EMPLOYEE,TMP$EMPLOYEE);
END;

スポンサーリンク
  • このエントリーをはてなブックマークに追加
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA