Share via


在資料庫單元測試中使用測試條件

在典型的「資料庫單元測試」(Database Unit Test) 中,會執行 Transact-SQL「測試指令碼」(Test Script) 並傳回 ExecutionResult 類別的執行個體。 這個類別的執行個體會包含 DataSet、執行時間以及受指令碼影響的資料列。 這些資訊都會在指令碼執行期間收集。您可以在 Transact-SQL 指令碼內使用 RAISERROR 函式來評估這些結果,也可以使用測試條件來評估這些結果。 Visual Studio Premium 提供一組預先定義的測試條件讓您使用。

預先定義的測試條件

下表列出預先定義的測試條件,您可以使用資料庫單元測試設計工具的 [測試條件] 窗格加入這些測試條件。

測試條件

測試條件說明

資料總和檢查碼

如果 Transact-SQL 指令碼所傳回結果集的總和檢查碼與預期的總和檢查碼不符,則失敗。 如需詳細資訊,請參閱指定資料總和檢查碼。

注意事項注意事項
如果傳回的資料將因測試回合而變更,則不建議使用此測試條件。例如,如果結果集包含產生的日期或時間,或包含識別資料行,則測試會因為每個回合的總和檢查碼不同而失敗。

空白 ResultSet

如果 Transact-SQL 指令碼傳回的結果集不是空白,則失敗。

執行時間

如果 Transact-SQL 測試指令碼執行時間超出預期,則失敗。 預設執行時間為 30 秒。

執行時間只適用於測試指令碼,不適用測試前指令碼或測試後指令碼。

預期的結構描述

如果結果集的資料行和資料型別不符合為測試條件指定的資料行和資料型別,則失敗。 您必須透過測試條件的屬性來指定結構描述。 如需詳細資訊,請參閱指定預期的結構描述。

結果不明

永遠會產生結果不明的測試。 這是會加到每一個測試中的預設條件。 包含這個測試條件的目的,是要指出尚未實作測試驗證。 當您已經加入其他測試條件之後,請從您的測試中刪除這個測試條件。

非空白 ResultSet

如果結果集是空的,即會失敗。 您可以在測試指令碼中使用這個測試條件,或使用 EmptyResultSet 搭配 Transact-SQL @@RAISERROR 函式,測試更新是否正常運作。 例如,您可以儲存更新前的值、執行更新、比較更新後的值,然後如果沒有得到預期的結果,便會引發錯誤。

資料列數

如果結果集沒有包含預期的資料列數,即會失敗。

純量值

如果結果集中的特定值不等於指定值,即會失敗。 預設 [需要的值] 為 null。

注意事項注意事項

[執行時間] 測試條件會指定 Transact-SQL 測試指令碼執行的時間限制。 如果超過此時間限制,測試就會失敗。 測試結果也會包含 [持續期間] 統計資料,這與 [執行時間] 測試條件不同。 [持續期間] 統計資料不只包含執行時間,也包含兩次連接資料庫的時間、執行任何其他測試指令碼的時間 (例如測試前和測試後指令碼),以及執行測試條件的時間。 因此,即使持續期間超過執行時間,測試也會通過。

報告的 [持續期間] 不包括產生資料和部署結構描述所用的時間,因為這些動作是在測試執行之前發生。 若要檢視測試持續期間,請在 [測試結果] 視窗中選取測試回合,按一下滑鼠右鍵,然後選擇 [檢視測試結果詳細資料]。

您可以使用資料庫單元測試設計工具的 [測試條件] 窗格,將測試條件加入資料庫單元測試。 如需詳細資訊,請參閱 HOW TO:將測試條件加入到資料庫單元測試

您也可以直接編輯測試方法程式碼,加入更多的功能。 如需詳細資訊,請參閱HOW TO:開啟要編輯的資料庫單元測試HOW TO:撰寫會在單一交易範圍中執行的資料庫單元測試。 例如,您可以加入 Assert 陳述式,將功能加入測試方法。 如需詳細資訊,請參閱在資料庫單元測試中使用 Transact-SQL 判斷提示

預期的失敗

您可以建立資料庫單元測試,測試不應成功的行為。 這些預期的失敗有時稱為負面測試。 一些範例如下:

  • 確認刪除客戶資料的預存程序會在指定的客戶 ID 無效時失敗

  • 確認要履行訂單的預存程序會在訂單從未開出或已經履行時失敗

  • 確認取消訂單的預存程序無法取消已完成的訂單或已取消的訂單

您可以為擲回預期 SQL 例外狀況的預存程序定義資料庫單元測試。 您可以在單元測試方法中加入屬性,指出有哪個或哪些預期的例外狀況。 如此即可防止測試在發生例外狀況時失敗。

若要使用預期的例外狀況來標示資料庫單元測試方法,請加入下列屬性:

[ExpectedSqlException(MessageNumber = nnnnn, Severity = x, MatchFirstError = false, State = y)]

其中:

  • nnnnn 是預期的訊息編號,例如 14025

  • x 是預期的例外狀況嚴重性

  • y 是預期的例外狀況狀態

任何未指定的參數都會被忽略。 您可以將這些參數傳遞至資料庫程式碼中的 RAISERROR 陳述式。 如果指定 MatchFirstError = false,此屬性會符合例外狀況中的任何 SqlErrors。 預設行為 (MatchFirstError = true) 是只符合第一個發生的錯誤。

如需如何使用預期的例外狀況和負面資料庫單元測試的範例,請參閱逐步解說:建立和執行資料庫單元測試

指定資料總和檢查碼

在資料庫單元測試中加入 [資料總和檢查碼] 測試條件之後,必須使用下列程序來設定預期的總和檢查碼:

若要指定預期的總和檢查碼

  1. 在測試條件清單中,按一下要指定總和檢查碼的 [資料總和檢查碼] 測試條件。

  2. 按 F4 開啟 [屬性] 視窗。 您也可以開啟 [檢視] 功能表,然後按一下 [屬性] 視窗。

  3. (選擇性) 您可以將測試條件的 [(名稱)] 屬性變更為更有描述性。

  4. 在 [組態] 屬性中,按一下瀏覽 (...) 按鈕。

    [TestConditionName 的組態] 對話方塊隨即出現。

  5. 指定要測試之資料庫的連接。 如需詳細資訊,請參閱 HOW TO:建立資料庫連接

  6. 根據預設,測試的 Transact-SQL 主體會出現在編輯窗格中。 您可以視需要修改程式碼以產生預期的結果。 例如,如果您的測試有測試前程式碼,可能必須加入該程式碼。

    重要事項重要事項

    如果針對先前已指定總和檢查碼的總和檢查碼條件進行修改,在編輯窗格中所做的任何變更都不會儲存。 您必須重新進行變更,然後按一下 [擷取]。

  7. 按一下 [擷取]。

    如此隨即針對指定的資料庫連接執行 Transact-SQL,而且結果會出現在對話方塊中。

  8. 如果結果符合預期的測試結果,請按一下 [確定]。 否則請修改 Transact-SQL 主體並重複步驟 6、7 和 8,直到結果符合預期為止。

    測試條件的 [] 資料行會顯示預期的總和檢查碼值。

指定預期的結構描述

在資料庫單元測試中加入 [預期的結構描述] 測試條件之後,必須使用下列程序來設定預期的結構描述:

若要指定預期的結構描述

  1. 在測試條件清單中,按一下要指定結構描述的 [預期的結構描述] 測試條件。

  2. 按 F4 開啟 [屬性] 視窗。 您也可以開啟 [檢視] 功能表,然後按一下 [屬性] 視窗。

  3. (選擇性) 您可以將測試條件的 [(名稱)] 屬性變更為更有描述性。

  4. 在 [組態] 屬性中,按一下瀏覽 (...) 按鈕。

    [TestConditionName 的組態] 對話方塊隨即出現。

  5. 指定要測試之資料庫的連接。 如需詳細資訊,請參閱 HOW TO:建立資料庫連接

  6. 根據預設,測試的 Transact-SQL 主體會出現在編輯窗格中。 您可以視需要修改程式碼以產生預期的結果。 例如,如果您的測試有測試前程式碼,可能必須加入該程式碼。

    重要事項重要事項

    如果針對先前已指定結構描述之預期的結構描述條件進行修改,在編輯窗格中所做的任何變更都不會儲存。 您必須重新進行變更,然後按一下 [擷取]。

  7. 按一下 [擷取]。

    如此隨即針對指定的資料庫連接執行 Transact-SQL,而且結果會出現在對話方塊中。 因為您要確認結果集的結構描述 (或圖案) 而不是結果值,所以只要資料行如預期顯示,就不需檢視傳回的任何結果資料。

  8. 如果結果符合預期的測試結果,請按一下 [確定]。 否則請修改 Transact-SQL 主體並重複步驟 6、7 和 8,直到結果符合預期為止。

    測試條件的 [] 資料行會顯示預期的結構描述資訊。 例如,它可能會顯示 "Expected: 2 tables"。

可延伸測試條件

除了六個預先定義的測試條件,您也可以自行撰寫新的測試條件。 這些測試條件會顯示在資料庫單元測試設計工具的 [測試條件] 窗格中。 如需詳細資訊,請參閱 HOW TO:建立資料庫單元測試設計工具的測試條件

請參閱

概念

在資料庫單元測試中使用 Transact-SQL 判斷提示

資料庫單元測試中的指令碼