常規(guī)方式保存測試信息
  創(chuàng)建相關(guān)數(shù)據(jù)表
  創(chuàng)建數(shù)據(jù)表TestInfoLog,和序列號SEQ_TestInfoLog
  參考當前目錄下的 TestInfoLog.sql ,運行這部分腳本。
  創(chuàng)建測試信息保存包
  創(chuàng)建一個測試信息保存的 Package
                                                                                              參考當前目錄下的 PKG_Test_Info.pck,編譯這個包。
  具體例子
  例子1
  在一個PL/SQL塊中使用測試包來保存測試信息,參考當前目錄下的 example1.sql
  -- 簡單使用的一個例子,結(jié)果查詢 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
  ---在存儲過程中保存測試信息,結(jié)果查詢 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 下實現(xiàn)的LOG框架。
  Log4plsql 是基于log4J 演化得來的。
  
  相關(guān)站點
  http://log4plsql.sourceforge.net/
  http://sourceforge.net/projects/log4plsql/
  Log4plsql來做測試。
  1.觸發(fā)器的測試信息保存
  1個觸發(fā)器的例子,在觸發(fā)器中記錄相關(guān)信息
  代碼位于當前文件所在目錄的 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.存儲過程中測試信息保存
  在存儲過程中進行日志操作,把相關(guān)存儲過城的參數(shù)信息記錄到日志數(shù)據(jù)表
  代碼位于當前文件所在目錄的 testAssert.sql
  create or replace procedure testAssert(p_Param1 int,p_Param2 varchar2)
  IS
  pCTX PLOG.LOG_CTX;
  BEGIN
  --假如 p_Param1<=1,那相關(guān)信息就將寫入日志
  PLOG.ASSERT(pCTX, p_Param1>1, 'p_Param1>1 always false');
  --假如 p_Param2<>'man',那相關(guān)信息就將寫入日志
  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.實現(xiàn)了樹型目錄的日志例子
  代碼位于當前文件所在目錄的 testAssert2.sql
  /**
  * <p> purpose:這是一個在存儲過程過程通過日志方式進行記錄測試信息的例子,實現(xiàn)了樹型目錄的日志記錄方式
  * </p>
  * <p> 
  * 使用方式
  * <LI>編譯該存儲過程</LI>
  * <LI>
  * 刪除TLOG表中的日志信息: delete from TLOG
  * </LI>
  * <LI>測試該存儲過程 
  * begin testassert2(10,'wdz123@hotmailcom');end;
  * </LI>
  * <LI>察看結(jié)果 select from tlog </LI>
  *</p>
  * @param p_Param1 是一個入口參數(shù) ,它的值將被記錄進入 日志中
  * @param p_Param2 是另外一個入口參數(shù) ,它的值將被記錄進入 日志中
  ***/
  create or replace procedure testAssert2(p_Param1 int, p_Param2 varchar2) IS
  v_CTX PLOG.LOG_CTX;
  v_Year varchar2(4);
  BEGIN
  ---設(shè)置日志信息的根結(jié)點名稱
  v_CTX := PLOG.init('測試信息');
  ---構(gòu)造樹型日志的第2級
  PLOG.setBeginSection(v_CTX, 'procedure_testAssert2_測試信息');
  PLOG.setBeginSection(v_CTX, '檢測入口參數(shù)');
  --假如 p_Param1<=1,那相關(guān)信息就將寫入日志
  PLOG.ASSERT(v_CTX, p_Param1 > 1, 'p_Param1>1 always false');
  --假如 p_Param2<>'man',那相關(guān)信息就將寫入日志
  PLOG.ASSERT(p_Param2 = 'man', 'p_Param2 <> man ');
  ---關(guān)閉樹型日志的第2級目錄
  PLOG.setEndSection(v_CTX, '檢測入口參數(shù)');
  
  ---下面是根據(jù)實際業(yè)務需要進行一序列處理
  null; ---這里是一些業(yè)務處理代碼
  ---end 相關(guān)實際業(yè)務處理
  
  ---檢查業(yè)務處理結(jié)果
  --構(gòu)造又一個2級樹型日志目錄
  PLOG.setBeginSection(v_CTX, '檢查業(yè)務處理結(jié)果');
  ---這里是根據(jù)實際需要,對相關(guān)處理結(jié)果的檢查代碼
  select to_char(sysdate, 'YYYY') into v_Year from dual;
  PLOG.assert(v_CTX,
  v_Year = '2003',
  '當前年份應該是=2003,實際是='  v_Year);
  ---end 這里是根據(jù)實際需要,對相關(guān)處理結(jié)果的檢查代碼 
  --關(guān)閉當前的樹型日志的第2級目錄
  PLOG.setEndSection(v_CTX, '檢查業(yè)務處理結(jié)果');
  PLOG.setEndSection(v_CTX, 'procedure_testAssert2_測試信息');
  END;
  
  
  
  
  Log4plsql的應用
  由于PLOG 提供了assert的處理,因此可以考慮在存儲過程和包中進行一些測試結(jié)果的檢查,根據(jù)需要把測試結(jié)果保存下來,對于一些基于算法的存儲過程的測試,可以考慮使用一些腳本來做一些自動化的回歸測試。
                         
  應用例子
  1.說明:
  這個例子可能不能應用起來(沒有相關(guān)的數(shù)據(jù)庫環(huán)境,缺少相應的包),但是可以open一些腳本出來,來說明相關(guān)的表達意思。假如是公司內(nèi)部,可以在福州項目數(shù)據(jù)庫下可以運行起來。
  2.參考文檔
  參考 帶申請的業(yè)主整合算法的測試,有申請,沒有產(chǎn)權(quán)閣樓,沒有產(chǎn)權(quán)分攤,不存在人口安置。
  相關(guān)存儲過程/包
  PKG_ConDebugInfo.Normal_OwnerReq_Recursive
  PLOG包
  相關(guān)文檔 
  參考《測試__帶申請的業(yè)主整合算法的測試.doc》
  測試數(shù)據(jù)的輸入,采用手工的方式輸入,根據(jù)需要也可以全部腳本生成。
  參考文檔《測試__帶申請的業(yè)主整合算法的測試.doc》列出的測試數(shù)據(jù)要求。
  測試數(shù)據(jù)的動態(tài)修改/生成,根據(jù)測試用例,動態(tài)改變/生成測試數(shù)據(jù)。
  參考 PKG_ConDebugInfo.Normal_Owner_UpdateData3
  測試結(jié)果的檢查
  參考 PKG_ConDebugInfo.Normal_Owner_Check_Data3
  擴展
  為了基于pl/sql的測試信息做的更好。可以從以下幾個方面來做。
  1.可以考慮自己去修改 Log4plsql提供的PLOG包,
  1.1修改數(shù)據(jù)表TLOG,增加一些字段保存其他信息(比如:可以保存客戶端ip)。
  修改存儲過程PLOG.addRow ,把相關(guān)信息保存到測試數(shù)據(jù)表。
  可以從后臺獲取一些運行環(huán)境信息,比如采取下面的類似方式獲取一些信息
  SYS_CONTEXT('USERENV','CURRENT_USER')
  SYS_CONTEXT('userenv', 'ip_address')
  1.2增加其他一些方法
  根據(jù)實際需要可以往PLOG包增加其他一些方法,比如日志的刪除之類的。
  最好還是另外包裝1層,象上面的Oracle包PKG_ConDebug一樣,定義1個包來做一些相關(guān)包裝。
  2.修改視圖 VLOG,按照具體要求來現(xiàn)顯示一些測試結(jié)果信息。
  例如:創(chuàng)建下面的視圖。
  create or replace view vlog2 as
  select 
  LUSER 數(shù)據(jù)庫用戶,
  plog.getLevelInText(llevel) as 測試信息等級,
  LSECTION 日志目錄,
  LTEXTE 錯誤信息,
  LDATE 產(chǎn)生錯誤時間
  from tlog a
  3.算法測試的自動化
  可以根據(jù)需要,增強上面Log4plsql的應用中關(guān)于測試數(shù)據(jù)的生成部分,并且做到據(jù)根據(jù)業(yè)務需要,測試測試數(shù)的生成可以帶有隨機性。或者按照要害用例為主來生成測試數(shù)據(jù)。