現實的問題是這樣的:你有一個SQL數據庫,一些存儲過程和一個介于應用程序和數據庫之間的中間層。你怎樣在其中插入測
試代碼從而保證在數據庫中數據存取功能的實現?
為什么會有這樣的問題?
我猜想有些,可能不完全是大多數的數據庫開發過程都是這樣的:建立數據庫,編寫存取數據到數據庫的代碼,編譯并運行,用一個查詢語句查驗所列的數據是否正確顯示。如果能正確顯示那就大功告成了。
然而,這種靠眼睛來檢測的弊端在于:你不經常進行這樣的檢驗,而且這種檢驗是不完全的。存在這樣的可能性,當你對系統進行了修改,過了幾個月后,你無意中破壞了系統,從而導致數據的丟失。作為一個編程人員,你可能不會花很多時間來檢查數據本身,這就使錯誤的數據要經過較長的時間才能暴露出來。我曾經參與一個建立網站的項目,該項目中在注冊時有一個必填數據在大半年中沒有被發現未實際輸入進數據庫。盡管公司市場部曾經提出他們需要這一信息,但因為這項數據從來沒有人去看它,直接導致了這一問題在很長時間內沒有被發現。
自動化測試,由于它能經常測試而且測試范圍較廣,降低了數據丟失的風險。我發現它能使我更心安理得地休息。當然,自動化測試還有其他一些好處,他們本身就是代碼編寫的范例,也可以作為文檔,便于你修改別人編寫的原始程序,從而減少檢測所需的時間。
什么是我們所談論的測試?
設想有一個非常簡單的用戶數據庫,包括用戶電子信箱和一個標志,用來指示郵件地址是否被彈回。你的數據庫程序應該包括插入、修改、刪除和查詢等方法
插入方法會調用一個存儲過程將數據寫入數據庫。為了敘述方便,這里省去了一些細節,大致的程序如下所示:
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://www.anti-gravitydesign.com