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

    沒有顯示 getJDBCConnection() 方法,因為它的實現取決于希望如何獲得 JDBC 連接:當 DataSource 為 Serializable 時通過應用服務器的 JNDI 樹,或者直接使用 JDBC。

    getDbUnitConnection() 方法返回 DbUnit 的一個到數據庫的連接。DbUnit 的 DatabaseConnection 構造函數可以帶一個 schema 名作為參數。這樣,不必在所有表名前面加上 schema 名的前綴了。

    getFlatXmlDataSet() 方法用位于類路徑上的一個 XML 文件的內容創(chuàng)建 DbUnit 數據集。

后,該實際將數據插入測試表中。DbUnit 可以有不同的數據庫操作,我使用了其中的兩種:

    DELETE_ALL ,它刪除表中所有行。
    CLEAN_INSERT ,它刪除表中所有行并插入數據集提供的行。

ProjectDatabaseTestCase 中的下面四個方法可以滿足您的需要:

    insertFileIntoDb() :在數據庫中插入文件。
    emptyTable() :清理數據庫表。
    insertAllFilesIntoDb() :插入項目的所有文件。
    emptyAllTables() :清理項目的所有表。

完成了基類后,用 DbUnit 干凈地建立數據庫,執(zhí)行一個方法,并檢查返回值是很容易的事。

在這個測試中,我清空了數據庫,插入一個表的內容,并通過檢查它返回的元素是否有正確的屬性來檢查用主鍵查找產品的 finder 方法是否正常工作。然后測試對象創(chuàng)建工作,并用 DbUnit 的查詢程序驗證數據庫的內容。

需要注意的一件重要事情是,清理數據庫是在建立測試而不是結束時進行的。我不想依賴于每次測試都干凈地結束。

在插入數據時要關注的事情


數據庫完整性約束迫使您以給定的順序插入或者刪除數據。在編寫 insertAllFiles() 和 emptyAllTables() 方法時,您會發(fā)現順序并非是隨意的,事實上它是由完整性約束所限定的。

另一個潛在的陷井是,一些列可能看來沒有插入。幾乎總是會出現這種情況,因為在 FlatXmlDataSet 中的第一行缺少一列?磥 DbUnit 不能識別所有其他行中的這一列。

總是要保證第一行描述包含表中的所有列。如果需要插入一個 NULL 值,要使這一行成為第二行。

組織測試數據

DbUnit 可以在文件中存儲 XML 數據集。它甚至允許在一個文件中存儲整個數據庫。

決定如何存儲測試數據很重要。是將每一個表的內容存儲到單獨的文件中,還是將與系統(tǒng)主要實體有關的所有表的所有行存儲到一個文件中?它們都不是完美的解決方案(silver bullet)。

對于第一種情況,保證跨表的數據一致更困難,但是用一個已經存在的數據庫創(chuàng)建查詢更容易。在第二種情況下,為每一個測試創(chuàng)建測試集更容易,但是事實上大多數系統(tǒng)不是圍繞一個主要實體設計的,因此這使它不那么實用。我們的方法是每個表有一個文件。

 
用 Anthill 實現持續(xù)集成

Anthill 是一個免費的自動構建工具(請參閱 參考資料),它規(guī)劃您的構建并發(fā)布結果,幫助精通 XP 的小組使用持續(xù)集成。一次構建包含用 CVS 這樣的版本控制工具檢查源代碼、運行一個構建腳本、發(fā)布結果并通知用戶結果。它很好地與 ANT 集成,使您可以重用常用的構建腳本。

在 Anthill 中運行測試包并報告結果


XP 專家一直建議將持續(xù)集成作為確保減少集成錯誤一種方式:通過以足夠高的頻率集成所有代碼,保證容易追溯到源代碼中的問題。集成可能是非常耗時的任務--檢查、構建和部署代碼,然后運行驗收試驗。幸運的是,其中大多數可以用 Anthill 或者 CruiseControl 這樣的工具自動化。如果還沒有使構建過程自動化(例如用 Ant),那您應當這樣做。如果構建過程是自動化的,應當在構建中加入一個測試部分。如果您是頑固的 XP 用戶,這些應當是您的驗收測試。如果您像我們一樣,那么這些是您要編寫的所有測試--不管是單元、驗收或者其他測試。

我們的構建過程基于 Ant 并計劃使用 Anthill。我們的主要挑戰(zhàn)是讓 Anthill 報告失敗的測試并且仍然發(fā)布測試結果。Anthill 捕獲的是:如果構建腳本失敗,不執(zhí)行發(fā)布腳本,在這種情況下不能將測試報告提供給開發(fā)人員。我們的方法是讓 Anthill 檢查屬性為 true 還是 false,而使它在發(fā)布腳本的后才失敗。

運行測試的目標


下面是關于運行測試的簡要總結。我們使用的是批量化的方法,但是任何方法都可以工作。要點有:

    測試必須具有分支,以便在類路徑包含 JDK 1.3 中的 XML 解析器時可以正常工作。
    如果出現錯誤或者失敗,則 testsuite.error 和 testsuite.failure 屬性必須設置為 true。如果沒有錯誤或者失敗的話,則不改變它們。

一個需要了解的重要的 Ant 技巧是,Ant 只在屬性沒有值時才設置屬性的值。所以在依次運行每一個測試時, testsuite.error 和 testsuite.failure 屬性只有當出現錯誤或者失敗時才會是 true。

這里的困難是向主 Ant 腳本報告測試腳本的結果。不幸的是,這并不是一項簡單的任務,因為在 Anthill 的過程中有兩個不同的 Ant 構建文件,在 Ant 中不能在構建腳本之間傳遞這種參數。不過,有一個“簡單”的解決方案:將測試的結果保存到文件中,之后發(fā)布腳本讀取這個文件。

使用這種 Ant 技巧,它顯示了如何使用 <property> 命令保證 testsuite.error 和 testsuite.failure 屬性在測試腳本結束時總是有一個值,以及如何將它保存為文件。

如果測試失敗,使發(fā)布腳本在結束時失敗。

結束語

我們的小組成功地在 2003 年初引入了 DbUnit 和 Anthill。從那以后,我們編寫并自動化了上千次測試--其中 75% 涉及設置數據庫狀態(tài)。我們每小時運行一次測試,并計劃很快以更短的周期運行它們。它們捕獲了很多未預料到的缺陷,這使它們成為不可缺少的工具。

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