資料庫單元測試中的指令碼
每一個「資料庫單元測試」(Database Unit Test) 都會包含單一測試前動作、測試動作和測試後動作。 每一個動作都包含以下項目:
在資料庫上執行的 Transact-SQL 指令碼
會評估指令碼執行所傳回之結果的零或多個測試條件。
測試動作中的 Transact-SQL「測試指令碼」(Test Script) 是您必須包含在每一個「資料庫單元測試」(Database Unit Test) 中的唯一元件。 除了測試指令碼本身之外,您可能也會想要指定測試條件,以驗證該測試指令碼是否傳回所預期的值或值集合。測試動作會運用或變更該資料庫中的特定物件,然後再評估該項變更。
您可以針對每一個測試動作,加入一個測試前動作和一個測試後動作。 就像測試動作一樣,每一個測試前動作和每一個測試後動作都會包含一個 Transact-SQL 指令碼及零或多個測試條件。 您可以使用測試前動作來確保此資料庫所在的狀態可讓您的測試動作執行及傳回有意義的結果。例如,您可以先使用測試前動作來驗證資料表有包含資料,然後測試指令碼才會在這些資料上執行作業。 當測試前動作準備好資料庫且測試動作傳回有意義的結果之後,測試後動作會讓資料庫回到執行測試前動作之前的狀態。在某些情況下,您可使用測試後動作來驗證測試動作的結果, 這是因為測試後動作的資料庫權限可以大於測試動作的權限。 如需詳細資訊,請參閱 連接字串與權限概觀。
除了這三個動作以外,也有兩個測試指令碼 (稱為通用指令碼) 會在執行資料庫單元測試的前後來執行。 因此,在單一資料庫單元測試的執行期間,最多可以有五個 Transact-SQL 指令碼在執行。 但是,只有測試動作內所含的 Transact-SQL 指令碼才是必要的,通用指令碼及測試前和測試後動作指令碼都是選用的。
下表將提供與任何資料庫單元測試有關的完整指令碼清單。
動作 |
指令碼型別 |
說明 |
---|---|---|
TestInitialize |
通用指令碼 (初始化) |
(選用) 這個指令碼會在單元測試中所有測試前和測試動作的前面。 TestInitialize 指令碼會在給定測試類別中的每一個單元測試之前執行, 這個指令碼會使用授權的內容來執行。 |
測試前 |
測試指令碼 |
(選用) 此指令碼是單元測試的一部分。 測試前指令碼會在單元測試內的測試動作之前執行, 這個指令碼會使用授權的內容來執行。 |
測試 |
測試指令碼 |
(必要) 此指令碼是單元測試的一部分。 「測試指令碼」(Test Script) 會針對資料庫執行。 例如,此指令碼可執行預存程序來取得、插入或更新資料表值。 這個指令碼會使用執行內容來執行。 |
測試後 |
測試指令碼 |
(選用) 此指令碼是單元測試的一部分。 測試後指令碼會在個別單元測試之後執行, 這個指令碼會使用授權的內容來執行。 |
TestCleanup |
通用指令碼 (清除) |
(選用) 此指令碼會跟隨在單元測試之後。 TestCleanup 指令碼會在給定測試類別中的所有單元測試之後執行, 這個指令碼會使用授權的內容來執行。 |
如需每一個指令碼執行所在之不同安全性內容的詳細資訊,請參閱連接字串與權限概觀及 Visual Studio 資料庫功能的必要權限中的資料庫單元測試權限的章節。
指令碼的執行順序
了解每一個指令碼的執行順序是很重要的一件事。 雖然您不能變更該順序,但是可以決定所要執行的指令碼。 以下的說明包含了您可以在測試回合中使用的指令碼選擇 (此測試回合包含兩個資料庫單元測試) 並顯示其執行的順序:
注意事項 |
---|
資料產生和資料庫部署的變更會在測試回合的一開始套用 (在執行任何指令碼之前)。 會使用授權的內容連接字串來套用這些變更。 如需詳細資訊,請參閱 HOW TO:設定資料庫單元測試執行。 |
初始化和清除指令碼
在資料庫單元測試設計工具中,TestInitialize 和 TestCleanup 指令碼稱為通用指令碼。 之前的範例假設這兩個單元測試屬於相同測試類別的一部分; 因此,這兩者會共用相同的 TestInitialize 和 TestCleanup 指令碼。 單一測試類別中的所有單元測試都一定是這個情形; 但是,如果您的測試回合包含了不同測試類別的單元測試,則會在執行單元測試的前後,執行關聯測試類別的通用指令碼。
如果您只使用資料庫單元測試設計工具來撰寫單元測試,您可能會不太熟悉測試類別的概念。 每當您開啟 [測試] 功能表並按一下 [新增測試] 來建立單元測試時,Visual Studio Premium就會產生測試類別。 測試類別會出現在 [方案總管] 中,其中包含您所指定的測試名稱,後面加上 .cs 或 .vb 副檔名。 在每一個測試類別中,個別的單元測試會儲存為測試方法。 但是,不論測試方法 (也就是單元測試) 的數目為何,每一個測試類別都可以有零或一個 TestInitialize 和 TestCleanup 指令碼。
您可以使用 TestInitialize 指令碼來準備測試資料庫,並使用 TestCleanup 指令碼讓測試資料庫回到已知的狀態。 例如,您可以使用 TestInitialize 來建立 Helper 預存程序,此預存程序之後會在測試指令碼中執行,以便測試另一個預存程序。
測試前和測試後指令碼
與測試前和測試後動作有關的指令碼有可能會因為不同的單元測試而有所不同。 您可以使用這些指令碼來建立資料庫的累加變更,然後再清除這些變更。