DBUnit擴展自JUnit.在使用DBUnit之前,為了驗證自己編寫的涉及數據庫操作方法的正確性,每次都要執行一個簡單的sql腳本,灌些數據,然后人眼觀察著數據表中的數據.然后,代碼執行完畢后,再次觀察數據變化情況.久而久之,表里面的數據就變得雜亂,一般會全部刪除,重新來過.
??? DBUnit的目標正是保證數據庫數據環境的穩定性,具備將數據庫中數據與xml文件之間雙向轉換的能力.
試驗了一下,
首先,下載dbunit的jar包,加入工程即可.
1.從xml中將數據導入數據庫表
tc不再繼承自TestCase,而是繼承DatabaseTestCase
覆蓋幾個方法,包括獲得xml文件內容,獲得DB連接,以及在setup方法和teardown方法中調用提供的dbunit操作類型,構建數據庫內數據環境.
這時,我以為如果只有幾個簡單的數據,寫xml固然簡單,但想測試大數據量時(雖然UT主要是測試功能而非性能,但是大數據量也方便驗證)就有點問題,好在是雙向的,可以先把數據用function灌入數據庫,再導進xml里面:
2.從數據庫表數據導入xml文件
??? 用ant+DBUnit來完成這個任務非常方便!
<
target?
name
="export"
>
????????
<
taskdef?
name
="dbunit"
?classname
="org.dbunit.ant.DbUnitTask"
?classpathref
="compile.path"
?
/>
????????
<
dbunit?
driver
="com.mysql.jdbc.Driver"
?url
="jdbc:mysql://127.0.0.1:3306/mydb"
?userid
="root"
?password
="root"
?supportBatchStatement
="true"
>
????????????
<
export?
dest
="${test.srcpath}/export.xml"
>
????????????????
????????????????
<
query?
name
="test_table"
?sql
="SELECT?*?FROM?test_table"
?
/>
????????
????????????????
<
table?
name
="user_table"
?
/>
????????????
</
export
>
????????
</
dbunit
>
????
</
target
>
??? 疑問,看到有人說DBUnit在清除數據時,有時不能徹底,原因是分析不出來外鍵等表之間的約束.因為在試驗中采用的數據庫里沒啥表之間的約束,所以還沒有體會到.
??? DatabaseTestCase類提供了兩個方法來控制測試前和測試后的數據庫狀態:getSetUpOperation() 和 getTearDownOperation().???????
??? 一種高效的實施方案就是讓getSetUpOperation()方法執行REFRESH操作,通過這個操作,我們可以用種子文件中的數據去更新目標數據庫里的數據。
??? 接下來,就是getTearDownOperation(),讓他去執行一個NONE操作,也就是什么也不執行
??? 常用操作:
??? DatabaseOperation.CLEAN_INSERT;?先刪除表中所有,再插入準備的數據
??? DatabaseOperation.REFRESH;?使用準備數據更新表,存在則update,不存在則insert
??? DatabaseOperation.DELETE;??只刪除準備的數據
??? DatabaseOperation.NONE;??啥都不做