DBUnit是一個(gè)基于junit擴(kuò)展的數(shù)據(jù)庫測試框架。它提供了大量的類對(duì)與數(shù)據(jù)庫相關(guān)的操作進(jìn)行了抽象和封裝。它通過使用用戶自定義的數(shù)據(jù)集以及相關(guān)操作使數(shù)據(jù)庫處于一種可知的狀態(tài),從而使得測試自動(dòng)化、可重復(fù)和相對(duì)獨(dú)立。雖然不用dbunit也可以達(dá)到這種目的,但是我們必須為此付出代價(jià)(編寫大量代碼,測試及維護(hù)),既然有了這么優(yōu)秀的開源框架,我們又何必再造輪子。 普通的測試數(shù)據(jù)庫的方法不僅較為麻煩,而且在對(duì)數(shù)據(jù)庫測試完后會(huì)殘留數(shù)據(jù)【學(xué)Java,到凱哥學(xué)堂kaige123.com】在數(shù)據(jù)庫里或者把數(shù)據(jù)庫的數(shù)據(jù)修改了,相對(duì)于普通的測試,dbunit可以將數(shù)據(jù)庫已有的數(shù)據(jù)保存到xml文件上,以免在對(duì)數(shù)據(jù)庫進(jìn)行測試時(shí)破壞里面的數(shù)據(jù)。 可以直接在Maven工程里下載dbunit依賴包,普通工程的話直接導(dǎo)入jar包到工程環(huán)境即可。 Maven工程配置dbunit依賴包示例:
我們先單純用JUnit做一個(gè)普通的數(shù)據(jù)庫測試,以此來查看這種測試的弊端。 1.準(zhǔn)備一個(gè)有些許數(shù)據(jù)的數(shù)據(jù)庫表格:
2.接著先編寫一個(gè)Student類,將這個(gè)類的屬性封裝一下,然后再將這個(gè)類的屬性信息寫入輸入庫:
3.寫一個(gè)專門的類來得到數(shù)據(jù)庫連接對(duì)象
4.編寫一個(gè)類,用于將Student屬性數(shù)據(jù)寫入到數(shù)據(jù)庫,這個(gè)類具有更新、插入、刪除、查詢數(shù)據(jù)的方法:
5.編寫測試類,進(jìn)行測試,在這里我只測試了插入數(shù)據(jù)方法:
測試結(jié)果:
但是這樣子數(shù)據(jù)庫會(huì)殘留測試的數(shù)據(jù):
雖然這種情況可以將表格創(chuàng)建一個(gè)副本出來,然后對(duì)表格副本進(jìn)行測試,這樣就避免了會(huì)破壞表格里的數(shù)據(jù),但是這種方法比較麻煩,而且有些情況就是想直接對(duì)表格進(jìn)行測試【學(xué)Java,到凱哥學(xué)堂kaige123.com】而不想對(duì)副本進(jìn)行測試,那么就需要使用DBUnit工具,DBUnit有一個(gè)DatabaseOperation類可以在測試前先將數(shù)據(jù)庫已有的數(shù)據(jù)保存到xml文件上,然后測試完成之后再將這個(gè)xml文件里的數(shù)據(jù)還原到數(shù)據(jù)表格里,這樣就避免在對(duì)數(shù)據(jù)庫進(jìn)行測試時(shí)破壞里面的數(shù)據(jù)。 先介紹一下DatabaseOperation類,該類是一個(gè)抽象類代表了對(duì)數(shù)據(jù)庫的操作,例如CUD以及其組合等, 它采用了退化的工廠模式,可直接通過它獲取其具體的子類,使用這個(gè)類可以在測試完后還原數(shù)據(jù)庫的表格數(shù)據(jù): DatabaseOperation:
NONE:不執(zhí)行任何操作,是getTearDownOperation的默認(rèn)返回值。
UPDATE:將數(shù)據(jù)集中的內(nèi)容更新到數(shù)據(jù)庫中。它假設(shè)數(shù)據(jù)庫中已經(jīng)有對(duì)應(yīng)的記錄,否則將失敗。
INSERT:將數(shù)據(jù)集中的內(nèi)容插入到數(shù)據(jù)庫中。它假設(shè)數(shù)據(jù)庫中沒有對(duì)應(yīng)的記錄,否則將失敗。
REFRESH:將數(shù)據(jù)集中的內(nèi)容刷新到數(shù)據(jù)庫中。如果數(shù)據(jù)庫有對(duì)應(yīng)的記錄,則更新,沒有則插入。
DELETE:刪除數(shù)據(jù)庫中與數(shù)據(jù)集對(duì)應(yīng)的記錄。
DELETE_ALL:刪除表中所有的記錄,如果沒有對(duì)應(yīng)的表,則不受影響。
TRUNCATE_TABLE:與DELETE_ALL類似,更輕量級(jí),不能rollback。
CLEAN_INSERT:是一個(gè)組合操作,是DELETE_ALL和INSERT的組合。是getSetUpOeration的默認(rèn)返回值。
使用DBUnit工具進(jìn)行測試: 前4步和上面的一樣,不同的就在于第5步測試類的編寫:
測試結(jié)果:
xml文件內(nèi)容,這個(gè)文件就是以xml格式來存儲(chǔ)數(shù)據(jù)庫表格的數(shù)據(jù):
使用DBUnit工具測試完后,數(shù)據(jù)庫表格里的數(shù)據(jù)就不會(huì)出現(xiàn)測試數(shù)據(jù)殘留或者數(shù)據(jù)損壞了: