2014-01-10 39 views
3

我剛剛開始在redgate的sql測試中使用tsqlt。我必須處理遺留數據庫中相當大的表(大量列)。在這樣的表格中插入一些假數據的最佳實踐是什麼('腳本'作爲'插入語句'非常大) - 因此它們會使得我的單元測試的「排列部分」字面上看起來不可讀。我可以列出這些代碼嗎?還有一種方法不僅腳本插入語句,但也自動填充一些值?謝謝。重複使用代碼tsqlt/sql test

+0

你有沒有試過Redgate的SQL數據生成器? – Jayvee

+0

是的,並沒有真正的幫助,因爲它將數據放入「真實」分貝。單元測試應該只是假插入(tsqlt的一個優點),但也許我錯過了一些東西...... – cs0815

+0

剛剛意識到tSQLt.FakeTable使大多數列可以爲空 - 因此您不必爲所有列插入值。這可能是解決方案... – cs0815

回答

4

我同意你的評論,你不需要填寫你的插入語句中的所有列。

tSQLt.FakeTable從列中刪除所有非空約束,以及計算列和標識列(儘管可以使用FakeTable的特定參數恢復後兩個約束)。

因此,您只需填充與您的待測試代碼相關的列,這些列通常只是表格中列的較小子集。

我在this article裏寫了一些關於這個的更詳細的信息,其中還包含了一些你可能想知道的其他'陷阱'。另外,我建議如果你有一些測試需要僞造和插入相同的表,你考慮使用SetUp例程 - 這是測試類(模式)中的一個存儲過程,被稱爲SetUp,並在該架構中的每個測試之前由tSQLt調用。他們不會在RedGate的SQL測試窗口中顯示(我已經建議它作爲改進),但仍然可以工作。這可能會使難以看到 - 但模塊化代碼,從而減少相同的,重複的代碼。

+0

你也可以從[這篇關於如何使用tSQLt/SQL測試記錄的Pluralsight課程]中獲得一些價值(http://pluralsight.com/training/Courses/TableOfContents/unit-testing- t-sql-tsqlt) – DaveGreen

+0

優秀的DaveGreen謝謝 - 當我試圖自己回答這個問題時,我實際上遇到了這個博客。感謝您指出SetUp的東西 - 我認爲您不需要使用這個框架(TearDown?)清理任何東西,因爲它從來沒有真正觸及底層的「真實」分貝。如果被測試的sproc有副作用(即執行一些CUD操作)會發生什麼? – cs0815

+0

你是對的,不需要TearDown腳本 - 每個測試都在事務內部執行,在測試結束時回滾(無論是否通過),因此任何數據更改都會回滾(這是可能的從測試中故意執行此事務之外的操作,但這是默認情況下不會發生的更高級操作)。這也意味着運行測試的順序並不重要,因爲所有測試都將從相同的數據庫狀態開始。 – DaveGreen