動(dòng)機(jī)
曾經(jīng)使用許多方法在數(shù)據(jù)庫(kù)和目標(biāo)代碼之間傳輸數(shù)據(jù)。從手動(dòng)編碼的SQL到JDO,然后再到EJB,我從未找到一種特別喜歡的方法。自從采用測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)作為指導(dǎo)原則以來(lái),這種不滿情緒變得更加強(qiáng)烈。
單元測(cè)試的障礙應(yīng)盡可能少。在關(guān)系數(shù)據(jù)庫(kù)中,障礙的范圍從外部依賴(數(shù)據(jù)庫(kù)在運(yùn)行嗎?)到保持關(guān)系模型和對(duì)象模型同步的速度。由于這些原因,保持?jǐn)?shù)據(jù)庫(kù)訪問(wèn)代碼與核心對(duì)象模型分離且無(wú)需涉及真實(shí)數(shù)據(jù)庫(kù)而進(jìn)行盡可能多的測(cè)試是很重要的。
通常這會(huì)導(dǎo)致我們進(jìn)入下面兩種模式之一。第一種是具體化所有訪問(wèn)域?qū)ο蟮臄?shù)據(jù)以及數(shù)據(jù)與單獨(dú)類或接口之間的關(guān)系。這就是典型的能夠檢索、編輯、刪除和添加域?qū)嶓w的數(shù)據(jù)存儲(chǔ)對(duì)象。這在單元測(cè)試中是最容易模擬出來(lái)的,但趨向于把域模型對(duì)象作為不帶有任何關(guān)系行為的純數(shù)據(jù)對(duì)象。直接從父對(duì)象訪問(wèn)子記錄是最理想的,而不是將父對(duì)象處理為第三方類來(lái)決定子記錄。
其他方法已經(jīng)使訪問(wèn)接口的域?qū)ο筮M(jìn)入數(shù)據(jù)映射層(一種la Martin Fowler的數(shù)據(jù)映象模式)。這具有推動(dòng)域模型中的對(duì)象關(guān)系的優(yōu)點(diǎn),在域模型中,對(duì)象關(guān)系型接口只需表達(dá)一次即可。使用域模型的類不支持持久性機(jī)制,因?yàn)樗旧韮?nèi)在化到域模型中。這使代碼集中在設(shè)法解決的業(yè)務(wù)問(wèn)題,而很少關(guān)注對(duì)象關(guān)系型映射機(jī)制。
我的當(dāng)前項(xiàng)目涉及到處理大量的棒球統(tǒng)計(jì)數(shù)據(jù),并使用這些數(shù)據(jù)進(jìn)行模擬。因?yàn)閿?shù)據(jù)已經(jīng)在關(guān)系數(shù)據(jù)庫(kù)中,所以對(duì)于我來(lái)說(shuō),有機(jī)會(huì)開(kāi)發(fā)Hibernate對(duì)象關(guān)系型映射系統(tǒng)。我曾對(duì)Hibernate有很深刻的印象,但我遇到的一個(gè)問(wèn)題是,在使用Hibernate進(jìn)行單元測(cè)試的數(shù)據(jù)映射時(shí),設(shè)法插入一個(gè)間接層。該附加層非常脆弱,編寫起來(lái)感到非常困難。實(shí)際部署版本簡(jiǎn)單地通過(guò)了特定于Hibernate的實(shí)現(xiàn)。更壞的情況是,模擬版本比真正的“產(chǎn)品級(jí)”版本更復(fù)雜,只因?yàn)槟M版本里沒(méi)有基本對(duì)象存儲(chǔ)器和帶有Hibernate的映射。
我也使用很多復(fù)雜的Hibernate查詢,想要對(duì)應(yīng)用程序的重要部分進(jìn)行單元測(cè)試。然而,對(duì)活動(dòng)的數(shù)據(jù)庫(kù)進(jìn)行測(cè)試不是好主意,因?yàn)檫@幾乎總是產(chǎn)生維護(hù)問(wèn)題。另外,由于測(cè)試互相獨(dú)立,在測(cè)試上下文數(shù)據(jù)中使用相同的主鍵意味著必須在每次測(cè)試前創(chuàng)建代碼來(lái)清理數(shù)據(jù)庫(kù),當(dāng)涉及到大量關(guān)系時(shí)就成為一個(gè)實(shí)際問(wèn)題。
通過(guò)使用HSQLDB和Hibernate強(qiáng)大的模式生成工具,能夠?qū)?yīng)用程序映射層進(jìn)行單元測(cè)試,并在對(duì)象查詢中找到不計(jì)其數(shù)的bug,這在以前手工測(cè)試時(shí)是做不到的。利用下面的技術(shù)概述,可以在開(kāi)發(fā)過(guò)程中對(duì)整個(gè)應(yīng)用程序進(jìn)行測(cè)試,并且在測(cè)試有效區(qū)域內(nèi)沒(méi)有損害。
曾經(jīng)使用許多方法在數(shù)據(jù)庫(kù)和目標(biāo)代碼之間傳輸數(shù)據(jù)。從手動(dòng)編碼的SQL到JDO,然后再到EJB,我從未找到一種特別喜歡的方法。自從采用測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)作為指導(dǎo)原則以來(lái),這種不滿情緒變得更加強(qiáng)烈。
單元測(cè)試的障礙應(yīng)盡可能少。在關(guān)系數(shù)據(jù)庫(kù)中,障礙的范圍從外部依賴(數(shù)據(jù)庫(kù)在運(yùn)行嗎?)到保持關(guān)系模型和對(duì)象模型同步的速度。由于這些原因,保持?jǐn)?shù)據(jù)庫(kù)訪問(wèn)代碼與核心對(duì)象模型分離且無(wú)需涉及真實(shí)數(shù)據(jù)庫(kù)而進(jìn)行盡可能多的測(cè)試是很重要的。
通常這會(huì)導(dǎo)致我們進(jìn)入下面兩種模式之一。第一種是具體化所有訪問(wèn)域?qū)ο蟮臄?shù)據(jù)以及數(shù)據(jù)與單獨(dú)類或接口之間的關(guān)系。這就是典型的能夠檢索、編輯、刪除和添加域?qū)嶓w的數(shù)據(jù)存儲(chǔ)對(duì)象。這在單元測(cè)試中是最容易模擬出來(lái)的,但趨向于把域模型對(duì)象作為不帶有任何關(guān)系行為的純數(shù)據(jù)對(duì)象。直接從父對(duì)象訪問(wèn)子記錄是最理想的,而不是將父對(duì)象處理為第三方類來(lái)決定子記錄。
其他方法已經(jīng)使訪問(wèn)接口的域?qū)ο筮M(jìn)入數(shù)據(jù)映射層(一種la Martin Fowler的數(shù)據(jù)映象模式)。這具有推動(dòng)域模型中的對(duì)象關(guān)系的優(yōu)點(diǎn),在域模型中,對(duì)象關(guān)系型接口只需表達(dá)一次即可。使用域模型的類不支持持久性機(jī)制,因?yàn)樗旧韮?nèi)在化到域模型中。這使代碼集中在設(shè)法解決的業(yè)務(wù)問(wèn)題,而很少關(guān)注對(duì)象關(guān)系型映射機(jī)制。
我的當(dāng)前項(xiàng)目涉及到處理大量的棒球統(tǒng)計(jì)數(shù)據(jù),并使用這些數(shù)據(jù)進(jìn)行模擬。因?yàn)閿?shù)據(jù)已經(jīng)在關(guān)系數(shù)據(jù)庫(kù)中,所以對(duì)于我來(lái)說(shuō),有機(jī)會(huì)開(kāi)發(fā)Hibernate對(duì)象關(guān)系型映射系統(tǒng)。我曾對(duì)Hibernate有很深刻的印象,但我遇到的一個(gè)問(wèn)題是,在使用Hibernate進(jìn)行單元測(cè)試的數(shù)據(jù)映射時(shí),設(shè)法插入一個(gè)間接層。該附加層非常脆弱,編寫起來(lái)感到非常困難。實(shí)際部署版本簡(jiǎn)單地通過(guò)了特定于Hibernate的實(shí)現(xiàn)。更壞的情況是,模擬版本比真正的“產(chǎn)品級(jí)”版本更復(fù)雜,只因?yàn)槟M版本里沒(méi)有基本對(duì)象存儲(chǔ)器和帶有Hibernate的映射。
我也使用很多復(fù)雜的Hibernate查詢,想要對(duì)應(yīng)用程序的重要部分進(jìn)行單元測(cè)試。然而,對(duì)活動(dòng)的數(shù)據(jù)庫(kù)進(jìn)行測(cè)試不是好主意,因?yàn)檫@幾乎總是產(chǎn)生維護(hù)問(wèn)題。另外,由于測(cè)試互相獨(dú)立,在測(cè)試上下文數(shù)據(jù)中使用相同的主鍵意味著必須在每次測(cè)試前創(chuàng)建代碼來(lái)清理數(shù)據(jù)庫(kù),當(dāng)涉及到大量關(guān)系時(shí)就成為一個(gè)實(shí)際問(wèn)題。
通過(guò)使用HSQLDB和Hibernate強(qiáng)大的模式生成工具,能夠?qū)?yīng)用程序映射層進(jìn)行單元測(cè)試,并在對(duì)象查詢中找到不計(jì)其數(shù)的bug,這在以前手工測(cè)試時(shí)是做不到的。利用下面的技術(shù)概述,可以在開(kāi)發(fā)過(guò)程中對(duì)整個(gè)應(yīng)用程序進(jìn)行測(cè)試,并且在測(cè)試有效區(qū)域內(nèi)沒(méi)有損害。

