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」と表示されます。
各テストプロシージャで検証を行う方法ですがいくつか知っている範囲で記述します。
- 変数がnullであるかどうか
utp.utassert.isnull(‘タイトル’,変数); - 変数が期待値であるかどうか
utp.utassert.eq(‘タイトル’,変数,期待値); - 2つのテーブルが等しいかどうか
utp.utassert.eqtable(‘タイトル’,テーブルA,テーブルB); - 2つのクエリー結果が等しいかどうか
utp.utassert.eqquery(‘タイトル’,sql文,sql文); - 不明
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;
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント