pl/sqlのテスト

便利なパッケージとかを作るのはいいが、ちゃんとテストとかしなくちゃ使い物にならない。pl/sqlのユニットテストとかも無いわけではないが、簡単なものを作り、勉強しながら拡張させていった方が自分のタメになると思い。ちょっと書き始めた。

パッケージの仕様部はこんな感じ。

CREATE OR REPLACE PACKAGE tester IS
 /*===========================================================
 * Testerパッケージ
 *
 *==========================================================*/
 
     --テストタイトルをセット
     PROCEDURE SET_TEST( name IN varchar2 );
     --テストの実行
     PROCEDURE DO_TEST( msg IN varchar2, test IN BOOLEAN);
     --テスト結果表示
     PROCEDURE GET_RESULT;
 END tester;
 

最初は簡単にこんなもんからスタートでいいかと実装。

SET_TESTはテストの名前と初期化を行う。

-----------------------
 -- テストの設定
 ----------------------  
 PROCEDURE SET_TEST( name IN varchar2 ) IS
 BEGIN
     test_name := substrb(name, 1, 100);
     ArrayTest.DELETE;
 END;

ArrayTestというのは個別のテストの結果を格納するためのコレクション。

--======================================================--   
 test_name varchar2(100);

 TYPE test_rec_typ IS RECORD (
     t_comment   varchar2(100),
     t_status    boolean
 );
 TYPE ArrayTestTyp IS TABLE OF test_rec_typ;
 ArrayTest ArrayTestTyp;         --test内容格納配列
 --=======================================================--

SET_TESTでテスト名をセットしたら、後はDO_TESTを使ってテストしていく。DO_TESTはこんな感じ。

----------------------
 -- DO_TEST
 ----------------------
 PROCEDURE DO_TEST( msg IN varchar2, test IN BOOLEAN) IS
     one_test test_rec_typ;
 BEGIN
     -- テストレコードの作成
     one_test.t_comment := substrb(msg, 1, 100);
     one_test.t_status := NVL(test,FALSE);
     -- テスト配列へ追加
     ArrayTest.EXTEND;
     ArrayTest( ArrayTest.LAST ) := one_test;
 END;

テストしたい内容をDO_TESTへ投げたら、最後にGET_RESULTする。

-----------------------
 -- 結果の取得
 -----------------------
 PROCEDURE GET_RESULT IS
     ng_count NUMBER(5);
 BEGIN
     ng_count :=0;

     DBMS_OUTPUT.PUT_LINE( test_name );
     FOR i IN 1 .. ArrayTest.COUNT LOOP
         DBMS_OUTPUT.PUT( chr(9) || i || '. ');
         DBMS_OUTPUT.PUT( ArrayTest(i).t_comment );
         DBMS_OUTPUT.PUT( chr(9) || '..........' );
         IF ArrayTest(i).t_status = TRUE THEN
             DBMS_OUTPUT.PUT_LINE( 'ok' );
         ELSE
             DBMS_OUTPUT.PUT_LINE( 'ng' );
             ng_count := ng_count + 1;
         END IF;
     END LOOP;
 
     IF ng_count = 0 THEN
         DBMS_OUTPUT.PUT_LINE( '*** Total ' || ArrayTest.COUNT || ' Test Clear');     
     ELSE 
         DBMS_OUTPUT.PUT_LINE( '*** Total ' || ng_count || '/' || ArrayTest.COUNT || ' Test Failed !!');
         RAISE_APPLICATION_ERROR(-20000,'Tester STOP !!');     
     END IF;
 END;

ちょっと機能的にも簡単過ぎるかもしれない。

実行するためのテストスクリプトを書く。

DECLARE

BEGIN
     tester.set_test('Util package Test');

     -- 文字列split test
     utl.split('aaa bbb ccc',' ');
     tester.do_test('空白デリミタ',utl.get_split_value(3) = 'ccc');

     utl.split('123.5    bbb         ccc',' ');
     tester.do_test('連続するスペース区切り 1',utl.get_split_value(1) = '123.5');
     tester.do_test('連続するスペース区切り 2',utl.get_split_value(2) = 'bbb');
     tester.do_test('連続するスペース区切り 3',utl.get_split_value(3) = 'ccc');
     tester.do_test('存在しない要素番号指定',utl.get_split_value(4) is NULL);
     tester.do_test('split結果の要素数取得',utl.get_split_count = 3);

     tester.get_result;
END;
/

sqlplus でset serveroutput onしてこのスクリプトを実行してみる。

SQL> @test_util
Util package Test
 1. 空白デリミタ ..........ok
 2. 連続するスペース区切り 1    ..........ok
 3. 連続するスペース区切り 2    ..........ok
 4. 連続するスペース区切り 3    ..........ok
 5. 存在しない要素番号指定       ..........ok
 6. split結果の要素数取得        ..........ok
*** Total 6 Test Clear

PL/SQLプロシージャが正常に完了しました。

SQL>

機能的には不十分だが、スタートとしてはこんなところから始めよう。これでも無いよりはマシ。UnitTestの他の実装を見て必要機能を勉強しなくては・・・

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。