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

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

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

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


DbUnit 擴(kuò)展了 JUnit,它使數(shù)據(jù)庫在測試之間處于一種已知狀態(tài),幫助避免造成后面的測試失敗或者給出錯(cuò)誤結(jié)果的問題,如果測試會(huì)破壞數(shù)據(jù)庫會(huì)出現(xiàn)這些問題。它可以讀取表的內(nèi)容并用 FlatXmlDataSet 將它在存儲(chǔ)為 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>                 


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

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

 

OPE_OPERATOR
ID INT
CODE VARCHAR
ENCODED_STRING VARCHAR

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

在自己的項(xiàng)目中設(shè)置 DbUnit

設(shè)置 DbUnit 很簡單。有關(guān)項(xiàng)目文件下載的信息,請(qǐng)參閱 參考資料的內(nèi)容?梢詫⑺腥齻(gè) JAR 文件加到項(xiàng)目的編譯目標(biāo)中以進(jìn)行測試。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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