您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > DBunit
用DbUnit和Anthill控制測試環(huán)境
作者:網(wǎng)絡轉(zhuǎn)載 發(fā)布時間:[ 2013/1/23 14:02:45 ] 推薦標簽:

極限編程方法的興起將測試驅(qū)動開發(fā)和持續(xù)集成帶入了主流 Java 開發(fā)實踐。如果沒有采用正確的工具,在 Java 服務器端開發(fā)中使用這些技術很快會成為一場噩夢。在本文中,軟件開發(fā)人員 Philippe Girolami 描述了如何處理持續(xù)集成,以及如何聯(lián)合使用 DbUnit 和 JUnit,以便在每次測試之前通過設置數(shù)據(jù)庫狀態(tài)來端到端地控制測試環(huán)境。

軟件開發(fā)中重要的一種做法是測試。通過推薦測試優(yōu)先的開發(fā)和持續(xù)集成,極限編程(Extreme Programming,XP)將這一邏輯推到了極限,在這里測試是盡可能頻繁地自動進行的。不過,大多數(shù)非 XP 開發(fā)都進行了某種形式的測試,也許稱為非回歸測試、黑箱測試、功能測試或者其他的名字。很多項目使用關系數(shù)據(jù)庫存儲數(shù)據(jù),因而所有測試策略都需要考慮在每次測試過程中數(shù)據(jù)庫中所發(fā)生的事情:如果測試使測試數(shù)據(jù)庫處于不一致狀態(tài),那么后面的所有測試都可能失!一種避免這種情況的方法是在每次測試之前將數(shù)據(jù)庫狀態(tài)設為一個已知的相關狀態(tài)。在本文中,我將介紹我們的小組是如何結(jié)合 JUnit 使用 DbUnit 做到這一點的,以及如何用 Anthill 自動生成測試報告。盡管設置看起來很費功夫,但是實際上并不是這樣,并且它已經(jīng)證明自己是一個有用的工具。

表示數(shù)據(jù)庫內(nèi)容


DbUnit 擴展了 JUnit,它使數(shù)據(jù)庫在測試之間處于一種已知狀態(tài),幫助避免造成后面的測試失敗或者給出錯誤結(jié)果的問題,如果測試會破壞數(shù)據(jù)庫會出現(xiàn)這些問題。它可以讀取表的內(nèi)容并用 FlatXmlDataSet 將它在存儲為 XML,如清單 1 所示:
清單 1. FlatXmlDataSet 示例

<dataset>  <OPERATOR       ID='APC (Washington/Baltimore)'       CODE='ABC5APC'      ENCODED_STRING='aabbclearcase/" target="_blank" >cc'/>  <OPERATOR       ID='ASA Ritabell'      CODE='ABC6ASA R'      ENCODED_STRING='bbccdd'/>  <OPERATOR       ID='Advanced Info. Service PLC'       CODE='ABC1Adva'       ENCODED_STRING='ccddee'/>  <OPE_OPERATOR       ID='Aerial Communications Inc.'       CODE='ABC2Aeri'       ENCODED_STRING='ddeeff'/></dataset>                 


這個數(shù)據(jù)集表示名為 OPE_OPERATOR 的數(shù)據(jù)庫表中的三列,如表 1 中后三行所描述的:

表 1.中數(shù)據(jù)的表定義

 

OPE_OPERATOR
ID INT
CODE VARCHAR
ENCODED_STRING VARCHAR

每個 XML 實體標識數(shù)據(jù)庫中的一個表,而每個屬性表示一列的值。

在自己的項目中設置 DbUnit

設置 DbUnit 很簡單。有關項目文件下載的信息,請參閱 參考資料的內(nèi)容。可以將所有三個 JAR 文件加到項目的編譯目標中以進行測試。

如果是一個多 schema 環(huán)境,那么要將 DbUnit.qualified.table.names 屬性設置為 true 。使用 Oracle 的開發(fā)團隊通常是這種情況:每一個用戶有自己的 schema。這可以使您免于在每個表名前面加上 schema 名稱的前綴,并可以在團隊中共享測試數(shù)據(jù)。

DbUnit 使您可以容易地執(zhí)行 JDBC 查詢并獲取它們的值。使用 DbUnit JDBC 包裝器而不是純粹的 JDBC 有幾個理由:

    可以用 SQL 查詢創(chuàng)建一個 Dataset ,并使用 DbUnit 的 assertion(斷言)方法(在后面描述)。

    可以用 SQL 查詢創(chuàng)建一個 Dataset ,并將它保存為一個 FlatXmlDataSet ?梢栽谝院髮⑺匦卵b載到數(shù)據(jù)庫中。

    可以容易地從任何行中獲取列的內(nèi)容,無需進行迭代。

 首先檢查行計數(shù)是否為 1,然后檢查第一行(從 0 開始計)中, FK_OTHER_ID 列包含數(shù)字 1234。

使用 assert 方法檢查數(shù)據(jù)庫內(nèi)容

DbUnit 有斷言方法,可以用于比較表的兩組數(shù)據(jù)或者表的兩個表示。如果需要在運行一次測試而不是多次查詢后檢查表的確切內(nèi)容,一般會用它們。

創(chuàng)建數(shù)據(jù)

根據(jù)數(shù)據(jù)庫的大小、架構(gòu)的穩(wěn)定性如何以及開發(fā)的進展情況,可能要從頭開始創(chuàng)建或者從生產(chǎn)數(shù)據(jù)庫中拷貝測試數(shù)據(jù)。

如果導出一個完整的生產(chǎn)數(shù)據(jù)庫,可能必須要刪除過多的行--或者像在這里一樣,用一個查詢而不是直接用連接創(chuàng)建一個數(shù)據(jù)集。提取本身對于很大的表來說可能是個問題--我們的小組只能用查詢提取某些表的一部分。從表中刪除行也有些問題,主要涉及到瀏覽所有外鍵并保證數(shù)據(jù)的一致性的困難。

添加測試數(shù)據(jù)

添加測試數(shù)據(jù)有時可能乏味的。我們的經(jīng)驗是度過正確添加數(shù)據(jù)的初困難階段后,可以達到這樣一個層次,不僅添加數(shù)據(jù)變得容易了,而且對數(shù)據(jù)庫結(jié)構(gòu)的理解也有了極大提高。

即使使用 Enterprise JavaBeans (EJB) 技術隱藏數(shù)據(jù)庫,這種第一手知識仍然非常有用。因為開發(fā)人員對數(shù)據(jù)庫有了更好的理解,因而可以更快地檢查其內(nèi)容,從而使調(diào)試更容易了。這在重構(gòu)代碼和數(shù)據(jù)庫時又會給予我們極大的幫助。

用 DbUnit 和 JUnit 創(chuàng)建基類

好的 JUnit 實踐鼓勵開發(fā)人員擴展基類 TestCase 以獲得特化(specialization)行為。DbUnit 提供了自己的特化-- DatabaseTestCase ,通過它可以特化行為以滿足自己的需要。

首先,創(chuàng)建一個名為 ProjectDatabaseTestCase 的基本測試用例,并向它添加實用工具方法,然后,重新定義 setUp() 和 teardown() ,以使它們能夠創(chuàng)建和銷毀通過 DbUnit 到數(shù)據(jù)庫的連接。

上一頁12下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd