2010-02-25 100 views
16

我正在使用Migrator.NET爲應用程序編寫數據庫遷移。馬克 - 安德烈·Cournoyer寫道:如何測試數據庫遷移?

就像在應用程序中的任何代碼,你 必須測試你的遷移。起起落落的代碼。在儘可能多的不同數據庫和環境中進行 連續構建過程並在 環境中測試它。

我該怎麼做?假設我有用於創建表的Down()方法和用於刪除同一個表並使用SQL Server的Down()方法。測試將如何進行?我是否應該對系統表運行SQL查詢,如select * from sys.columns,以檢查表是否已創建並且它具有適當的結構?如果我們使用NHibernate呢?

EDIT 我的意思是在導軌的ActiveRecord遷移感(創建,修改和在基於C#代碼小步驟拆除數據庫)遷移。

EDIT 2here的,我瞭解,我們應該測試遷移。博客帖子實際上是從Migrator的wiki鏈接的。

+0

我有同樣的問題,還沒有找到答案。 +1 – Paul 2010-03-02 03:39:41

回答

5

你測試你的DAL--某種集成測試嗎?

您不僅需要遷移腳本,還需要基線腳本。如果要測試數據庫升級,應該在測試/登臺服務器上運行基線中的所有腳本以創建最新版本的數據庫。然後根據最新的測試數據庫測試您的DAL。如果所有的DAL測試成功,那麼您的遷移應該已經成功(否則您的DAL測試不夠完整)。

這是一個昂貴的測試運行,但它非常穩定。我個人承認此刻手動做了很多這樣的事情;我們有一個將應用所有腳本(包括基線)的內部遷移工具,因此測試數據庫設置和DAL測試是分開的步驟。它雖然工作。如果你想確保創建了一個表,沒有比實際嘗試向其中插入數據更好的方法了!

您可以嘗試通過查看系統目錄,並INFORMATION_SCHEMA意見等來驗證結果,但最終只有這樣,才能確保它實際上工作是儘量使用新對象。僅僅因爲物體在那裏並不意味着它們是功能性的。

+0

謝謝。這就是我們如何結束這樣做的。我們現在在兩個獨立的程序集中進行測試 - 一個用於正常測試,另一個用於集成測試。第一批在遷移之前運行,並測試應用程序邏輯和內容以及遷移,然後運行遷移,然後進行集成測試。這確保我們始終使用當前(最新)架構並且已創建所有數據庫對象。集成測試使用NH模型類並僅執行一些CRUD操作。 – 2010-05-05 07:51:55

0

這也許憑證可以幫助你:

http://www.benzzon.se/forum/uploads/benzzon/2006-03-27_134824_sp_CompareDB.txt

這個腳本比較兩個DB(結構和數據)

+0

不,這不是我說的那種遷移。 :)我不想將數據庫從一臺服務器遷移到另一臺服務器。我正在談論Rails移植中的遷移。我爲Migrator.NET項目添加了一個超鏈接,希望能夠爲其他人澄清一下。 – 2010-02-26 10:25:08

1

源代碼控制是採取當前的代碼庫的快照。遷移是爲了將數據庫從一個版本轉移到另一個版本。因此,在未來的某個時刻,您可以使用舊的數據庫,應用遷移並使用最新的代碼庫。

我從來沒有見過實際的遷移測試。我看到了測試的結果,他們已經抓住/提醒我運行最新的遷移。

describe User do 
    it { should have_column :name, :type => :string } 
    it { should validate_presence_of :name}  
end 

所以有人改變模型。添加測試以反映模型。添加遷移。然後提交源代碼。
您抓住最新的運行測試。測試失敗,因爲數據庫不對應。你記得運行遷移,然後重新運行測試。成功。

+0

這隻適用於簡單的1:1模型,我們的數據庫具有與域模型類不同的結構。我看到你的例子是在Ruby中(是rspec?),這將與ActiveRecord一起工作,但我們沒有使用它。我們使用NHibernate將數據庫表映射到我們的域模型實體,並且它們不匹配1:1。 – 2010-03-03 14:20:38

+0

是的,它是rspec。 如果是這樣的話,我可能會做一下Rawheiser的建議,只是鍛鍊模型。使用.net很難做到,但是如果你已經建立了一個開發和測試數據庫,那麼做起來會更容易。如果映射不是1:1,那麼花時間設置一個乾淨的測試數據庫來運行測試可能會很有用。我仍然沒有聽說過任何測試遷移的人,只是測試這些遷移的結果。 – 2010-03-03 15:28:48

+0

我給你+1,因爲你的答案對ActiveRecord很好。 – 2010-03-04 08:06:12

0

你可以做一個數據庫系統對象的比較,但你需要有一個目標來比較 - 否則你怎麼知道如果通過或失敗?

我認爲您可能會更好地創建一組邊緣案例CRUD操作測試用例,這些測試用例可以鍛鍊數據層中的實體或操作。如果其中任何一個失敗,數據庫就不會與需要的數據同步。即,如果字段char(20)的插入失敗,因爲它只是數據庫中的char(15)。然後可以完成數據庫結構比較來查看是否關閉。

您可以通過僅關注最近更改的項目並假設已應用以前的更改來縮短這一點。

1

如果使用NHibernate,將遷移測試視爲整體持久性測試策略的一部分,即如果您可以創建並保存所有實體而沒有任何錯誤,則數據庫映射應該是正確的。

0

我正在尋找對此的答案。我認爲這應該在集成環境中進行測試,而不是單元測試:對於單元測試(DAL),我放下數據庫並重新創建它。

但是,理想情況下,我希望有一個集成環境,即我的數據庫從生產中複製,而數據庫遷移腳本以雙向方式運行: 向上以確保順利升級生產和向下以確保回滾成爲可能。