現實(shí)的問(wèn)題是這樣的:你有一個(gè)SQL數據庫,一些存儲過(guò)程和一個(gè)介于應用程序和數據庫之間的中間層。你怎樣在其中插入測
試代碼從而保證在數據庫中數據存取功能的實(shí)現?
為什么會(huì )有這樣的問(wèn)題?
我猜想有些,可能不完全是大多數的數據庫開(kāi)發(fā)過(guò)程都是這樣的:建立數據庫,編寫(xiě)存取數據到數據庫的代碼,編譯并運行,用一個(gè)查詢(xún)語(yǔ)句查驗所列的數據是否正確顯示。如果能正確顯示那就大功告成了。
然而,這種靠眼睛來(lái)檢測的弊端在于:你不經(jīng)常進(jìn)行這樣的檢驗,而且這種檢驗是不完全的。存在這樣的可能性,當你對系統進(jìn)行了修改,過(guò)了幾個(gè)月后,你無(wú)意中破壞了系統,從而導致數據的丟失。作為一個(gè)編程人員,你可能不會(huì )花很多時(shí)間來(lái)檢查數據本身,這就使錯誤的數據要經(jīng)過(guò)較長(cháng)的時(shí)間才能暴露出來(lái)。我曾經(jīng)參與一個(gè)建立網(wǎng)站的項目,該項目中在注冊時(shí)有一個(gè)必填數據在大半年中沒(méi)有被發(fā)現未實(shí)際輸入進(jìn)數據庫。盡管公司市場(chǎng)部曾經(jīng)提出他們需要這一信息,但因為這項數據從來(lái)沒(méi)有人去看它,直接導致了這一問(wèn)題在很長(cháng)時(shí)間內沒(méi)有被發(fā)現。
自動(dòng)化測試,由于它能經(jīng)常測試而且測試范圍較廣,降低了數據丟失的風(fēng)險。我發(fā)現它能使我更心安理得地休息。當然,自動(dòng)化測試還有其他一些好處,他們本身就是代碼編寫(xiě)的范例,也可以作為文檔,便于你修改別人編寫(xiě)的原始程序,從而減少檢測所需的時(shí)間。
什么是我們所談?wù)摰臏y試?
設想有一個(gè)非常簡(jiǎn)單的用戶(hù)數據庫,包括用戶(hù)電子信箱和一個(gè)標志,用來(lái)指示郵件地址是否被彈回。你的數據庫程序應該包括插入、修改、刪除和查詢(xún)等方法
插入方法會(huì )調用一個(gè)存儲過(guò)程將數據寫(xiě)入數據庫。為了敘述方便,這里省去了一些細節,大致的程序如下所示:
public class UserDatabase
{
...
public void insert(User user)
{
PreparedStatement ps = connection.prepareCall("
{ call User_insert(?,?) }");
ps.setString(1, user.getEmail());
ps.setString(2, user.isBad());
// In real life, this would be a boolean.
ps.executeUpdate();
ps.close();
}
...
}
而我認為的測試代碼應為:
原文轉自:http://kjueaiud.com