程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 關於Oracle存儲過程測試

關於Oracle存儲過程測試

編輯:Oracle數據庫基礎

常規方式保存測試信息

創建相關數據表

創建數據表TestInfoLog,和序列號SEQ_TestInfoLog

參考當前目錄下的 TestInfoLog.sql ,運行這部分腳本。

創建測試信息保存包

創建一個測試信息保存的 Package

參考當前目錄下的 PKG_Test_Info.pck,編譯這個包。

具體例子

例子1

在一個PL/SQL塊中使用測試包來保存測試信息,參考當前目錄下的 example1.sql

-- 簡單使用的一個例子,結果查詢

select * from TESTINFOLOG
  declare
  i integer :=1;
  begin
  PKG_Test_Info.clearAllLogInfo;
  PKG_Test_Info.setLogContext('匿名塊測試','無',1);
  PKG_Test_Info.logInfo('i=1');
  PKG_Test_Info.logInfo('當前日期='||To_char(sysdate,'yyyy-mm-dd'));
  end;

例子2

在一個存儲過程中保存測試信息

參考當前目錄下的Test_PKG_Test_Info.prc

---在存儲過程中保存測試信息,結果查詢 select * from TESTINFOLOG

  create or replace procedure Test_PKG_Test_Info(p_Param1 int,
  p_Param2 int,
  p_保存日志信息 int default 1) is
  begin
  if(p_保存日志信息)=1 then
  PKG_Test_Info.clearAllLogInfo;
  PKG_Test_Info.setLogContext('存儲過程測試', 'Test_PKG_Test_Info', 1);
  
  PKG_Test_Info.logInfo('p_Param1='||to_char(p_Param1)||',p_Param2='
  ||to_char(p_Param2));
  end if;
  end ;

卸載腳本

參考 uninsall.sql ,如果需要卸載運行這個腳本

其它的方式保存測試信息

Log4plsql的介紹

Log4plsql是一個open source的工具,是一個在Oralce PL/SQL 下實現的LOG框架。

Log4plsql 是基於log4J 演化得來的。

相關站點

http://log4plsql.sourceforge.Net/

http://sourceforge.Net/projects/log4plsql/

Log4plsql來做測試。

1.觸發器的測試信息保存

1個觸發器的例子,在觸發器中記錄相關信息

代碼位於當前文件所在目錄的 LOG_DML.sql

  CREATE OR REPLACE TRIGGER LOG_DML BEFORE
  INSERT OR UPDATE OR DELETE
  ON T_ESSAIS FOR EACH ROW
  BEGIN
  IF DELETING OR UPDATING THEN
  PLOG.INFO('T_ESSAIS:OLD:'||USER||':'||ld.data);
  END IF;
  IF INSERTING OR UPDATING THEN
  PLOG.INFO('T_ESSAIS:NEW:'||USER||':'||:new.data);
  END IF;
  end;

2.存儲過程中測試信息保存

在存儲過程中進行日志操作,把相關存儲過城的參數信息記錄到日志數據表

代碼位於當前文件所在目錄的 testAssert.sql

create or replace procedure testAssert(p_Param1 int,p_Param2 varchar2)

IS

pCTX PLOG.LOG_CTX;

BEGIN

--如果 p_Param1<=1,那相關信息就將寫入日志

PLOG.ASSERT(pCTX, p_Param1>1, 'p_Param1>1 always false');

--如果 p_Param2<>'man',那相關信息就將寫入日志

PLOG.ASSERT(p_Param2 = 'man', 'p_Param2<> man ');

PLOG.ASSERT(1 is null, '1 is null always false');

PLOG.ASSERT(NOT 1>1, 'NOT 1>1 never false');

PLOG.ASSERT(1>2, '1>2 always false', -20001,

pRaiseExceptionIfFALSE=>TRUE ,

pLogErrorReplaceError=>FALSE);

PLOG.ASSERT(1>3, 'Never test there is a raise in previous assert');

END;

3.實現了樹型目錄的日志例子

代碼位於當前文件所在目錄的 testAssert2.sql

  /**
  * <p> purpose:這是一個在存儲過程過程通過日志方式進行記錄測試信息的例子,實現了樹型目錄的日志記錄方式
  * </p>
  * <p>
  * 使用方式
  * <LI>編譯該存儲過程</LI>
  * <LI>
  * 刪除TLOG表中的日志信息: delete from TLOG
  * </LI>
  * <LI>測試該存儲過程
  * begin testassert2(10,'wdz123@hotmailcom');end;
  * </LI>
  * <LI>察看結果 select from tlog </LI>
  *</p>
  * @param p_Param1 是一個入口參數 ,它的值將被記錄進入 日志中
  * @param p_Param2 是另外一個入口參數 ,它的值將被記錄進入 日志中
  ***/
  create or replace procedure testAssert2(p_Param1 int, p_Param2 varchar2) IS
  v_CTX PLOG.LOG_CTX;
  v_Year varchar2(4);
  BEGIN

---設置日志信息的根結點名稱

v_CTX := PLOG.init('測試信息');

---構造樹型日志的第2級

PLOG.setBeginSection(v_CTX, 'procedure_testAssert2_測試信息');

PLOG.setBeginSection(v_CTX, '檢測入口參數');

--如果 p_Param1<=1,那相關信息就將寫入日志

PLOG.ASSERT(v_CTX, p_Param1 > 1, 'p_Param1>1 always false');

--如果 p_Param2<>'man',那相關信息就將寫入日志

PLOG.ASSERT(p_Param2 = 'man', 'p_Param2 <> man ');

---關閉樹型日志的第2級目錄

PLOG.setEndSection(v_CTX, '檢測入口參數');

---下面是根據實際業務需要進行一序列處理

null; ---這裡是一些業務處理代碼

---end 相關實際業務處理

---檢查業務處理結果

--構造又一個2級樹型日志目錄

PLOG.setBeginSection(v_CTX, '檢查業務處理結果');

---這裡是根據實際需要,對相關處理結果的檢查代碼

  select to_char(sysdate, 'YYYY') into v_Year from dual;
  PLOG.assert(v_CTX,
  v_Year = '2003',

'當前年份應該是=2003,實際是=' || v_Year);

---end 這裡是根據實際需要,對相關處理結果的檢查代碼

--關閉當前的樹型日志的第2級目錄

  PLOG.setEndSection(v_CTX, '檢查業務處理結果');
  PLOG.setEndSection(v_CTX, 'procedure_testAssert2_測試信息');
  END;

Log4plsql的應用

由於PLOG 提供了assert的處理,因此可以考慮在存儲過程和包中進行一些測試結果的檢查,根據需要把測試結果保存下來,對於一些基於算法的存儲過程的測試,可以考慮使用一些腳本來做一些自動化的回歸測試。

應用例子

1.說明:

這個例子可能不能應用起來(沒有相關的數據庫環境,缺少相應的包),但是可以open一些腳本出來,來說明相關的表達意思。如果是公司內部,可以在福州項目數據庫下可以運行起來。

2.參考文檔

參考 帶申請的業主整合算法的測試,有申請,沒有產權閣樓,沒有產權分攤,不存在人口安置。

相關存儲過程/包

PKG_ConDebugInfo.Normal_OwnerReq_Recursive

PLOG包

相關文檔

參考《測試__帶申請的業主整合算法的測試.doc》

測試數據的輸入,采用手工的方式輸入,根據需要也可以全部腳本生成。

參考文檔《測試__帶申請的業主整合算法的測試.doc》列出的測試數據要求。

測試數據的動態修改/生成,根據測試用例,動態改變/生成測試數據。

參考 PKG_ConDebugInfo.Normal_Owner_UpdateData3

測試結果的檢查

參考 PKG_ConDebugInfo.Normal_Owner_Check_Data3

擴展

為了基於pl/sql的測試信息做的更好。可以從以下幾個方面來做。

1.可以考慮自己去修改 Log4plsql提供的PLOG包,

1.1修改數據表TLOG,增加一些字段保存其他信息(比如:可以保存客戶端IP)。

修改存儲過程PLOG.addRow ,把相關信息保存到測試數據表。

可以從後台獲取一些運行環境信息,比如采取下面的類似方式獲取一些信息

SYS_CONTEXT('USERENV','CURRENT_USER')

SYS_CONTEXT('userenv', 'ip_address')

1.2增加其他一些方法

根據實際需要可以往PLOG包增加其他一些方法,比如日志的刪除之類的。

最好還是另外包裝1層,象上面的Oracle包PKG_ConDebug一樣,定義1個包來做一些相關包裝。

2.修改視圖 VLOG,按照具體要求來現顯示一些測試結果信息。

例如:創建下面的視圖。

  create or replace vIEw vlog2 as
  select
  LUSER 數據庫用戶,
  plog.getLevelInText(llevel) as 測試信息等級,
  LSECTION 日志目錄,
  LTEXTE 錯誤信息,
  LDATE 產生錯誤時間
  from tlog a

3.算法測試的自動化

可以根據需要,增強上面Log4plsql的應用中關於測試數據的生成部分,並且做到據根據業務需要,測試測試數的生成可以帶有隨機性。或者按照關鍵用例為主來生成測試數據。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved