2011-06-10 73 views
20

在Java項目中,JUnit測試執行安裝,測試和拆卸。即使在使用內存數據庫嘲笑真正的數據庫時,通常也會回滾事務或從內存中刪除數據庫,並在每次測試之間重新創建數據庫。由於一個測試不會在可能影響下一個測試的環境中留下工件,因此可以爲您提供測試隔離。每個測試都以已知的狀態開始,不能流入另一個測試。如何實現測試隔離測試Oracle PL/SQL?

現在我已經有了一個Oracle數據庫構建,可以創建1100個表和400K的代碼 - 很多pl/sql包。我想不僅測試數據庫安裝(完全 - 從頭開始​​創建,部分 - 從以前的數據庫升級等),並確保所有的表和其他對象處於安裝後我期望的狀態,但也是在pl/sql上運行測試(我不確定我會怎麼做前者 - 建議?)。

我想這一切都從詹金斯運行CI,以便通過迴歸測試捕捉開發錯誤。

首先,我必須使用企業版本而不是XE,因爲XE不支持Java SP和對Oracle Web Flow的依賴。即使我消除了這些依賴關係,構建通常需要1.5小時才能加載(完整構建)。

那麼如何在這種環境下實現測試隔離呢?爲每個測試使用交易並將其回滾?好的,那些提交它們的pl/sql程序呢?

我想過備份和恢復以在每次測試之後重置數據庫,或者在每次測試之間重新創建整個數據庫(過於劇烈)。兩者都不切實際,因爲它需要花費一個多小時才能安裝。這樣做每個測試是過度殺傷和瘋狂。

有沒有一種方法可以在數據庫模式中在沙中繪製一條線,然後將其滾回到該時間點? Sorta就像一個大的「撤消」功能。除了expdp/impdp或rman之外的東西。也許整個方法都關閉了。建議?其他人如何做到這一點?

對於CI或小型生產升級窗口,最終測試套件必須在合理的時間內運行(30分鐘將是理想的)。

是否有產品可能有助於實現這種「撤消」能力?

+0

你可以捕捉的DB(道路的克隆速度比好處exp/imp或rman),然後在克隆上運行測試。 (詢問您的系統管理員) – tbone 2011-06-14 15:29:54

回答

9

在Oracle中,您可以使用閃回技術將服務器恢復到某個時間點。

http://download.oracle.com/docs/cd/B28359_01/backup.111/b28270/rcmflash.htm

+1

閃回表是一項需要企業版許可證的功能:http://download.oracle.com/docs/cd/B28359_01/license.111/b28287/editions.htm#CJACGHEB所以它不是普遍適用的解決方案。此外,數據庫和/或表格必須配置爲支持閃回。 – APC 2011-06-11 16:28:42

11

凱文·麥科馬克發表在服務器實驗室博客關於使用Maven和Hudson PL/SQL持續集成測試的文章。 Check it out。測試組件的關鍵要素是Steven Feuerstein's utPlsql框架,它是PL/SQL中JUnit概念的實現。

需要重置我們的測試夾具是PL/SQL測試中的一個大問題。有幫助的一件事是觀察良好實踐並避免在存儲過程中進行提交:事務控制應僅限於調用堆棧的最外層部分。對於那些只需發出提交的程序(可能因爲它們執行DDL而隱含),總會有一個測試夾具發出DELETE語句。處理關係完整性使得編寫代碼非常棘手。

另一種方法是使用數據泵。您似乎放棄impdp,但Oracle也爲其提供了PL/SQL API,DBMS_DATAPUMP。我在這裏建議它,因爲它提供了在運行導入之前垃圾清除任何現有數據的功能。所以我們可以有一個導出的數據集作爲我們的測試夾具;執行SetUp是一個運行數據泵作業的問題。你不需要在TearDown中做任何事情,因爲整理開始時就會發生整理。

3

對於1100個表和400K的代碼,1.5個小時似乎很長時間。我顯然不知道你的環境的細節,但根據我的經驗,我敢打賭你可以縮短到5到10分鐘。下面是我見過的與Oracle的兩個主要安裝腳本問題:

1.操作被分解成小塊

你有更多的開銷將會有更多的步驟。例如,你要儘可能多地鞏固這樣的代碼:

替換:

create table x(a number, b number, c number); 
alter table x modify a not null; 
alter table x modify b not null; 
alter table x modify c not null; 

有了:

create table x(a number not null, b number not null, c number not null); 

替換:

insert into x values (1,2,3); 
insert into x values (4,5,6); 
insert into x values (7,8,9); 

有了:

insert into x 
select 1,2,3 from dual union all 
select 4,5,6 from dual union all 
select 7,8,9 from dual; 

如果您在不同位置運行腳本和數據庫,則尤其如此。當你乘以10,000時,這個微小的網絡延遲開始變得重要。我所知道的每一個Oracle SQL工具都會一次發送一條命令。

2.開發人員可以共享一個數據庫

這比一個技術性修復一個長期的過程解決方案,但你必須時刻啓動。大多數使用Oracle的地方只安裝在少數服務器上。然後它變成一個稀缺資源,必須小心管理。人們爭吵,角色不清楚,事情沒有得到解決。

如果這是您的環境,請立即停止每個筆記本電腦的瘋狂並安裝Oracle。花幾百美元給每個人個人版(與企業版具有相同的功能)。爲每個人提供他們需要的工具,持續的改善將最終解決您的問題。


此外,對於模式「撤消」,您可能希望查看可移動的表空間。我從來沒有使用它,但據說這是一個安裝系統更快的方式 - 只需複製和粘貼文件,而不是導入。類似地,也許某種類型的虛擬化可以提供幫助 - 創建操作系統和數據庫的快照。

0

雖然Oracle閃回是一個企業版的功能是基於在所有版本中提供,即Oracle日誌礦工的技術:

http://docs.oracle.com/cd/B28359_01/server.111/b28319/logminer.htm#i1016535

我很想知道是否有人用它來提供測試隔離功能測試,即查詢v $ LOGMNR_CONTENTS以從與測試開始相對應的時間點獲取UNDO語句列表。

數據庫需要在歸檔模式和在JUnit測試用例與

@Startup 

註釋將調用DBMS_LOGMNR.START_LOGMNR的方法。該測試將與

@Teardown 

註釋會查詢V $ LOGMNR_CONTENTS找到UNDO語句列表的方法運行,然後。這些將通過JDBC執行。事實上,UNDO語句的查詢和執行可以提取到PLSQL存儲過程中。必須考慮執行語句的順序。

我覺得這允許提交事務這是其中一個可怕的很多的bug可以在IE參照完整性蠕變,主鍵衝突等