2017-07-03 76 views
0

我正在遷移到SSDT,以便爲伴隨數據庫的大型項目的數據庫結構進行架構控制。這個項目已經有數百個集成測試,它們處於各種脆弱狀態。其中許多使用我稱之爲「已知數據」來執行集成測試。測試依賴於這些數據,以便他們成功運行。SSDT項目和使用已知數據管理集成測試

過去,我們已經完成了我們的集成測試數據庫的1:1副本,用於在功能分支中進行測試,但是我並不關注這個過程,因爲它增加了服務器的膨脹。

使用SSDT,有沒有辦法將這個「已知數據」合併到一個SSDT項目中,或者是一個可以在事後複製的過程?我已經有了將種子數據加載到系統中的後期部署腳本(類型等),因此我可以將所有已知數據放在那裏,但是這可能會有數十個額外的sql文件可能被管理,所以我對它並不狂熱。

由於已知數據的複雜性和數量,使用位於數據庫頂部的應用程序來插入它是不實際的。

我正在考慮探索一個bacpac選項,但在這之前,我們想看看過去人們是否有其他方式來管理功能分支與已知數據的集成測試。

回答

1

有一對夫婦的方法,你可以採取:

  1. 使用備份/快照
  2. 集成測試/測試數據在一個單獨的.sqlproj/dacpac
  3. 設置數據的一部分,你的測試

1.使用備份/快照

你可以在已知狀態下獲得一個數據庫,然後使用備份或快照。我不喜歡這個,因爲你總是需要保持你的基礎保持最新,或者每隔一段時間刷新它。

2.集成測試/測試數據在一個單獨的.sqlproj/dacpac

這是我通常會爲單元測試做(集成測試,對我來說,通常在應用程序的語言調用數據庫)。

我會在我的解決方案的獨立.sqlproj具有「相同的數據庫」參考主項目。放入測試種子數據的集成測試和Post-Deploy.sql。

如果您有多個文件使用「:R」進口包括那些和使用「:R」從主體工程何時發佈進口包括後部署情況,被引用dacpacs做沒有執行它們的前/後部署腳本。

如果你還沒有使用這樣的引用在部署試驗項目和/ p前:IncludeCompositeObject =真

3.設置數據作爲測試的一部分

這可能是如果更難你已經有了一個大套件,但我通常會建議,作爲每個測試的設置的一部分,你將數據置於一個你知道它適合該測試的狀態。

這樣它停止任何脆性運行在不同的順序等

我沒有看過BACPAC對這個測試,這可能是應對它,以及一個有趣的方式。

+1

把這個過了一會兒,但真的#3是在這裏做事情的正確方法。您必須先開始重新進行所有測試,但長期保存的人工時間不必維護已知的數據集,並且代碼周圍的應用是正確的。 – CBerg

1

如果我的理解正確,請複製數據庫之間的所有數據以執行集成測試。

如果這是正確的,你可以:

  1. 創建存儲在一個單獨的模式程序來填充表。例如dbo.MyTable會被seed.usp_MyTable播種,或者;
  2. 在獨立的數據庫中創建存儲過程以再次使用智能命名約定來填充表。

對於這兩個選項,主存儲過程都可以用來執行所有的種子過程。

兩者的好處是:

  • 所有存儲過程的源控制,確保 測試數據的歷史被捕獲。
  • 以編程方式標識種子數據覆蓋範圍非常簡單,因爲每個表都將具有名稱匹配的存儲過程。
  • 作爲 部署的一部分啓動種子過程非常簡單,只需包含部署後腳本或SQL任務即可執行主種子過程。
  • 種子數據過程可用作額外的迴歸測試 來檢查列或數據類型更改時的源漂移。

有優點和缺點每種方法:

  1. 所有種子過程是相同的數據庫,因爲它們引用 表的一部分。這簡化了SSDT項目,因爲沒有 需要外部參考。
  2. 不同種子數據可以利用不同的 環境。的外部引用的數據表的項目是需要 ,但不同的種子項目可以爲每個 環境來創建。
1

BULK INSERT

以獲取靜態數據進行測試,最快的方法,我發現到目前爲止是在後腳本中使用「BULK INSERT」從預填充的數據文件。主要的問題是我需要提供確切的文件路徑到BULK INSERT。但是,您可以使用發佈變量。該解決方案是獲取數據的最快方式,並且它比INSERT/MERGE語句執行得好得多。

INSERT /合併

如果沒有那麼如此多的數據插入/在後腳本運行良好融合。已經實現的存儲過程可以幫助生成這些語句。你可以檢查它on github

tSQLt

它是不是真的與實際的問題,但我強烈建議,使用tSQLt framework進行測試。這不是集成,而是單元測試,但正確的用法你不需要預先填充的數據,它可以在任何數據庫上工作。