相信做過(guò)單元測(cè)試的人都會(huì)對(duì)JUnit非常的熟悉了,要介紹的DbUnit(http://dbunit.sourceforge.net/)則是專 門針對(duì)數(shù)據(jù)庫(kù)測(cè)試的對(duì)JUnit的一個(gè)擴(kuò)展,它可以將測(cè)試對(duì)象數(shù)據(jù)庫(kù)置于一個(gè)測(cè)試輪回之間的狀態(tài)。鑒于目前國(guó)內(nèi)介紹DbUnit的系統(tǒng)教程比較少見,本文 將分從理論和實(shí)例兩個(gè)方面帶你領(lǐng)略DbUnit的精彩世界。
DbUnit設(shè)計(jì)理念
熟悉單元測(cè)試的開發(fā)人員都知道,在對(duì)數(shù)據(jù)庫(kù)進(jìn)行單元測(cè)試時(shí)候,通常采用的方案有運(yùn)用模擬對(duì)象(mock objects)和stubs兩種。通過(guò)隔離關(guān)聯(lián)的數(shù)據(jù)庫(kù)訪問類,比如JDBC的相關(guān)操作類,來(lái)達(dá)到對(duì)數(shù)據(jù)庫(kù)操作的模擬測(cè)試。然而某些特殊的系統(tǒng),比如利 用了EJB的CMP(container-managed persistence)的系統(tǒng),數(shù)據(jù)庫(kù)的訪問對(duì)象是在底層而且很隱蔽的,那么這兩種解決方案對(duì)這些系統(tǒng)顯得力不從心了。
DBUnit的設(shè)計(jì)理念是在測(cè)試之前,備份數(shù)據(jù)庫(kù),然后給對(duì)象數(shù)據(jù)庫(kù)植入我們需要的準(zhǔn)備數(shù)據(jù),后,在測(cè)試完畢后,讀入備份數(shù)據(jù)庫(kù),回溯到測(cè)試前的狀態(tài);
而且又因?yàn)镈BUnit是對(duì)JUnit的一種擴(kuò)展,開發(fā)人員可以通過(guò)創(chuàng)建測(cè)試用例代碼,在這些測(cè)試用例的生命周期內(nèi)來(lái)對(duì)數(shù)據(jù)庫(kù)的操作結(jié)果進(jìn)行比較。
DbUnit測(cè)試基本概念和流程
基于DbUnit 的測(cè)試的主要接口是IDataSet。IDataSet代表一個(gè)或多個(gè)表的數(shù)據(jù)。
可以將數(shù)據(jù)庫(kù)模式的全部?jī)?nèi)容表示為單個(gè)IDataSet 實(shí)例。這些表本身由Itable 實(shí)例來(lái)表示。
IDataSet 的實(shí)現(xiàn)有很多,每一個(gè)都對(duì)應(yīng)一個(gè)不同的數(shù)據(jù)源或加載機(jī)制。常用的幾種 IDataSet實(shí)現(xiàn)為:
FlatXmlDataSet:數(shù)據(jù)的簡(jiǎn)單平面文件 XML 表示
QueryDataSet:用 SQL 查詢獲得的數(shù)據(jù)
DatabaseDataSet:數(shù)據(jù)庫(kù)表本身內(nèi)容的一種表示
XlsDataSet :數(shù)據(jù)的excel表示
一般而言,使用DbUnit進(jìn)行單元測(cè)試的流程如下:
1 根據(jù)業(yè)務(wù),做好測(cè)試用的準(zhǔn)備數(shù)據(jù)和預(yù)想結(jié)果數(shù)據(jù),通常準(zhǔn)備成xml格式文件。
2 在setUp()方法里邊備份數(shù)據(jù)庫(kù)中的關(guān)聯(lián)表。
3 在setUp()方法里邊讀入準(zhǔn)備數(shù)據(jù)。
4 對(duì)測(cè)試類的對(duì)應(yīng)測(cè)試方法進(jìn)行實(shí)裝:執(zhí)行對(duì)象方法,把數(shù)據(jù)庫(kù)的實(shí)際執(zhí)行結(jié)果和預(yù)想結(jié)果進(jìn)行比較。
5 在tearDown()方法里邊,把數(shù)據(jù)庫(kù)還原到測(cè)試前狀態(tài)。
DbUnit開發(fā)實(shí)例
下面通過(guò)一個(gè)實(shí)例來(lái)說(shuō)明DbUnit的實(shí)際運(yùn)用。
實(shí)例準(zhǔn)備
比如有一個(gè)學(xué)生表[student],結(jié)構(gòu)如下:
id char(4) pk 學(xué)號(hào)
name char(50) 姓名
sex char(1) 性別
birthday date 出生日期
準(zhǔn)備數(shù)據(jù)如下:
id name sex birthday
0001 翁仔 m 1979-12-31
0002 王翠花 f 1982-08-09
測(cè)試對(duì)象類為StudentOpe.java,里邊有2個(gè)方法:
findStudent(String id) :根據(jù)主鍵id找記錄
addStudent(Student student) :添加一條記錄
在測(cè)試addStudent方法時(shí)候,我們準(zhǔn)備添加如下一條數(shù)據(jù)
id name sex birthday
0088 王耳朵 m 1982-01-01