1.3 什麼是障礙
測試驅動資料庫開發
那麼,真正的問題是什麼呢?是什麼真正阻礙了測試驅動資料庫開發的實現?從根本上講,上面這個問題的答案就是資料庫—單獨的伺服器和資料庫例項,即持久化解決方案的執行平台。與乙個用於建立一組最終能夠被裝載到任何特定會話的應用程式的二進位制檔案的設計相比,乙個單獨的資料庫更像是乙個包含 jvm 和乙個應用程式的特定會話的程序。
開發人員需要擺脫不良的做法,轉向構建不再繫結任何特定資料庫例項的資料庫設計。
1.3.1 資料庫就是物件
資料庫就是物件,從物件導向程式設計的程式設計師的角度看,它們是長期存在的物件,即便如此,它們仍然是物件。現如今,許多人對待資料庫的方式類似於軟體開發早期計算機程式設計師針對計算機本身程式設計,而不是針對那些能夠執行在計算機上的程式程式設計。
除了一些遺留系統,上述開發應用程式**的方式因為一些原因而像渡渡鳥1那樣絕跡了。最明顯的原因是現代計算機環境的複雜性要求能隨時隨地新增或移除硬體。另乙個原因是很多應用程式不得不執行在多種多樣的硬體上,或者執行在物理上與開發軟體的程式設計師分離的環境中。
1.3.2 tdd適用於類,不適用於物件
對於資料庫領域中的 tdd 來說,其最大的障礙存在於測試的內在本質中。測試天生就是在物件之上進行操作的。當乙個人執行手工測試時,他把大量的物件作為介面並與之打交道,包括正使用的應用程式的乙個例項和與之互動的大量業務邏輯物件的例項,這些例項根據它們的輸入和/或輸入產生的結果來作出決定。
其他產業並不是像上面描述的那樣做測試。生產需要長期使用的絕對關鍵產品的公司,如為替換受損髖關節而生產人工髖關節的公司,是需要測試從生產線下來的每一件產品的。而生產那些不是長期使用或不大可能因為產品失效而造成嚴重人身傷害的產品的公司,如生產鉛筆的公司就通過測試產品在統計學領域的顯著部分來近似做到測試他們生產的每一件產品。
為什麼軟體開發人員能夠不用測試每一件產品,而僅僅測試他們所做的一些例項呢?
在軟體產業,能夠像這樣做測試可能是因為同乙個類的兩個物件能做出完全相同的行為。你能用乙個類產生任意數量的物件,所有這些物件都具有完全相同的行為。
軟體開發者進行開發的這一獨特特性,允許乙個類的任一例項能作為該類其他每乙個例項的模板。這意味著,僅僅對乙個物件進行測試就能獲得這些物件的類的情況,並能獲得該類已經和即將建立的所有物件的情況。
然而,如果開發人員所處的情況與上述情況不同該怎麼辦?如果乙個類的每乙個例項都是通過手工或者通過在另一台計算機上的乙個不可靠的過程組裝成的,那該怎麼辦?在這種情況下,測試乙個物件就不能獲得另乙個物件的情況。開發者必須測試所構建系統的有統計學代表性的乙個子集,而需要做的測試數量將與可以接受的風險數量相匹配。
這就是在資料庫世界中開發者所面臨的處境。開發者開發了乙個設計,很少能有乙個容易的方法來將該設計的變化引入到新的或現存的資料庫例項中。更多的時候,開發者會在某類資料庫的所有各種重要的例項上手工調節設計的變化,這等同於在每一台需要作出更新的計算機上手工修改和檢查彙編**(或者是一些非常初級的源**),然後在那台計算機上重新編譯二進位制**。
當開發者以上述方式開發時,就近乎於需要測試所建立的每乙個產品例項。然而,在軟體產業,測試通常需要對所測試的物件大動干戈,而開發者不能讓產品例項上的實時資料遭受測試帶來的那種危險。一些資料庫例項,特別是生產資料庫,根本就無法進行測試。
1.3.3 我們需要資料庫的類
如果開發者需要了解乙個資料庫的情況,但是不允許對其進行測試,就需要找到一種方法,通過測試乙個**來了解那個資料庫是正常工作的。正如本書已經提到的,在應用程式開發世界中允許我們做此事的機制就是類。
因此,測試驅動資料庫開發的基礎就是建立資料庫的類,而不是建立特定資料庫的例項。定義的類負責構建和更新測試例項。在從測試例項中獲得足夠多的反饋來驗證對乙個類所做的變化之後,接下來該類就以更新測試例項完全相同的方式來更新生產資料庫。
相對於那些開發者不想執行任何測試的產品例項來說,通過這種方式可以確保測試例項是個良好的模板。在本書的整個內容中,讀者將看到同樣的過程不僅允許檢查對資料庫的修改做了什麼,還能檢查修改是如何被引入的。當開發者想要把乙個資料庫的修改發布到任何乙個生產環境中時,你完全有信心相信上述修改「是能夠工作」的。
《測試驅動資料庫開發》 第1章1 4節小結
1.4 小結 測試驅動資料庫開發 在寫本書時,精益和敏捷軟體開發正在全球大行其道,但是資料庫開發在開發過程中仍然是瓶頸。為了消除阻擋整個組織的障礙,開發人員必須找到如何讓資料庫快速變化的方法。然而,不能以犧牲對變化的信心來換取快速的變化,資料庫是如此重要,以至於不能容許有任何額外的風險。這裡 tdd...
第13章 資料庫支援
13.1 python資料庫api 13.2 sqlite和pysqlite sqlite小型資料庫引擎,可直接使用本地檔案,而不需要集中式資料庫儲存機制。使用模組sqlite3實現的pysqlite。13.2.1 起步 import sqlite3 建立直接到資料庫檔案的連線 conn sqlit...
第13章 資料庫支援
為了解決不同資料庫模組的介面 api 不同的問題,指定了標準資料庫api db api 1.全域性變數 所有與db api2.0相容的資料庫模組必須包含3個全域性變數 apilevel 使用的python api版本,是乙個字串常量。db api 2.0指出,這個變數的值為 1.0 或 2.0 如果...